欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在子类中不能通过父类对象实例来访问父类的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属性,会访问不到
在子类中不能通过父类对象实例来访问父类的protected属性和方法
可以看到只能点出来用public修饰的id属性,由此可以得出,在不同包的子类去访问父类的protected属性是有一定限制的.

那我在当前子类创建另外一个子类的对象,能不能访问父类的protected属性呢?
可以做一个测试,先创建一个子类Cat继承Animal

package com.child;

import com.parent.Animal;

public class Cat extends Animal {

}

同样的在子类Bird中创建Cat实例,可以看到同样的只能访问父类的id属性,
在子类中不能通过父类对象实例来访问父类的protected属性和方法

protected使用总结:
1.在子类中可以通过子类对象来访问父类的protected属性和方法
2.在子类中不能通过父类对象来访问父类的protected属性和方法
3.在子类中不能通过其他子类的对象来访问父类的protected属性和方法