`
hellojim
  • 浏览: 52288 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

话说JAVA中成员访问控制

    博客分类:
  • JAVA
阅读更多

JAVA中成员访问控制有四种类型,从不开放 到 开放,分别为 private,default(在成员前或类前不加任何访问控制即为default),protected,public。在一个类的前面只能有两种访问控制类型即default(在类前不加任何访问控制即为default)和public ,同一个包中的类互相访问只要有default这样的访问权限就够了,如果不在同一个包中的类互相访问类前必须要有public这样的访问权限。看下面的代码:

package com.jim;
public class Person {
	
	String name ;
	int age;
	
	public Person() {
		
	}
	
	public Person(String name) {
		this.name = name;
	}
	
	public Person(String name,int age) {
		this(name);	
		this.age = age;
	}
	
	//default型:如果成员前没有加任何型,就表示default型或朋友型或包型,表示此成员只能被同一个包中的类的成员访问
	void shutName() {
		System.out.println("name = " + name);
		shutAge();
	}
	
	
	//private型:表示只能被同一个类中的其它成员访问,其它的都不能访问
	private void shutAge() {
		
		System.out.println("age = " + age);
	}
	
}

class Dog {
	
	public static void main(String[] args) {
		
		new Person("zhangsan",10).shutName();
		
	}
}

 之所以 new Person("zhangsan",10).shutName(); 这样的一句能正常运行,是因为 Person 和 Dog 这两个类在同一个包中(com.jim这个包),所以 public class Person 这里的 public 加不加都无所谓(加在这里是因为下面的Student类和它不在同一个包中,而 Student 类又要extends Person这个类),都不会出错. 这里的 Person 类中的 shutName 方法的访问控制类型就是 default 的(因为在一个类中,可以访问其它同一个包中其它类的 default 型的方法),所以在 Dog类中访问 shutName() 这样的方法不会报错。

 

再看一个类:这个类在 com.jim.example 这个包中,它和上面的 Person 类不在同一个包中,但它是 Person 类的子类,所以这个类它是 extends 不到 Person 类的 name 、age 成员属性和shutName()成员方法的,因为它们不在同一个包中,所以下面这段代码运行会报错。如果要想达到extends效果,就必须把 Person 类的name 、age 成员属性和shutName()成员方法的访问控制至少变为 protected 的或public 的。

/*
	如果父类与子类不在同一个包中,子类想 extends 父类的成员(成员属性和成员方法),
	父类的成员访问控制类型必须是 protected 以上,也就是说成员
	访问控制类型必须为 protected 或 public 的
*/
package com.jim.example;
class Student extends com.jim.Person {
	
	private String school;
	
	public Student() {
	}
	public Student(String name,int age,String school) {
		super(name,age);
		this.school = school;
	}
	
	public void shutSchool() {
		
		System.out.println("name = " + name + " age = " + age + " school = " + school);
		
	}
	
	public static void main(String[] args) {
		
		Student student1 = new Student("wangji",26,"上海大学");
		student1.shutSchool();
		student1.shutName();
	}
}

  public 就不用多说了吧!如果两个类既不在同一个包中,又没有父子关系,那么在一个类中要访问另外一个类,那么另外的这个类的成员的访问控制就必须为 public 的,其它的访问控制类型都不行。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics