再谈包访问权限 子类为何不能使用父类protected方法

简介: 可见范围   权限的含义应该理解为控制范围,要把它理解成一个限制范围的空间,更为准确的说叫做可见范围 访问控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)、和private   public 所有地方都可以访问,没有任何疑问 pri...

可见范围

 

image

权限的含义应该理解为控制范围,要把它理解成一个限制范围的空间,更为准确的说叫做可见范围

访问控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)、和private

 

  1. public 所有地方都可以访问,没有任何疑问
  2. private 只有自己本类可以访问,没有任何疑问
  3. 默认也就是包访问权限,顾名思义,包访问权限,也就是必须同一个包中才可以,即使是子类不在同一个包中也不行的
  4. protected是默认包访问权限的扩展,默认是出了包的范围,就不行了,但是protected给予子类放行,即使是包的外部,当然同一个包中的子类肯定是可以的

简单说就是:

  1. public 谁都可以看得见
  2. private只有自己看得见
  3. 默认包访问 同一个包中看得见
  4. protected在默认包访问的基础上,子类自己看得见

 

示例:

image

package test.b;

import test.a.Super;

public class SubClass extends Super{

    public static void main(String[] args) {

        SubClass subClass = new SubClass();
         subClass.publicFun();
         subClass.protectedFun();

    }

}

 

 

打印信息:

publicFun
protectedFun

 

子类位于不同的包中,可以访问公有方法,可以访问protected方法 不能访问默认的包访问权限以及私有的

 

额外的例子:

package test.b;

import test.a.Super;

public class SubClass extends Super {

    public static void main(String[] args) {

        Super superClass = new Super();
         superClass.publicFun();

        superClass.protectedFun();

    }

}

 

编译器直接报错

image

如果非要执行,也是直接报错

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
     The method protectedFun() from the type Super is not visible

    at test.b.SubClass.main(SubClass.java:12)

相信也有不少人人把上面这种形式的代码理解为:子类中访问父类的protected方法

并且觉得很奇怪,并且认为  子类不同包中并不能访问父类的protected方法

其实这是概念错了

虽然是在子类中,但是却是使用父类的对象,调用父类的protected方法

这是在不同包中,访问protected方法 当然是错误的  

protected的含义是指子类可以访问,说的是子类直接访问父类的protected方法

而不是说子类中,可以调用父类的对象访问父类的protected方法

子类可以访问,可以在子类访问不是一个概念

你可以访问和在你家访问显然差别很大

 

 

总结:

public 什么都不用管,谁都可以用

private  只有自己本类可以用,本类自然限定到某个Class定义范围,哪怕你定义类或者子类在同一个文件中,都是白扯

默认的包访问权限 同一个包中,不管其他条件,管你是不是子类都没关系的,不要自己去混淆

protected 就是默认的包访问权限扩展了一下,  子类对象可以访问,不管是不是同一个包,而不是在子类中用父类对象访问

 

关于protected关键点在于:

先看下官方文档中的说明:

地址:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

 

A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members,

A subclass inherits all of the public and protected members of its parent

A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.

子类继承父类所有的成员 包括 属性方法以及嵌套类,不包括构造方法

子类继承所有的public和protected 的成员

子类不继承私有的成员,不过如果父类中有public或者protected 方法访问私有成员,子类可以使用

子类继承了父类的protected方法,所以子类有这个方法,所以子类可以使用,但是子类是不能读取某个父类对象的保护方法的(在包外)

继承是继承的结构,跟任何具体的对象的数据没关系,所以子类中不能创建父类的对象然后调用父类的protected方法,不能在包外访问protected方法

但是如果父类的方法是protected static的,可以在子类中创建父类对象然后调用方法

因为子类是继承的父类的,着重点在于类,继承了类的成员,类的,类的

 

目录
相关文章
|
2月前
|
Java
子类的父类和接口具有共同的方法
子类的父类和接口具有共同的方法
26 7
|
Java
抽象类的匿名子类
抽象类的匿名子类
46 0
【为什么】override关键字表示该函数会覆盖基类中的虚函数
【为什么】override关键字表示该函数会覆盖基类中的虚函数
|
开发者 Python
子类重写父类方法|学习笔记
快速学习子类重写父类方法,先来介绍子类重写父类方法。多态其实就是一种子类重写父类的方法。
|
前端开发 开发者
class-子类访问父类上的实例方法|学习笔记
快速学习 class-子类访问父类上的实例方法
105 0
子类到底能不能继承父类的私有属性?
继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体;子类通过继承父类的属性的行为,我们称之为继承。Java只支持单继承,不支持多继承。因为多继承容易带来安全隐患:当多个父类定义相同的功能,当功能内容不同的时候,子类对象不确定要运行哪一个,在Java中用另一种形式体现出来,就是接口的多实现。
ES6—45:子类对父类方法的重写
ES6—45:子类对父类方法的重写
153 0
ES6—45:子类对父类方法的重写