Java中的修饰符

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)当类被加载时,静态代码块只能被执行一次。类中不同的静态代码块按它们在类中出现的顺序被依次执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值