1.访问修饰符介绍
Java中访问权限修饰符可以修饰类的属性、方法和内部类对于其他类的可访问性。一般情况下,源文件中只有一个类,而这个类只能是public或default(无修饰符)修饰。
权限修饰符 | 释义 | 同一个类 | 同一个包 | 子类 | 所有类 |
public | 公共的 | √ | √ | √ | √ |
protected | 受保护的 | √ | √ | √ | |
default | 默认的 | √ | √ | ||
private | 私有的 | √ |
public 表示公共的,可以被该项目下的所有包中的任意类所访问。
protected 表示受保护的,可以被同一个包中的所有类所访问,也可以被其子类访问。(下文重点讲解)
default 表示默认的,即没有任何访问修饰符修饰的情况,可以被同一个包中的所有类所访问。
private 表示私有的,只能在自己类中被访问,其他类不能访问。
上文的访问指的是通过对象调用其内部的属性或方法,在其他类是否可见(可访问)的问题。
2.继承关系中第三方类和子类访问父类的情况
2.1 父类和子类、第三方类在同包的情况
父类代码如下:
package com.test;
public class A {
private String aPrivate;
String aDefault;
protected String aProtected;
public String aPublic;
}
子类代码如下:
package com.test;
public class B1 extends A {
public void test(){
/**
* 子类和父类在同包情况下,可以访问父类中除private修饰的属性和方法
*/
this.aDefault = "";
this.aProtected = "";
this.aPublic = "";
}
}
要点1: 子类和父类在同包情况下,子类可以访问父类中除了private修饰的属性和方法。
第三方类代码如下:
package com.test;
public class C {
public static void main(String[] args) {
/**
* 第三方类和父类包在同一个包的情况下,父类中除了private修饰的方法和属性
*/
A a = new A();
a.aDefault = "";
a.aProtected = "";
a.aPublic = "";
/**
* 第三方类和父类以及子类在同一个包的情况下,可以通过子类获取父类中除了private修饰的方法和属性
*/
B1 b = new B1();
b.aPublic = "";
b.aProtected = "";
b.aPublic = "";
}
}
要点2:第三方类和父类在同一个包的情况下,可以通过父类对象直接调用除了private修饰的所有方法和属性。
要点3:第三方类和父类以及子类在同一个包的情况下,可以通过子类获取父类中除了private修饰以外所有属性和方法。
2.2 父类和第三方类在同一个包中,子类在另外一个包中
父类代码如上文。
子类代码如下:重点关注子类包的声明
package com.test.ABC;
import com.test.A;
public class B2 extends A {
public void test(){
/**
* 子类和父类不在同包的情况下,子类只能使用父类中public和protected修饰的属性和方法
*/
this.aProtected ="";
this.aPublic = "";
}
}
要点4:子类和父类不在同包的情况下,子类只能在其内部使用父类的public和protected修饰的所有属性和方法。
第三方类代码如下:
package com.test;
import com.test.ABC.B2;
public class C {
public static void main(String[] args) {
/**
* 第三方类和父类在同一个包中,和子类不在同一个包中,第三类中可以通过子类对象获取到父类中protected和public修饰的方法和属性
*/
B2 b2 = new B2();
b2.aProtected = "";
b2.aPublic = "";
}
}
要点5:第三方类和父类在同一个包中,和子类不在同一个包中,第三方类可以通过子类对象获取父类中public和protected修饰的所有属性和方法。
2.3 第三方类和子类在同一个包中,与父类不在同一个包中的情况
父类代码和子类代码如上文。
第三方类的代码如下:
package com.test.ABC;
import com.test.A;
import com.test.B1;
public class C1 {
public static void main(String[] args) {
/**
* 父类和子类在同一个包中,第三方类和父类、子类不在同一个包中,此时通过子类对象或父类对象只能访问public修饰的属性和方法
*
*/
B1 b = new B1();
b.aPublic = "";
A a = new A();
a.aPublic ="";
/**
* 父类和子类、第三方类不在同一个包中时,在第三方类中只能通过子类对象访问父类中public修饰的属性和方法
*/
B2 b2 = new B2();
b2.aPublic = "";
}
}
要点6:子类和第三方类在同一包中,父类与其不在同一个包中是,在第三类中只能通过子类对象访问父类的public修饰的属性和方法。此时子类继承的protected修饰的属性和方法类似于在子类中用private修饰该属性和方法。
要点7:父类和子类在同一包中时,第三方类和父类以及子类不在同一个包中时,此时通过父类对象或者子类对象都只能访问父类对象中public修饰的属性和方法。
3 总结
结论1:父类、子类以及第三方类在同一个包中时,可以通过子类或者父类对象访问父类中除了private修饰以外的所有属性和方法。
结论2:父类和子类不在同一个包中时,无论第三方类在何处(除与父类同包),第三方类通过子类对象只能访问父类中的public修饰的属性和方法。此时子类继承的protected修饰的属性和方法类似于在子类中用private修饰的属性和方法。
结论3:父类和子类无论是否在同一个包中,在子类中都可以访问到protected和public修饰的属性和方法,如果在同包中,子类可以访问父类的default修饰的属性和方法,反之,则不能访问。
结论4(特例):父类和第三方类同包,但父类和子类不同包时,在第三方类中可以通过子类对象获取到父类中protected和public修饰的方法和属性