java中protected权限与默认权限的区别

406 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第十八天,点击查看活动详情

在java中最容易混淆的访问权限就是protected和default

protected:

java一共有4中权限修饰符,分别是private、default、proteC++ted和public private和public很好理解,default和protected不太好分清。 protected包内所有类可见,包外有继承关系的子类可见 default表示默认,不仅本类访问,而且是同包可见。

主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于 传递给子类的一种继承的东西

public,private,protected,和默认的区别:

区别:

public:可以被所有其他类所访问

private:只能被自己访问和修改

protected:自身、子类及同一个包中类可以访问

default:同一包中的类可以访问,声明时没有加修饰符,认为是frierndly.

static属性/方法可以被继承

父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有方法 @MDYn 类中的静态方法无法被子类重写(算是两个不同方法),所以向上转型之后,如果父类,子类都有这个静态方法,只能调用到父类原有的静态方法

image.png

作用域

注意:java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制 的检查。其实,通过反射的手段,是可以访问任何包下任何类中的的成员,例如,访问类的私有成员也是可能的。

protected在不同包内的子孙类也可以进行继承访问但是defalut不行。

所以访问权限应该是public>protected>default>private

小结:

1、在同一个包中,所有的类都能够访问某一个类中所有非privaate权限的方法或者属性。

2、一个包中的类不能通过继承访问另一个包中default权限的方法或者属性。换言之,子类在同一个包中可以访 问default权限的方法或属性,子类不在同一个包中则不可似。

3、在不同包中子类是不能通过父类的实例访问protected权限p的方法或者变量的。