Java访问权限之 protected 修饰符

这篇具有很好参考价值的文章主要介绍了Java访问权限之 protected 修饰符。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要

        在Java中,使用访问权限修饰符来保护对类、变量、方法和构造方法的访问,这类修饰符分别是public,protected,default,以及private。由于很多Java书籍对protected可见性的介绍都比较笼统,本文重点说明protected的权限

一、Java权限访问修饰符

各访问修饰符权限如下:

同一个类中 同一个包内 不同包的子类 不同包的其他类
public
protected ✔*
default
private

在上面所提到的四种修饰词中,除 protected 外都很好理解和掌握,在此略作简述:

  • public :能被所有的类访问。
  • default :只能被同一包中的类访问。
  • private :只能在定义它的类中被访问,其他类都访问不到。

二、protected关键字的可见性

    很多介绍Java语言的书籍(比如《Java编程思想》)都对protected做了介绍,但是描述的比较简单,基本都是一句话“被protected修饰的成员对于本包和其子类可见”。这种说法有点太过含糊,常常会对大家造成误解。实际上,protected的可见性在于以下几点:

  • 基类的protected成员在同一个包内可见。
  • 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。
  • 不管是否在一个包中,在基类,都可以通过子类实例访问继承的来自父类的protected方法。
  • 若子类与基类不在同一包中,那么在基类中,不能通过子类实例访问(父类中没有)子类中特有的protected修饰的成员。


接下来我们通过下面几个关于protected方法可见性的例子进行详细解释protected关键字:

示例一:

package p1;
public class Father1 {
    protected void f() {} // 父类Father1中的protected方法
}

package p1;
public class Son1 extends Father1 {}

package p11;
public class Son11 extends Father1{}

package p1;
public class Test1 {
    public static void main(String[] args) {
        Son1 son1 = new Son1();
        son1.f(); // Compile OK ----(1)
        son1.clone(); // Compile Error ----(2)

        Son11 son = new Son11();    
        son11.f(); // Compile OK ----(3)
        son11.clone(); // Compile Error ----(4)
    }
}
  • 首先看(1) (3),其中f()方法从类Father1继承而来,其可见性是包p1及其子类Son1和Son11,而由于调用f()方法的类Test1所在的包也是p1,同一个包内可见,因此(1)(3)处编译通过。
  • 其次看(2) (4),其中clone()方法所在类为Object默认根类,而Object类所在包为java.lang包。其可见性是java.lang包及其所有子类,对于语句“son1.clone();”和“son11.clone();”,二者的clone()在类Son1、Son2中是可见的(可以使用的),但在Test类是不可见的,因此(1)(3)处编译不通过
     

示例二:

package p2;

public class Father2 {
    protected Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}


package p22;
import p2.Father2;

public class Son2 extends Father2 {
    public static void main(String args[]) throws CloneNotSupportedException {
        Father2 f2 = new Father2();
        f2.clone(); // Compile Error ----(1)

        Son2 son2 = new Son2();
        son2.clone(); // Complie OK ----(2)
    }
}
  • 对于(1)而言,clone()方法来自于类Father2本身,因此其可见性为包p2及Father2的子类,虽然Son2是Father2的子类,但在Son2中不能访问基类Father2的protected方法clone(),因此编译不通过;
  • 对于(2)而言,由于在Son2中访问的是其本身实例的从基类Father2继承来的的clone(),因此编译通过。

示例三:

package p3;
import p33.Son3;

public class Father3 {
    public static void main(String[] argv) throws CloneNotSupportedException {
        Son3 son3 = new Son3();
        son3.clone();  // Compile OK ------(1)
    }
}

package p33;
import p3.Father3;

public class Son3 extends Father3 {}
  • 不管是否在同一个包中,在基类中,可以通过子类实例访问继承的来自基类的protected方法。(当然,基类clone()方法,也是继承自java.lang.Object))

示例四:

package p4;
import p44.Son4;

public class Father4 {
    public static void main(String[] argv){
        Son4 son4 = new Son4();
        son4.clone();  // Compile Error -----(1)
    }
}


package p44;
import p4.Father4;

public class Son4 extends Father4 {
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
  • 在基类中,不能通过子类实例访问(基类中没有)子类中特有的protected修饰的成员。

示例五:

package p5;

public class Father5 {
    protected Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}


package p5;

public class Test5 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Father5 f5 = new Father5();
        f5.clone();  // Compile OK ----(1)
    }
}
  • clone() 方法来自类Father5,其可见性为包p5 及其子类。

示例六:

package p6;

