我把常用关键字分为以下几种:1,访问限制修饰符;2,类,方法,变量修饰符;3,调用类型关键字;4工具类型的关键字
访问限制修饰符访问级别共有四种:public(全部可见),protected(本包所有类和跨包子类可见),default(本包所有类可见),private(仅对本类可见)。
对于类、变量、方法,其实修饰符有不同的选择方式:
类的访问修饰符
访问限制修饰符对内部类和外部类不同的支持
对于外部类来说,只有两种修饰,public和默认(default),因为外部类放在包中,只有两种可能,包可见和包不可见。外部类只能用public, abstract 和 final 修饰,因为外部类放在包中,只有两种可能,包可见和包不可见(2种访问权限)
对于内部类来说,可以用所有的修饰,因为内部类放在外部类中,与成员变量的地位一致,所以有四种可能。内部类则可以用 修饰成员变量的修饰符修饰内部类,比如 private,static, protected ,public和默认的default修饰。
成员变量的访问修饰符
方法的访问修饰符
需要注意的是protected,如果在子类的方法中new一个父类出来,再用父类变量去调用方法还是会报错
abstract和static,final是互斥的,static和final是可以连用的而且abstract不能用private、static、synchronized、native、final访问修饰符修饰。
类 | 变量 | 方法 | 静态代码块 | 代码块 | |
---|---|---|---|---|---|
abstract | 抽象类被修饰为abstract | 抽象方法被修饰为abstact(与native互斥) | |||
native | 本地方法被修饰为native(与abstract互斥) | ||||
final | 封闭类被修饰为final(与abstract互斥) | 基本类型被修饰后为常量,引用类型被修饰后地址不可变 | 方法被修饰后不可被重写(与abstract互斥) | ||
static | 只有静态内部类才能被修饰(与abstract互斥) | 被修饰后为静态变量 | 被修饰后为静态方法(与abstract互斥) | 被修饰后为静态代码块 | |
synchronized | 被修饰后为同步类(与abstract互斥) | 被修饰后为同步方法(与abstract互斥) | 被修饰后为同步静态代码块 | 被修饰后为同步代码块 |
abstract修饰的类叫做抽象类,abstract修饰的方法叫做抽象方法:
其实很好理解,abstract修饰的类或方法生来就是要被实现或扩展以实现多态的,所以一切阻挠它的final、static、private
这些关键字都不能使用,并且由于抽象的类或方法不能直接使用,所以synchronized、native
也不能与它连用。
final具有不可改变的含义,它可以修饰非抽象类,非抽象成员方法和变量
虽说final的方法不能被覆盖,但以下这种情况可以写一样的:
class Car extends Vehicle
{public static void main (String[] args){new Car(). run();}private final void run(){System. out. println ("Car");}
}
class Vehicle
{private final void run(){System. out. println("Vehicle");}
}
首先final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。但这里如果是public修饰符就会报编译错误,因为编译器认为子类在试图覆写一个父类的final修饰的方法。
当变量被final修饰的时候需要遵循:
准确的说blank final必须在初始化的时候赋一个初始值。
我们经常会碰到这样一组关键字对比final,finally,finalize,尽管他们很像,但其实是做不同的事:
可以顺带记住这三个关键字的使用区别。
static修饰的变量可以先不初始化,常常修饰静态变量、静态方法和静态块
static作用于静态类
如果一个类要被声明为static的,只有一种情况,就是静态内部类。如果在外部类声明为static,程序会编译都不会过。
static作用于静态变量
static作用于静态方法
static作用于静态代码块
public static void main(String args[]) {}
程序入口方法,可以被final修饰,也可以被synchronized修饰,static有如下使用的注意事项:
是否可以在static环境中访问非static变量?
static静态方法能不能引用非静态资源?
static静态方法里面能不能引用静态资源?
非静态方法里面能不能引用静态资源?
native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。
也就是native就是修饰外部具体实现的方法,和没有实现的方法互斥
调用类型关键字调用类型关键字有两个,分别为super和this
在类的构造方法中,通过super语句调用这个类的父类的构造方法。在构造方法中,super语句必须作为构造方法的第一条语句。
访问父类相关方法时需要用到,应用场景如下:
需要注意super关键字只能指代直接父类,不能指代父类的父类。
this关键字用来指向当前实例对象,通常用于成员变量和局部变量重名的时候需要用this来区分成员变量和局部变量,当成员变量和局部变量不能区别时用优先就近的原则。
工具类型关键字主要介绍instanceof和switch两个关键字
它的作用是判断一个引用类型的变量所指向的实例是否是一个类(接口,抽象类,父类)的实例,常见用法:result = object instanceof class
返回一个boolean类型的值
package test;
class Base{}
class Child extends Base{}
class Grandchild extends Child{}
class TT {}
public class Singleton{public static void main(String[] args) {Grandchild g = new Grandchild();if (g instanceof Base) {System.out.println("TRUE");}else{System.out.println("FALSE");}if (g instanceof Child) {System.out.println("TRUE");}else{System.out.println("FALSE");}}
}
也可以判断自己父类的父类是不是满足,换言之,该方法可以向上穿透寻找父类
switch语句用于多分支选择,使用switch(expr)时,expr只能是一个枚举常量(内部是整型或字符类型)或一个整数表达式。
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型作为条件。在Java7中,呼吁很久的String支持也终于被加上了。
public class StringForSwitch {public void test_string_switch() {String result=""; switch ("doctor") {case "doctor":result = "doctor";break;default:break;}}
}
反编译后的,还原成大致的Java的代码如下:
public class StringForSwitch {public StringForSwitch() {}public void test_string_switch() {String result = "";String var2 = "doctor";switch("doctor".hashCode()) {case -1326477025:if(var2.equals("doctor")) {result = "doctor";}default:break;}}
}
可以看出,字符串类型在switch语句中利用hashcode的值与字符串内容的比较来实现的;但是在case字句中对应的语句块中仍然需要使用String的equals方法来进一步比较字符串的内容,这是因为哈希函数在映射的时候可能存在冲突,switch关键字使用注意
以上就是Java中的一些常用关键字对比,希望能帮助到大家