详述访问权限
全面研究某个访问权限的使用范围需要从以下方面考虑
访问权限:public>protected>友好的>private
一、public
public是最大的访问权限修饰符,其修饰的成员变量、构造方法和普通方法可在任何一个类中被操作或使用;
二、private
private是最小的访问权限控制符,其修饰的成员变量、构造方法和普通方法只能在定义它们的类中被操作或使用;。
(public和private不在进行实验)
三、友好的
友好的访问权限大于private的访问权限,既然private修饰的属性或方法能在本类中使用,那么友好的修饰的属性或方法在本类中一定也能使用。
①同包继承
package cn.edu.zzu.father;
public class Father {
String name;
void show() {
System.out.println("好好学习");
}
}
package cn.edu.zzu.father;
public class Son extends Father{
public static void main(String[] args) {
Son son = new Son();
son.name = "son";
System.out.println(son.name);
son.show();
Father father = new Father();
father.name = "father";
System.out.println(father.name);
father.show();
}
}
同包继承的情况下,无论是子类还是父类都能够通过创建对象的方式调用被默认也就是友好的修饰的属性或方法。
②同包非继承
package cn.edu.zzu.father;
public class Father {
String name;
void show() {
System.out.println("好好学习");
}
}
package cn.edu.zzu.father;
public class Son {
public static void main(String[] args) {
Father father = new Father();
father.name = "father";
System.out.println(father.name);
father.show();
}
}
在Son类中显然不能通过创建Son对象调用Father类中的对象或方法,但可以通过创建Father对象调用Father类中的对象或方法。
③不同包继承
package cn.edu.zzu.father;
public class Father {
String name;
void show() {
System.out.println("好好学习");
}
}
package cn.edu.zzu.son;
import cn.edu.zzu.father.Father;
public class Son extends Father{
public static void main(String[] args) {
Son son = new Son();
son.name = "son";
System.out.println(son.name);
son.show();
// Father father = new Father();
// father.name = "father";
// System.out.println(father.name);
// father.show();
}
}
不同包继承情况下,子类显然可以通过继承的方式调用继承父类的属性或方法,但不能通过创建父类对象的方式调用父类的属性或方法。
④不同包不继承
package cn.edu.zzu.father;
public class Father {
String name;
void show() {
System.out.println("好好学习");
}
}
package cn.edu.zzu.son;
import cn.edu.zzu.father.Father;
public class Son extends Father{
public static void main(String[] args) {
Son son = new Son();
son.name = "son";
System.out.println(son.name);
son.show();
Father father = new Father();
father.name = "father";
System.out.println(father.name);
father.show();
}
}
程序报错,不同包不继承情况下,在一个类中无法调用另一个类中被默认也称友好的修饰的属性或方法。
四、protected
protected的访问权限大于友好的访问权限,既然在同包的情况下,一个类可以调用另一个类中被友好的修饰的属性或方法,那么在同包的情况下,一个类同样可以调用另一个类中被protected修饰的属性或方法。
①不同包继承
package cn.edu.zzu.father;
public class Father {
protected String name;
protected void show() {
System.out.println("好好学习");
}
}
package cn.edu.zzu.son;
import cn.edu.zzu.father.Father;
public class Son extends Father{
public static void main(String[] args) {
Son son = new Son();
son.name = "son";
System.out.println(son.name);
son.show();
Father father = new Father();
// father.name = "father";
// System.out.println(father.name);
// father.show();
}
}
如果protected修饰的属性和方法均为非静态的,则只能通过子类实例化对象调用其继承过来的属性和方法,而不能使用父类实例化的对象去调用;如果protected修饰的属性和方法均为静态的,则子类可以通过类(子类类名或父类类名)名直接调用。
package cn.edu.zzu.father;
public class Father {
protected static String name;
protected static void show() {
System.out.println("好好学习");
}
}
package cn.edu.zzu.son;
import cn.edu.zzu.father.Father;
public class Son extends Father{
public static void main(String[] args) {
// Son son = new Son();
Son.name = "son";
System.out.println(Son.name);
Son.show();
// Father father = new Father();
Father.name = "father";
System.out.println(Father.name);
Father.show();
}
}
当然也可以通过创建父类对象的方式调用静态的属性和方法,但推荐使用类名调用。
②不同包非集成
package cn.edu.zzu.father;
public class Father {
protected String name;
protected void show() {
System.out.println("好好学习");
}
}
package cn.edu.zzu.son;
import cn.edu.zzu.father.Father;
public class Son {
public static void main(String[] args) {
Son son = new Son();
son.name = "son";
System.out.println(son.name);
son.show();
Father father = new Father();
father.name = "father";
System.out.println(father.name);
Father.show();
}
}
程序将会报错。不同包不继承情况下,在一个类中无法调用另一个类中被protected修饰的属性或方法。