本文共 3861 字,大约阅读时间需要 12 分钟。
1、访问控制权限修饰符可以修饰什么?
属性(四个都能) 方法(四个都能) 类(public 和默认能都) public class A 和 class A protected 和 private 不允许能用在类 接口()2、重写的访问权限的范围(从小到大) (下面这个子类特指是属性自身类的子类,要继承父类然后才能访问父类属性)
一、public
(1)定义:public是公共的,被public所修饰的成员可以在任何类中都能被访问到。(2)修饰的成分:
【1】public能用来修饰类,在一个java源文件中只能有一个类被声明为public,而且一旦有一个类为public,那这个java源文件的文件名就必须要和这个被public所修饰的类的类名相同,否则编译不能通过。 【2】说到这里,穿插多一点知识。 ①一个类作为外部类的时候只能被public或者默认访问修饰符所修饰, ②但是一个类如果作为内部类的时候,则可以被四种访问修饰符所修饰,因为一个类作为内部类的时候,就作为外部类的一个成员属性了,因此可以有四种访问修饰符修饰,这是内部类和外部类的一个区别。 String name ; private class User{ (实例内部类,不报错) }private class User{ (外部类,报错)
}【3】public用来修饰类中成员(变量和方法),被public所修饰的成员可以在任何类中都能被访问到。通过操作该类的对象能随意访问public成员。
public在类的继承上的体现,被public所修饰的成员能被所有的子类继承下来。
二、protected
(1)定义:protected是受保护的,受到该类所在的包所保护。(2)作用域:被protected所修饰的成员会被位于同一package中的所有类访问到。同时,被protected所修饰的成员也能被该类的所有子类继承下来。(注意:这里是指同一个package或者不同的package中的子类都能访问)
三、friendly/default(默认,缺省的)
(1)定义:friendly是友好的,即在成员的前面不写任何的访问修饰符的时候,默认就是友好的。所谓友好的,是对同一package的类友好。
(2)作用域:同一package中的所有类都能访问。被friendly所修饰的成员只能被该类所在同一个package中的子类所继承下来。(也就是说只有在同一个package中的子类才能访问到父类中friendly修饰的成员)
四、private (封装常用)
(1)定义:private是私有的,即只能在当前类中被访问到,它的作用域最小。①同包自身类访问权限:
(四种权限都能访问)package com.bjpowernode03.javaSE.访问权限1;import com.bjpowernode.javaSE.包和导包机制.package和import使用例子; //在包机制下得import导入包+类名,才可以直接访问其他包的类对象public class 同包自身类访问权限 { String name ; private class User{ } private int id; protected boolean gender; public double moneybalance; public static void main(String[] args) { package和import使用例子 p1 = new package和import使用例子(); p1.dosome(); //经过测试访问权限全部都可以在同包属性自身类中访问; 同包自身类访问权限 f1 = new 同包自身类访问权限(); System.out.println(f1.name); System.out.println(f1.gender); System.out.println(f1.id); System.out.println(f1.moneybalance); }}
②同包其他类中访问权限测试:
只有protected 和 public 和 默认default可以在同包其他类中访问package com.bjpowernode03.javaSE.访问权限1;public class 同包其他类中访问权限测试 { public static void main(String[] args) { 同包自身类访问权限 f2 = new 同包自身类访问权限(); //经过测试,protected 和 public 和 默认default可以在同包其他类中访问 System.out.println(f2.gender); System.out.println(f2.moneybalance); System.out.println(f2.name);// System.out.println(f2.id); }}
③非同包子类权限测试:
只有protected ,public可以访问package com.bjpowernode04javaSE.访问权限2;import com.bjpowernode03.javaSE.访问权限1.同包自身类访问权限;//导入访问控制权限包名public class 非同包子类访问权限测试 { public static void main(String[] args) { 同包自身类访问权限 c1 = new 同包自身类访问权限(); c1.moneybalance = 12346; //public可以随意访问// c1.name = "林瑞仪"; default出了包就不认识了// c1.id = 123; 报错private私有出了自身类无法访问// c1.gender; 报错,protected gender不能在非同包非子类中访问。 }}//定义一个非同包子类,下面这个子类特指是属性自身类的子类,要继承父类然后才能访问父类属性class protected权限测试 extends 同包自身类访问权限 { //这里protected权限测试类 是非同包的子类 public void doit(){ //经过测试,非同包子类权限只有protected ,public可以访问 this.moneybalance = 12345; this.gender = true; //this表示当前protected权限测试类的对象 }}
④非同包非子类访问权限测试:
只有public能访问到package com.bjpowernode04javaSE.访问权限2;import com.bjpowernode03.javaSE.访问权限1.同包自身类访问权限;public class 非同包非子类访问权限测试 { public static void main(String[] args) { 同包自身类访问权限 f3 = new 同包自身类访问权限(); //经过测试, 在非同包非子类访问权限测试,只有public能访问到 System.out.println(f3.moneybalance); //// System.out.println(f3.id);// System.out.println(f3.name);// System.out.println(f3.gender); }}
访问权限注意点:
1、覆盖的方法访问权限不能变低,可以更高。(即子类方法的访问权限得和父类一样或者更开放)原因: 【1】(先记住这个和多态的实现有关,比如子类覆盖方法中的权限public变为protected 则访问权限就会更低了,也就无法直接通过父类引用去多态进入到子类的方法,因为多态时,编译器会先去父类静态找到父类方法,找到了编译就通过然后才在运行时去动态去进入子类的方法。 【2】多态中,子类对象可以被当成父类对象使用。比如这样A a = new B(),B子继承了A父,假设现在重写A父类public方法s(),如果在B中变为了private/protected私有方法,那么调用a.s()会发生什么?会无法被调用,权限变低了。因为私有方法无法直接访问,也就无法实现多态了 【3】通俗说:Java希望儿子一代更比一代强, 没有说越传越差的 只有更好。 2、覆盖之后的方法,不能throws抛出更多的异常,只能更少。转载地址:http://tpke.baihongyu.com/