在子类中不能通过父类对象实例来访问父类的protected属性和方法

四种修饰符的作用域

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属性和方法

扫描二维码关注公众号,回复: 9254314 查看本文章
发布了43 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_26542493/article/details/96873366