1.访问权限修饰符
访问权限分四种级别:
公开级别:用public修饰,对外公开。
受保护级别:用protected修饰,向子类及同一个包中的类公开。
默认级别:没有访问权限修饰符,向同一个包中的类公开。
私有级别:用private修饰,只有类本身可以访问,不对外公开。
下图总结
访问级别 | 访问权限修饰符 | 同类 | 同包 | 子类 | 不同的包 |
公开 | public | √ | √ | √ | √ |
受保护 | protected | √ | √ | √ | — |
默认 | 无 | √ | √ | — | — |
私有 | private | √ | — | — | — |
2.abstract修饰符
abstract修饰符可用来修饰类和成员方法:
1)用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化,即不允许创建抽象类本身的实例。没有用abstract修饰的类称为具体类,具体类可以被实例化。
2)用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。没有用abstract修饰的方法称为具体方法,具体方法具有方法体。
使用abstract修饰符需要遵守以下语法规则:
1)抽象类可以没有抽象方法,但包含抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须定义为抽象类,否则编译出错。
abstract class Base{ abstract void method1(); abstract void method2(); } class Sub extends Base{//编译出错,Subject类必须定义为抽象类 void method1(){ System.out.println("method1"); } }
2)没有抽象静态方法,static和abstract关键字是势不两立的冤家,不能在一起使用。
abstract class Base{ static abstract void method1();//编译出错,static和abstract修饰符不能连用 abstract void method2();//合法,抽象类中可以有静态方法 }
3)抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。
abstract class Base{} class Sub extends Base{ public static void main(String[] args) { Base base1=new Base();//编译出错,不能创建抽象类Base的实例 Base base2=new Sub();//合法,可以创建具体类Sub的实例 } }
4)抽象类及抽象方法不能被final修饰符修饰。abstract修饰符与final修饰符不能连用,因为抽象类只允许创建其子类,它的抽象方法才能被实现,并且只有它的具体子类才能被实例化,而用final修饰的类不允许拥有子类,用final修饰的方法不允许被子类的方法覆盖,因此把abstract修饰符与final修饰符连用,会导致自相矛盾。
abstract final class Base{}//编译出错,abstract修饰符与final修饰符不能连用 abstract class Base2{ final abstract void method1();//编译出错,abstract修饰符与final修饰符不能连用 final void method2(){}//合法,在抽象类中可以拥有final类型的具体方法 }
5)抽象方法不能被private修饰符修饰。因为如果方法是抽象的,表示父类只声明具备某种功能,但没有提供实现。这种方法有待于某个子类去实现它。父类中的abstract方法必须让子类是可见的。否则,在父类中声明一个永远无法实现的方法时无意义的。
3.final修饰符
final具有“不可改变的”含义,它可以修饰非抽象类,非抽象成员方法和变量:
1)用final修饰的类不能被继承,没有子类。
2)用final修饰的方法不能被子类的方法覆盖。
3)用final修饰的变量表示常量,只能被赋一次值。
final不能用来修饰构造方法,因为“方法覆盖”这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖关系,因此用final修饰构造方法时无意义的。父类中用private修饰的方法不能被子类的方法覆盖,因此private类型的方法默认时final类型的。
4.static修饰符
static修饰符可以用来修饰类的成员变量,成员方法和代码块:
1)用static修饰的成员变量表示静态变量,可以直接通过类名来访问。
2)用static修饰的成员方法表示静态方法,可以直接通过类名来访问。
3)用static修饰的程序代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块。
被static所修饰的成员变量和成员方法表明归某个类所有,它不依赖于类的特定实例,被的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定位到它们。
5.小结
访问权限修饰符
1)public的访问级别最高,其次是protected、默认和private。
2)成员变量和成员方法可以处于4个访问级别中的一个。
3)顶层类可以处于公开或默认级别,不能被protected和private修饰。
4)局部变量不能被方法权限修饰符修饰。
abstract修饰符
1)抽象类不能被实例化。
2)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。
3)如果子类没有实现父类中所有的抽象方法,那么子类也必须定义为抽象类。
4)抽象类不能被定义为final和static类型。
5)抽象方法不能被定义为private、final和static类型。
6)没有抽象构造方法。
7)抽象方法没有方法体。
final修饰符
1)用final修饰的类不能被继承。
2)用final修饰的方法不能被子类的方法覆盖。
3)private类型的方法都默认为final方法,因而不能被子类的方法覆盖。
4)final类型的变量必须被显示初始化,并且只能被赋值一次。
static修饰符
1)静态变量在内存中只有一个备份,在类的所有实例中共享。
2)在静态方法中不能直接访问实例方法和实例变量。
3)静态方法中不能使用this和super关键字。
4)静态方法不能被abstract修饰。
5)静态方法和静态变量都可以通过类名直接被访问。
6)当类被加载时,静态代码块只能被执行一次。类中不同的静态代码块按它们在类中出现的顺序被依次执行。
标签:Java,abstract,修饰符,修饰,抽象类,方法,final From: https://blog.csdn.net/xiaojinyu0116/article/details/142066159