java——访问修饰符(private/public/protected/缺省)学习

阅读《java核心技术 卷I》中“受保护访问”时,读得一知半解。书中对protected关键字作用一笔带过。而protected访问级别确实不太好理解。下面对java的4种访问级别按照访问性递增顺序整理如下:

一、私有(private)

  被private修饰的成员变量和方法,仅仅对本类可见,只能被本类的内部方法调用。(案例略)
  助记:我的东西中,private修饰的部分,我不跟别人分享,只有自己才能知道。

二、缺省(package-private)

  当不使用修饰符时(不要使用default关键字,会报错),在技术上被称为“缺省访问级别”,成员变量和方法默认是对本包可见。(案例略)
  助记:我的东西中,没有访问修饰符声明的部分,默认可以和我的邻居(住附近的那些人)分享。

三、受保护(protected)(重点)

继承
继承
Grandson
Son
Parent

  一个类Parent中的protected成员变量和方法可以被它的子孙类继承,比如Son是Parent的子类,Grandson是Son的子类,那么Grandson、Son类都继承Parent类的protected成员变量和方法,如上图所示。

  如果Son(Grandson同理)类在自身中创建了一个Son实例,那么该实例总是可以通过“.”运算符访问继承的或自己内部定义的protected变量和方法;但是在另外一个类中,比如在Other类中用Son类创建了一个实例son,该实例通过"."运算符访问protected变量和方法的权限规则如下:

  1. 对于子类Son中定义声明的protected成员变量和方法,只要Other对象和Son类在同一个包中,实例son就可以访问这些protected成员变量和方法。
  2. 对于子类Son从父类继承而来的protected成员变量和方法,需要追溯到这些protected成员变量和方法所在的“祖先”类,比如Son的祖先是Parent类,只要Other类和Parent类在同一个包中,son实例就能访问继承自Parent类的protected变量和方法。

  助记:我的东西中,protected修饰的部分,不仅可以和邻居(住附近的那些人)分享,也可以跟不在家(虽然不在同一个包)的儿子分享【但有一些的限制,见下面案例】。
案例代码如下:
Parent类

package com.learning.protectedDemo;
/**
 * 父类(基类).
 */
public class Parent {
    protected void getName() {
        System.out.println("I'm Parent!");
    }
}

Son类

package com.learning.protectedDemo.package_one;
import com.learning.protectedDemo.Parent;
/**
 * Son类.(位置:和Parent类不同包。)
 */
public class Son extends Parent {
	// Son自身也可以定义protected访问级别的方法
    protected void sing() {
        System.out.println("I'm son!");
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        parent.getName();       //(1) 编译失败。子类与父类不在同一包中时,子类中不能访问父类实例的protected方法。只有当子类与父类同包时,子类中才能访问父类实例的protected方法。

        Son son = new Son();
        son.sing();             //(2) 编译通过。原因:在Son类自身中创建了一个Son类的实例,那么该实例总是可以通过“.”运算符访问继承的或自己定义的protected变量和方法;
        son.getName();          //(3) 编译通过。原因同上。
    }
}

Other类

package com.learning.protectedDemo.package_one;
import com.learning.protectedDemo.Parent;
/**
 * 其他类.(位置:和Son类同包,和Parent类不同包)
 */
public class Other {
    public static void main(String[] args) {
        Son son = new Son();
        son.sing();                 //(4) 编译通过:由于Other类和Son类在同一个包下,所以可以声明Son实例,通过实例中定义的protected修饰的sing方法;
        son.getName();              //(5) 编译失败:由于Son类中的getName方法是继承于Parent类,Other类和Parent类不在同一个包下,无法访问Son类继承而来的protected方法。

        Parent parent = new Parent();
        parent.getName();           //(6) 编译失败:由于Other类和Parent类不在同一个包内,Other类中不可以访问Parent类实例的protected方法;
    }
}

四、共有(public)

  被public修饰的成员变量和方法,对外部完全可见。声明对象实例后(无论在什么位置),实例均可通过“.”直接访问pulic成员变量和方法。(案例略)

  助记:我的东西中,public修饰的部分,可以和任何人分享。

五、总结

修饰词本类同一个包的类继承类其他类
private×××
无(默认)××
protected×
public

六、参考资源

  1. Java 中的权限修饰符(protected)
  2. java protected修饰符说明
  3. 【Java面试题】访问修饰符public、private、protected、default(默认不写) 区别
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值