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 的,其它的访问控制类型都不行。