一、访问权限区别
- public(公共): Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
- private(私有): 类级访问修饰符,一般称之为“私有的”。被其修饰的类(内部类)、属性以及方法只能在本类内部访问,其子类不能访问,更不能允许跨包访问。
- protected(继承访问权限): 包级访问修饰符,即:本包可以访问,子类可以继承。
- default(包访问权限):包级访问修饰符,即:只允许在同一个包中进行访问。
二、如图所示
三、示例代码
1)private
- package com.wbf.test;
- class A{
- private String str = "privateStr";
- private void print(){
- System.out.println("private function B.print() be invoked!!!");
- }
- public void func(){
- System.out.println(str);//在本类内部访问其自身的private属性
- print();//在本类内部访问其自身的private方法
- }
- }
- public class TestDemo {
- public static void main(String[] args) {
- A a = new A();
- /*
- *TestDemo和A同一个包
- *在同一个包中的TestDemo类,通过类A的实例化对象来访问私有方法,错误
- */
- //a.print();//error, The method print() from the type A is not visible
- a.func();
- System.out.println();
- B b = new B();
- /*
- *TestDemo和B不同包
- *在不同包中的TestDemo类,通过类B的实例化对象来访问私有方法,错误
- */
- //b.print();//error, The method print() from the type B is not visible
- b.func();
- }
- }
- package com.wbf.test1;
- public class B {
- private void print(){
- System.out.println("private function A.print() be invoked!!!");
- }
- public void func(){
- print();
- }
- }
2)protected、default
- package com.wbf.test;
- public class A {
- protected String str = "protectedStr";
- String str1 = "defaultStr";
- }
- package com.wbf.test;
- public class A1 extends A {
- public void func(){
- A a = new A();
- System.out.println(this.str);//同一个包中,子类访问从父类继承的protected属性
- System.out.println(a.str);//本包可以访问
- System.out.println(a.str1);//本包可以访问
- }
- }
- package com.wbf.test1;
- import com.wbf.test.A;
- public class A2 extends A {
- public void func(){
- A a = new A();
- System.out.println(str);//不同包中,子类访问从父类继承的protected属性
- //System.out.println(a.str);//error, 不同包中,不可以访问protected属性
- //System.out.println(this.str1);//error, 不同包中,子类不可以访问从父类继承的default属性
- //System.out.println(a.str1);//error, 不同包中,不可以访问default属性
- }
- }
- package com.wbf.test;
- public class A3{
- protected String str = "dd";
- public void func(){
- A a = new A();
- System.out.println(a.str);//同一个包中,可以访问A类的protected属性
- System.out.println(a.str1);//同一个包中,可以访问A类的default属性
- }
- }
三、解释说明
1)某类的protected 和default修饰的方法和属性在包外是不能通过该类实例化对象进行访问的
2)在一个Java文件中需要导入另外一个包中的类,那么这个被import的类必须是public的
3)protected和default的区别:在其他包中,子类继承的protected/default属性和方法是否可以在子类中用:”this.属性或方法名“ 访问,即:protected可以,default不可以。