java四种访问权限

摘要:
java有四种访问权限,它们各自的范围如下图所示当下列访问修饰符修饰字段和方法时:private任意位置的子类不可以访问从父类继承的private字段和方法。protected上面的三种访问权限都很好理解,protected的描述却不是那么清晰。1)、当子类访问从父类继承的成员或方法时,不管是否在同一包都可以,在这个情况下同public权限。packagep1;importp2.C2;publicclassC3{publicvoidtest(){C2c2=newC2();c2.fun();}}编译结果:protected总结:当在子类内部访问从父类继承而来的protected字段(方法)时,没有包限制。

java有四种访问权限,它们各自的范围如下图所示

java四种访问权限第1张

当下列访问修饰符修饰字段和方法时:

private

任意位置的子类不可以访问从父类继承的private字段和方法。这里所说的访问包括通过super关键字访问。

任意位置的对象不能通过“.”访问对象的字段和方法。

public

任意位置的子类可以访问从父类继承的public字段和属性。

任意位置的对象可以通过“.”访问字段和属性。

default

当子类与父类在同一包下时,子类可以访问从父类继承的default权限的字段和方法。

当创建该对象的类与该对象所属的类在同一包下时,可以通过“.”访问对象的字段和方法。

对于父类中的private、default权限的一些方法和字段,子类在一定程度上不能访问它们,通过super访问也不行。但子类对象初始化时,不仅子类中声明的成员变量分配了内存,父类的成员变量也都分配了内存,只是父类的成员不能被子类访问罢了。但是我们可以通过子类从父类继承的某些方法来操作这部分不能访问的变量。

protected

上面的三种访问权限都很好理解,protected的描述却不是那么清晰。

1)、当子类访问从父类继承的成员或方法时,不管是否在同一包都可以,在这个情况下同public权限。

测试: p2包下的C2继承p1包下的C1,C2在类中可以直接访问继承来的方法

packagep1;

public classC1 {
    protected voidfun() {}  
}
packagep2;

importp1.C1;

public class C2 extendsC1{
    public voidtest() {
        fun();
    }   
}

编译正确:

java四种访问权限第2张

2)当访对象要用“.”访问对象的protected字段(方法)时,分两种情况讨论

i 如果访问的这个方法(字段)是该对象的类自己定义的,且类型是protected。要求对象所在类与对象所属类在同一包下。

packagep1;

public classC1 {
    protected voidfun() {}    
}
packagep2;

importp1.C1;

public classC2{
    public voidtest() {
        newC1().fun();
    }
}

编译报错:(因为对象所在类p2.C2与对象所属类p1.C1不在同一包下)

java四种访问权限第3张

将C2放在包p1下后:

packagep1;

public classC2{
    public voidtest() {
        newC1().fun();
    }
}

编译正确:

java四种访问权限第4张

ii 如果对象访问的这个方法是该对象的类继承而来的。要求对象所在类与该方法(字段)被最初被定义的类在同一包下。其实 i 是 ii 的特殊情况。

测试: C2继承C1的protected方法fun(),C3调用C2继承的fun()方法,C3与C2在同一包下,编译报错。

packagep1;

public classC1 {
    protected voidfun() {} 
}
packagep2;

importp1.C1;

public class C2 extendsC1{
}
packagep2;

public classC3{
    
    public voidtest() {
        C2 c2 = newC2();
        c2.fun();
    }
}

编译结果:

java四种访问权限第5张

测试:将上面的示例改变一下,C3放到C1的包下,编译通过。

packagep1;

importp2.C2;

public classC3{
    public voidtest() {
        C2 c2 = newC2();
        c2.fun();
    }
}

编译结果:

java四种访问权限第6张

protected总结:当在子类内部访问从父类继承而来的protected字段(方法)时,没有包限制。当对象通过“.”访问字段(方法)时,被protected修饰的方法(字段)的可见范围是,该字段(方法)被定义的类所在的包。

本文个人编写,水平有限,如有错误,恳请指出,欢迎讨论分享。

免责声明:文章转载自《java四种访问权限》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vSphere 计算vMotion的迁移原理redhat7.4安装vertica-9.1.0教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Malleable-C2-Profiles配置

唔,水文水文…. 关于Malleable-C2-Profiles 在日常的渗透测试工作中,我们需要做很多的规避操作,因为我们所使用的C2工具等,可能早已被AV等防护软件所标记,所以我们需要订制我们的攻击工具。而这就引出了我们的今天的重点Malleable C2 ,Malleable C2 是 Cobalt Strike 的一项功能, 意为 “可定制的” 的...

三级联动下拉菜单1

一:HTML代码 1 <select id='c1'></select> 2 <select id='c2'></select> 3 <select id='c3'></select> 二: 三级菜单数组举例定义(实际从数据库中获取) var city1 = ['请选择','江苏'...

base64的编码解码的一些坑

1、 //编码 value = base64encode(utf16to8(src)) //解码 value = utf8to16(base64decode(src))这里:base64编码之前先转成utf8,解码出来的也要从utf-8转为utf-16 2、base64编码分为字符串编码成字符串,字符串编码成数组,字符串解码成数组,字符串解码成字符串,等...

postgresql中的rollup

在postgresql中,rollup是group by的子句,提供了多个分组集的简便方式。分组集(grouping set)是用户用于分组的一组列的集合。 与cube语句不同,rollup不会在指定的列上产生所有可能的分组集。 rollup假设输入的列上有层次结构,根据层次结构生成分组集。这就是为什么rollup会经常用于生成报表的grang total...