深入理解Java中的访问控制符

Java包中的相关概念

  • 包的概念
      Java中的包类似于操作系统中的文件夹,将具有类似功能的类或者相同的类放在相同的包里面,便于组织与管理
  • 包的作用
      1.一是开发过程中避免类名重复问题;
      2.二是对代码整理归类,将功能相近的类放到一个包中管理;
      3.三是限定访问权限(default)就是包访问权限。
  • 简述调用某个包中的类的三种方式
      1>使用一个类的全名:即包名+类名
        注意:在包中,所有类对真正名字将是包名+类名的组合,所以在运行的时候要将包层给写上,不能直接写类名。
      2>使用import语句导入一个包中的所有的类。
      3>使用import语句导入一个包中的特定的类。

Java中访问控制符的具体用法

  • 为什么需要控制对成员的访问?
      第一个原因是防止程序员接触他们不该接触的东西---通常是内部数据类型的设计思想。
      进行访问控制的第二个原因是允许库设计人员修改内部结构,不用担心它会对客户程序员造成什么影响。
  • Java的访问控制级别分类
      1.类访问控制级别
        public
        
    default(默认的,什么都不用写,包内访问控制符)
      2.对象访问控制级别
        public:它修饰的成员没有限制,任何包中的任何类都能访问。
        
    protect:它修饰的只能被同一个包中的类访问,或者不同包中的子类访问。
        default:只能被同一个包中的类访问,包括同一个包中的子类。
        
    private:只能被同一个类中的方法访问。
访问权限 同一个类内部 同一个包内部 不同包中的子类 不同包的非子类
public
protected ×
default × ×
private × × ×

  总结:
    1>在一个类的内部,访问控制符是透明的,失效的
    2>在同一个包的内部,只有private有成员不能进行访问
    3>在不同包存在继承关系的两个类之间,只有public成员和protected成员可以进行访问
    4>在不同包之间,只有共有成员可以进行访问

  • 代码演示

  (1)在一个类的内部,所有的成员彼此之间都可以进行相互访问,访问控制符是透明的,失效的,共有的可以调用私有的,私有的可以调用共有的。

package com.vg.demo01;

public class TestAccessModifier {
	public void test1(){
		System.out.println("我是public");
	}
	protected void test2(){
		System.out.println("我是protected");
	}
	void test3(){
		System.out.println("我是default");
	}
	private void test4(){
		System.out.println("我是private");
	}
	public static void main(String[] args) {
		TestAccessModifier t=new TestAccessModifier();
		t.test1();
		t.test2();
		t.test3();
		t.test4();
}
}

我是public
我是protected
我是default
我是private


  (2)在同包不同类之间,只有其私有成员不可以通过类对象名的方式进行访问,共有成员和保护型的成员都可以通过这种方式进行访问. 简言之:在同一个包的内部,只有其私有成员不能够进行访问

package com.vg.demo01;
//private是不能在同包的子类中起作用的。
public class TestAccessModifierSon extends TestAccessModifier{
	
	public static void main(String[] args ) {
		TestAccessModifierSon s = new TestAccessModifierSon();
		s.test1();
		s.test2();
		s.test3();
	}
	
}

我是public
我是protected
我是default

package com.vg.demo01;
//非子类,在同一个包中,没有继承父类,即不是它的子类,private同样不能发挥作用
public class TestAccessModifierNotSon {
	
	public static void main(String[] args ) {
		TestAccessModifierSon s = new TestAccessModifierSon();
		s.test1();
		s.test2();
		s.test3();
	}
}

我是public
我是protected
我是default


  (3)在不同包存在继承关系的两个类之间,只有共有类的共有成员和共有类的保护型成员才可以被另外一个包中的子类进行访问,但是在一个子类的外部,只有共有类的共有成员才可以被直接的访问.

package com.vg.demo02;

import com.vg.demo01.*;
//在不同的包中,类的子类只有public、protected这俩个可以产生效果
public class TestAccessModifierOtherSon extends TestAccessModifier{

	public static void main(String[] args) {
		TestAccessModifierOtherSon th = 
				new TestAccessModifierOtherSon();
		th.test1();
		th.test2();

	}

}

我是public
我是protected


  (4)在不同包无任何关系的两个类之间,只有共有类的共有成员才可以被另外一个包中的类进行访问.

package com.vg.demo02;

import com.vg.demo01.TestAccessModifier;

public class TestAccessModifierOtherNotSon {
	public static void main(String[] args) {
		TestAccessModifier t = new TestAccessModifier();
		t.test1();
	}
}

我是public

有事评论区留言,也欢迎一起学习的伙伴
原文地址:https://www.cnblogs.com/wt9866/p/13596038.html