public class Father6 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Son6 son6 = new Son6();
        son6.clone();  // Compile OK -------(1)
    }
}

class Son6 extends Father6{}
  • 不管是否在同一个包中,在基类中,可以通过子类实例访问继承的来自基类的protected方法。(当然,父类clone()方法,也是继承自java.lang.Object))

示例七:

package p7;

public class Father7 {}

class Son7 extends Father7{
    public static void main(String[] args){
        Father7 f7 = new Father7();
        f7.clone();  // Compile Error ----- (1)
    }
}
  • clone方法来自于java.lang.Object,可见性为java.lang这个包和对应继承了这个clone()方法的子类,及Father7类中。

三、引用

Java基础知识详解: protected修饰符

Java访问权限之 protected详解

Java protected 关键字详解文章来源地址https://www.toymoban.com/news/detail-744786.html

到了这里,关于Java访问权限之 protected 修饰符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中的四种权限修饰符

    在Java中,存在四种访问修饰符,它们是public、private、protected和default。它们的访问权限从高到低依次为public protected default private。 1.public:public修饰的类、属性或方法可以被任何其他类访问,包括外部的类、同一个包内的类以及子类。 例如: 在这个例子中,Person类被声明为

    2024年02月12日
    浏览(44)
  • Java当中四种权限刨析( private、default、protected、public)

    目录 一、java权限简介 二、举例使用 1.private 2.默认权限(default) 3.protected 4.public 注意        java当中有4种访问修饰限定符privat、default(默认访问权限),protected以及public。只有默认访问权限和public能够用来修饰类。修饰类的变量和方法四种权限都可以。 private:如果一个

    2024年02月06日
    浏览(35)
  • java四大访问修饰符

    java中有四大修饰符,分别为private,default,protected,public,下面主要是四者之间的区别: private(私有的) private可以修饰成员变量,成员方法,构造方法,不能修饰类(此刻指的是外部类,内部类不加以考虑)。被private修饰的成员只能在其修饰的本类中访问,在其他类中不能调用,但是

    2024年02月12日
    浏览(28)
  • Java的访问修饰符

    为了实现面向对象程序设计(OOP)的封装这个特性,需要程序设计语言提供一定的语法机制来支持。这个语法机制就是访问权限控制(访问修饰符:public、protected、private、default)。 在 Java 中,封装就意味着所有的实例域都带有 private 访问修饰符(私有的实例域),并提供带

    2023年04月15日
    浏览(28)
  • Java 包、访问修饰符

    2024年02月13日
    浏览(25)
  • java基础——多态、代码块、权限修饰符、内部类,Object类

    多态是继封装、继承之后,面向对象的第三大特性。 多态是出现在继承或者实现关系中的 。 多态体现的格式 : 多态的前提 :有继承关系,子类对象是可以赋值给父类类型的变量。例如Animal是一个动物类型,而Cat是一个猫类型。Cat继承了Animal,Cat对象也是Animal类型,自然可

    2023年04月22日
    浏览(39)
  • Java 基础进阶篇(三)—— 权限修饰符、final 关键字与枚举

    权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符: 有四种作用范围由小到大 (private - 缺省 -protected - public) 注: 不同包下的子类指的是,不同包下的子类对象能访问,当前类创建父类对象访问不了。 定义成员变量、构造器、方法等一般需满足如下要

    2024年02月02日
    浏览(43)
  • Java接口中方法的默认访问控制修饰符

    在Java接口中,如果方法的访问控制修饰符没有声明,隐含着是public的。这个public可加上,也可以不加上。但为简洁起见,建议不加。 示例: 下面代码定义了有接口,有两个函数,其中一个没有声明public的,另外一个明确声明了public的: 打开编译后的class文件,可以发现,即

    2024年02月15日
    浏览(33)
  • Java 中的访问修饰符有什么区别?

    Java 中的访问修饰符用于控制类、类的成员变量和方法的访问权限,主要有以下四种: public:公共访问修饰符,可以被任何类访问。public 修饰的类、成员变量和方法可以在任何地方被访问到。 protected:受保护的访问修饰符,可以被类本身、子类和同一个包中的其他类访问。

    2024年02月04日
    浏览(30)
  • java面试题(21):private修饰的方法可以通过反射访问,那么private的意义是什么?

    1 反射简介 Java,在一个类中,为了不让外界访问到某些属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名)将无法访问此属性与方法,但有没有其他方法可以访问呢?答案是有的,这就是java反射带来的便利。利用反射访问类的私有属性及方

    2024年01月22日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包