`
passion99
  • 浏览: 11146 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java访问控制权限protected和default

    博客分类:
  • JAVA
阅读更多

Java基础之访问控制权限protected和default

包和类、接口的访问权限控制比较简单,在此不讨论。仅记录一下protected和default修饰的成员变量和成员方法的访问权限控制问题。

假设定义了一个顶层类:

 package com.zjc;
public class FatherClass{
    //保护类变量
    protected int protected_int;
    //保护类方法
    protected void display_protected(){
        System.out.println("这是保护类的方法");
    }
    //默认类变量
    int default_int;
    //默认类方法
    void display(){
        System.out.println("这是默认友好类的方法");
    }
    public int getProtected_int() {
        return protected_int;
    }
    public void setProtected_int(int protected_int) {
        this.protected_int = protected_int;
    }
    public int getDefault_int() {
        return default_int;
    }
    public void setDefault_int(int default_int) {
        this.default_int = default_int;
    }
}

主要分两种情况:

一、引用FatherClass的类与之在同一包下

1、FatherClass类的子类及其子类将继承protected、default型变量和方法;

2、FatherClass类、子类及其子类创建的实例可以直接访问protected、default型变量和方法。

 

//子类SonClass

package com.zjc;
public class SonClass extends FatherClass{
    public void sy(){
        //1、在同一个包中,子类体内部,保护和默认成员均可见。
      this.default_int = 1;
      this.protected_int = 2;
      this.display();
      this.display_protected();
    }
}

 

package com.zjc;

public class TestDefaultProtected {
    public static void main(String[] args) {
        // 创建实例对象
        FatherClass ft = new FatherClass();
        SonClass st = new SonClass();
        //2、在同一个包中,顶层类、子类创建的实例对象中保护型和默认型变量和方法均可见
        ft.default_int = 1;
        ft.protected_int = 2;
        ft.display();
        ft.display_protected();
        st.default_int = 1;
        st.protected_int = 2;
        st.display();
        st.display_protected();
    }

}

 

二、引用FatherClass的类与之不在同一包下   

1、子类及其子类将继承protected成员,不继承default成员;

2、FatherClass类、子类及其子类创建的实例均不能直接访问protected、default型变量和方法(子类体内创建实例除外);

3、可以通过Father类的public方法操纵protected/private/default变量。

//子类SonClassOnDiffPackage

package com.caimeng;

import com.zjc.FatherClass;
import com.zjc.SonClass;

class SonClassOnDiffPackage extends FatherClass{
    public void test(){
    //3、不同包下,FatherClass类的子类内,继承了保护型变量和方法、不继承默认型变量和方法
     this.protected_int = 2;
     this.display_protected();
     SonClassOnDiffPackage temp = new SonClassOnDiffPackage();

     temp.protected_int =3;    //5、子类体内创建的自身对象可以直接访问保护型变量
    }
}

 

//测试实例对象

public class UseDefaultProtected  {
    public static void main(String[] args) {
        FatherClass ft = new FatherClass();
        SonClassOnDiffPackage sd = new SonClassOnDiffPackage();
        SonClass sc = new SonClass();
        //4、在不同包中,FatherClass类、SonClassOnDiffPackage类、SonClass类
        //的实例对象中,保护型和默认型变量和方法均不能直接访问
        //6、可以通过Father类的public方法操纵protected/private/default变量
        ft.protected_int = 1; //编译错误
        sd.protected_int = 1; //编译错误
        sc.protected_int = 1; //编译错误
    }

}

结论:

1、在同一包中,protected和default修饰效果相同;即在子类均继承这些成员,顶层类、子类创建的实例

      均可以直接访问这些成员;

2、而在不同包下,子类只继承了protected成员,可以在子类体内直接访问这些成员,但顶层类、子类创建的实例均不能直接访问这些成员;

3、对于不同包下protected的访问权限,记住Java7规范中的一个原则即可

A protected member or constructor of an object may be accessed from outside
the package in which it is declared only by code that is responsible for the
implementation of that object.

也就是,只能在类的实现体内访问,类创建的实例内是不可达的。

分享到:
评论
1 楼 passion99 2016-11-06  
本人抛砖引玉,欢迎各位Java爱好者根据自己的理解各抒己见!

相关推荐

    用java代码来解析private、public、default、protected的权限问题

    用java代码来解析private、public、default、protected的权限问题

    【IT十八掌徐培成】Java基础第07天-04.权限-public-private-protected-default.zip

    【IT十八掌徐培成】Java基础第07天-04.权限-public-private-protected-default.zip

    java八股文.docx "Java八股文"通常指的是一种简单的模板化回答,用于解答关于Java编程语言的基础问题,特别是在面试

    java八股文 "Java八股文"通常指的是一种简单的模板化回答,用于解答关于Java编程语言的基础... Java中的四种访问权限是public、protected、default和private,分别表示公开、受保护、默认(包内可见)和私有。 5. **J

    Java 修饰符和运算符

    Java 支持 4 种不同的访问权限: private 私有的 protected 受保护的 public 公共的 default 默认 1、访问权限 总结成如下表格: 修饰符 当前类 同一包内 子孙类 其他包 public yes yes yes yes protected yes yes ...

    Java知识点.docx

    在Java当中,有4种修饰符:default、public、private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。 下面列出了使用封装的一些好处: *通过隐藏对象的属性来保护对象内部的...

    java 面试题 总结

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

    探讨Java内部类的可见性

     下面是一个示例程序Out.java,其中包含了4个不同访问权限的内部类(private,default,protected,public),在每个内部类中,分别包含4个不同访问权限的成员与方法。在外部类Out中提供了得到内部类实例的

    java经典面试2010集锦100题(不看你后悔)

    B) 内部类的访问权限可以被定义为public、protected、private和default。但是普通类只可以定义public和default两种访问权限。 C) 内部类的访问权限可以被定义为public、protected、private和default。普通类也可以...

    01-Java基础(面向对象+集合).docx

    在 Java 当中,有 4 种修饰符: default、public、private 和 protected 。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。  通过隐藏对象的属性来保护对象内部的状态。  提高了代码...

    java方法总结(重载,构造方法,调用方法)

    java方法 目录 方法的定义 方法的格式 调用方法的方式 返回值问题 ...例如:private(私有)、default(默认)、public(公共)、 protected(被保护) public和private控制方法能否在其他类中使用。

    重载与覆写/重写的区别

    的访问控制权限 重载可以改变返回值类型,但是这样做没有任何的意义, 可是对于覆写而言,绝对不能修改返回值类型,但是在子类中所覆写的方法应该可以继续进行重载。 重载(Overloading)  (1...

    【04-面向对象(上)】

     小或相同,访问控制权限要更大。 父类实例的super限定 •通过关键字super 来调用父类的方法或属性。 super调用父类的构造器 •子类构造器总会调用父类构造器。 •如果子类构造器没有显式...

    Java学习笔记(续)

    2.2 Java中的权限修饰符的介绍 public protected (default) private 同一个类 :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: 同一个包 :heavy_check_mark: :heavy_check_...

    【05-面向对象(下)】

    •局部内部类不能在外部类以外的地方使用,那么局部内部类也不能使用访问控制符和static修饰 匿名内部类 •匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: •new 父类构造器...

    MapView的使用

    在论坛里看到一篇 "MapView和其它控件一起显示 " 的帖子, 那是很老的一篇帖子了, 很多朋友都说无法在android SDK 1.0上运行。既然那么多人关心,我在这里就把它重写一遍,顺便加入了一些新的功能 ,感兴趣的朋友可以...

    可扩展的文件选择器NoNonsense-FilePicker

    首选需要加上文件访问权限: 将选择器的app注册到AndroidManifest.xml android:name="com.nononsenseapps.filepicker.FilePickerActivity" android:label="@string/app_name" android:theme="@style/FilePicker....

    net学习笔记及其他代码应用

    1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,...

Global site tag (gtag.js) - Google Analytics