day04supplemet-Love
关于类的访问权限和修饰符问题
如果类名是默认包权限,那里面写的方法呢?
里面是public-method呢,其他地方的包应该不可以使用吧?因为没有写public的类只能在本包访问对吧?
类的访问权限决定内部成员的 “可见基础”类的访问权限决定内部成员的 “可见基础”
Java 中类的访问权限只有**两种:public
和 **默认(无修饰符)
如果类是默认权限(如 class Demo {}
,没有public
):
这个类只能在当前包内被访问(其他包根本 “看不到” 这个类)。
因此,哪怕你在类里写了 public void test() {}
,其他包的类也无法使用这个方法 —— 因为连Demo
类都找不到,更别提调用它的方法了。
只有public
类(如 public class Demo {}
)才能被其他包通过import
访问,其内部的public
成员才具备 “被跨包使用” 的基础。
四种访问修饰符
假如文件名Demo,然后有public Demo这个,我在这个类体内写了pubic的方法,这个是不是可以到处使用(无聊在哪个包),但是private只允许类使用和类的实例使用对吧?然后protected是包及子包可以使用?
-
public
:完全公开 -
private
:仅类内部可见,被private
修饰的方法 / 属性,只能在当前类的内部直接使用,其他任何类(包括同包的类、子类)都无法访问,即使是该类的 “实例” 也不能在类外部调用其private
成员。 -
protected
:同包 + 跨包子类可见① 同包中的任何类:可以直接访问
protected
成员(无论是否是子类);② 跨包中的子类:可以通过 “子类的实例” 访问父类的
protected
成员(不能通过父类的实例直接访问)。
跨包的子类?(存疑不了解)
核心结论(跨包子类访问protected
的规则)
只有两种合法方式,一句话总结:“只能在子类内部用,不能在外部直接调”
- 子类内部直接用:子类(包 B 的
Child
)的方法里,可以直接调用父类的protected
方法(如useParentMethod()
里调用protectedMethod()
)。 - 外部通过子类间接用:其他类(如
Test
)只能调用子类提供的public
方法(如useParentMethod()
),间接触发父类protected
方法的执行;但不能直接通过父类 / 子类实例调用protectedMethod()
。
protected
的核心是:仅允许子类 “自己内部用”,不允许外部通过任何实例(父类 / 子类实例)直接调用;但可以通过子类暴露的public
方法间接使用。
😘