在子类中不能通过父类对象实例来访问父类的protected属性和方法
程序员文章站
2024-02-20 14:29:58
...
四种修饰符的作用域
java中变量、方法和类有四种修饰符public,protected,default,private,它们的作用域范围如下:
- public: 拥有最大的权限,可以在本项目中的任意类中访问
- protected: 可以在本包下和其子类访问(本包子类或其他包的子类)
- default: 本包下的当前类和其他类可以访问
- private: 只能在当前类下访问
访问修饰符 | 当前类 | 同一包 | 子类(不同包) | 其他包 |
---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
default | ✔️ | ✔️ | ❌ | ❌ |
private | ✔️ | ❌ | ❌ | ❌ |
测试
先声明一个父类
package com.parent;
public class Animal {
public int id = 0;
protected String name = "animal";
String color = "white";
private int age = 2;
public Animal(int id, String name, String color, int age) {
this.id = id;
this.name = name;
this.color = color;
this.age = age;
}
public Animal() {
}
}
1.在本包下测试
package com.parent;
public class TestAnimal1 {
public static void main(String[] args) {
Animal animal = new Animal(1,"animal1","black",3);
System.out.println(animal.id); //public
System.out.println(animal.name); //protected
System.out.println(animal.color); //default
System.out.println(animal.age); //private 编译失败,说明即使相同包,private修饰的变量也不能在其他类中访问
}
}
2.在不同包下测试
package com.child;
import com.parent.Animal;
public class TestAnimal2 {
public static void main(String[] args) {
Animal animal = new Animal(1,"animal1","black",3);
System.out.println(animal.id); //public 可以正常访问
System.out.println(animal.name); //protected 编译失败
System.out.println(animal.color); //default 编译失败
System.out.println(animal.age); //private 编译失败
}
}
可以看到,在不同包下的其他类中,只能访问public修饰的变量
3.在不同包下的子类(因相同包下的子类和情况1相同,不再讨论)
package com.child;
import com.parent.Animal;
public class Bird extends Animal {
public static void main(String[] args) {
Bird bird = new Bird();
System.out.println(bird.id); //public
System.out.println(bird.name); //protected ,编译成功,说明protected 是可以在不同包下的子类访问的
System.out.printf(bird.color); //default 编译失败
System.out.println(bird.age); //private 编译失败
}
}
现在,我把上边的前两行代码稍微修改一下
Animal animal = new Animal(); //创建了一个父类对象的实例
System.out.println(animal.name); //此时用protected修饰的name,是访问不到的
可以看到,我在子类Bird中,创建了一个父类Animal的实例,去访问父类的protected属性,会访问不到
可以看到只能点出来用public修饰的id属性,由此可以得出,在不同包的子类去访问父类的protected属性是有一定限制的.
那我在当前子类创建另外一个子类的对象,能不能访问父类的protected属性呢?
可以做一个测试,先创建一个子类Cat继承Animal
package com.child;
import com.parent.Animal;
public class Cat extends Animal {
}
同样的在子类Bird中创建Cat实例,可以看到同样的只能访问父类的id属性,
protected使用总结:
1.在子类中可以通过子类对象来访问父类的protected属性和方法
2.在子类中不能通过父类对象来访问父类的protected属性和方法
3.在子类中不能通过其他子类的对象来访问父类的protected属性和方法