Java中关键词public、friendly、protected、private访问权限修饰符

权限修饰词

定义:就是用于控制被修饰变量、方法、类的可见范围。

使用的必要性:

一个Java应用有很多类,但是有些类,并不希望被其他类使用。每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用。为了更好的控制这些属性和方法的被访问的权限问题,就需要使用访问权限修饰符。

修饰词的划分:根据作用范围来进行划分。

所在的类 private 默认的(default/friendly) protected public
同一个类中 可见 可见 可见 可见
同一个包中 不可见 可见 可见 可见
不同的包中有继承关系 不可见 不可见 可见 可见
不同的包中没有继承关系 不可见 不可见 不可见 可见

四种访问权限的具体讲解:

**A. ** public修饰:只能修饰类、方法(含构造方法)、成员变量。其修饰的部分所有人都能访问。

  • 代码展示:
	public class All {
		public static void main(String[] args) {
			One one = new One();
			System.out.println(one.name);
		}
	}
	class One {
		public String name = "小明";
	}
  • 说明:因为One类的name属性为public修饰的,所以类外界可以直接访问(one.name)这个属性。

B. private:只能修饰方法(含构造方法)、成员变量。其修饰的部分只能在自身类中访问。例如将某类的构造方法设置为private,那么在其它类中就不能调用“new”来创建该类的实例,通常在该类中会对外提供一种方法,该方法能返回该类的实例; 再例如我们经常将成员变量设置为private的,对外提供set/get方法对其进行访问,在set/get方法中可做一些比如权限检测等操作,而不是将域直接暴露给所有用户。

  • 代码展示:
	public class All {
		public static void main(String[] args) {
			One one = new One();
			System.out.println(one.name);
			System.out.println(one.getName2());
		}
	}
	
	class One {
		public String name = "小明";
		private String name2 = "小红";
		public String getName2() {
			return name2;
		}
		public void setName2(String name2) {
			this.name2 = name2;
		}
	}
  • 说明:因为One类的name2属性为private修饰的,所以类外界不可以直接访问这个属性,必须要通过特定的方法才能操作这个属性,也就是例子中的getName2(),setName2(String name2)两个方法来操作,setName2()这个方法是设置这个属性的值,getName2()这个方法是得到这个属性的值,这也是封装性的体现。

C. protected:只能修饰方法(含构造方法)、成员变量。进一步解释:父类的protected成员是包内可见的,并且对子类可见;若子类与父类不在同一包中,那么在子类中,子类实例可以访问其从父类继承而来的protected方法,而不能访问父类实例的protected方法。

  • 代码展示:
	package com.luodesong.bean;

	public class Test1 {
		protected String name;
	}
	package com.luodesong.test;

	import com.luodesong.bean.Test1;
	
	public class All {
		public static void main(String[] args) {
			test1.name;//这句代码会报错,不能调用。
		}
	}
  • 说明:Test1类和All类不在同一个包下面;同时,Test1中的name属性用的是protected权限修饰符修饰的,所以 test.name 这句代码不能编译通过。想要能使用,就必须放在一个包下或者是通过继承来实现。
  • 放在同一个包下的代码为:
	package com.luodesong.test;
	
	public class All {
		public static void main(String[] args) {
			One one = new One();
			String name = one.name;
			System.out.println(name);
		}
	}
	
	class One {
		protected String name = "小明";
	}
  • 通过继承实现的方式为:
	package com.luodesong.bean;
	
	public class Test1 {
		protected String name = "小红";
	}
	package com.luodesong.test;
	
	import com.luodesong.bean.Test1;
	
	public class All {
		public static void main(String[] args) {
			One one = new One();
			String name = one.name;
			System.out.println(name);
		}
	}
	
	class One extends Test1 {
		public String name = super.name;
	}

D. 默认修饰符(friendly):这个较为简单只能修饰类、方法(含构造方法)、成员变量。其修饰的部分只有**同一包内的类能访问,**对于这个包之外的所有类,这个成员是private的。

注意:

  1. 在同一包中具有包访问权限,相当于默认(friendly)访问权限。
  2. 在子类中,可继承不同包内父类的protected方法和属性,也只能在该子类中访问(除非重写方法或属性)。

你可能感兴趣的:(Java)