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

可见范围

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

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

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

简单说就是:

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

示例:

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();

    }

}

编译器直接报错

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

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关键点在于:

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

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的,可以在子类中创建父类对象然后调用方法

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

原文地址:https://www.cnblogs.com/noteless/p/9270015.html

时间: 2024-10-13 07:57:30

再谈包访问权限 子类为何不能使用父类protected方法的相关文章

命令行的形式,了解java的包访问权限,与.java 文件的关系,通晓java文件储存的关系;

大家,在学习Java时,大多是使用eclipse 等IDE 环境, 然而这样并不好,而包访问权限,也是Java中框架结构控制的关键的步骤, 只有真正得掌握 .java文件与 package 间的关系,才能真正得掌握其中的关系,有利于写好框架: 少废话,先上代码: 这是带有 package com.xuyaowen.demo; 的文件,这是代表Jack.java文件所放在的位置: package com.xuyaowen.demo; public class Jack { Jack(){ Syst

Java 访问权限控制:你真的了解 protected 关键字吗?

摘要: 在一个类的内部,其成员(包括成员变量和成员方法)能否被其他类所访问,取决于该成员的修饰词:而一个类能否被其他类所访问,取决于该类的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下,包访问权限),protected 和 public,而其中只有包访问权限和public才能修饰一个类(内部类除外).特别地,很多的介绍Java的书籍对protected介绍的比较笼统,常常会对大家造成误解.因此,本文重点揭示了 protected 关键字的内涵和用法,并介绍了一些其他

Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); printB(); } public void printB(){ System.out.print("SuperClass-printB"); } } public class ChildClass extends SuperClass{ public void printA(){ System

关于protected在子类创建父类对象无法访问父类protected方法或成员

子类(父类的外部包)中访问父类的protetcted属性或者方法,是不可以通过创建父类对象调用的.注意:此处不讨论同包下的父类子类,因为同包下所有类都可访问protected属性或者方法. 请参见Java官方文档:Chapter 6. Names中的6.6.2.1. Access to a protected Member具体例子如下: 父类C:在包c下 1 package c; 2 public class C { 3 protected int id; 4 protected void te

java类的访问权限

1.解析 Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符. private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”.被其修饰的类.属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问. default:即不加任何访问修饰符,通常称为“默认访问模式“.该模式下,只允许在同一个包中进行访问. protect: 介于public 和 private 之间的一种访问修饰符,一般

浅析Java中的访问权限控制

浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1.fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理? 此时,访问权限控制便可以

java 访问权限控制

java提供四种访问权限: public > protected > 包访问权限(无关键词) > private 包:库单元 对于包访问权限,一个包内的都可以访问. 在eclipse中创建类时如果不创建包,类将会被创建在默认包(default package)中,我一直习惯这样,然而这是一个很不好的做法(= =!)不相关的类应该置于不同的包.因为如果一个包中有两个名字相同的类会产生冲突的. 把不同的类放入不同的包,如果想使用其他包的类,将需要在名字前加上包名.例如ArrayList类在j

thinkinginjava学习笔记05_访问权限

Java中访问权限等级从大到小依次为:public.protected.包访问权限(没有关键词).private: 以包访问权限为界限,public.protected分别可以被任意对象和继承的对象访问,而包访问权限(未加关键词的类.方法等)则不能在包外被访问:在一个类中,不能出现相同类成员:在同一个包中,不可以出现相同类: public作为接口访问权限,将一些方法作为public,即将该方法作为接口,供其他程序调用:private权限下,除了包含该成员的类之外,其他任何类都无法访问该成员,用来

java4android (包和访问权限)

什么是Java当中的软件包? 为什么要使用软件包? 如何给一个类打包? //将类放置到一个包中,需要使用package"包名" //打包 编译的方法 javac -d . Test.java //出现错误:编码GBK的不可映射字符 javac -encoding UTF-8 -d . Test.java //-d 根据包名safiri生成文件夹 .的意思是在当前目录下生成safiri文件夹 //一个类的全名应该是"包名"+"."+"类名