java类成员访问权限与类权限学习过程中的理解
- import语句
- package sichuan:
- package guizhou:
- 成员访问权限
- public
- private
- protected
- 友好成员(default)
- 类继承
- 间接继承问题
import语句
import用于使用其他包的类。Java使用包机制来缓解类的命名冲突问题,而import关键词的出现正是Java包机制的结果。
原因如下:在没有import语句之前,使用其他包中的类需要使用某包名.某类名。存在某些包名很长的情况以及多次使用包名.类名.成员名的情况,导致代码过长。
**import语句的实质:作用在编译器阶段,补全包名。**即在使用import导入包之后,可以使用不带包名的类,而编译器编译时自动加上你省略掉的包名。
import对类的不同继承、类成员的不同访问权限,补全包名有一定限制。
类的不同访问权限:
类别 | import有效性 |
友好类 | 无效 |
公有类private成员 | 无效 |
公有类protected成员 | 无效 |
公有类public成员 | 有效 |
公有类default(友好、默认)成员 | 无效 |
package sichuan:
package sichuan;
public class PublicFather { //公有类
public String PublicName;
public String PublicReturnName() {
return PublicName;
}
}
package sichuan;
class Father { //友好类
public String name;
public String returnName() {
return name;
}
}
package guizhou:
package guizhou;
import sichuan.*;
public class TestMain {
public static void main(String args[]) {
Father father = new Father(); //非法,不能导入友好类
father.name = "father";
PublicFather publicFather = new PublicFather();
publicFather.PublicName = "public Father";
String input= publicFather.PublicReturnName();
System.out.printf("公有类:%s\n",input);
}
}
运行的结果是编译器会报错,提示:
the type Father is not visible
由于import语句不作用于没有使用public修饰的类,因此,会编译失败。
成员访问权限
public
在其他类中创建某类的对象,则该对象能访问自己的public变量和public方法。
可以说,public成员是该类所定义对象与外部的接口,对外可见。
private
被private修饰的成员只能被本类中的其他成员函数使用,对外不可见。这些成员是类的不可见结构,不允许对象使用。
package type1;
public class Type(){
private int a;
public int b;
public void setA(int m){ //只能使用成员函数才能给private变量赋值
a = m;
};
}
public static void main(String args[]){
Type type = new Type();
type.a = 12; //非法,不能直接赋值
type.b = 12; //合法,变量b为公有变量;
type.setA(12); //合法
}
protected
同一个包中可以定义不同的类,在同一个包下,其他类中也可以使用该类定义的对象的友好成员。
若该类间接继承本包中的类,则可以继承被继承类的protected成员。
若某类的对象使用了其他类继承的成员,应该追溯到该成员的祖先类。仅有该祖先类和对象所在的类在同一个包下才可使用。
友好成员(default)
仅包名相同的类可使用。
同一个包中可以定义不同的类,在同一个包下,其他类中也可以使用该类定义变量的友好成员。
类继承
子类继承父类情况表
类别 | private | protected | default | public |
位于同包中 | × | √ | √ | √ |
位于不同包中 | × | × | × | √ |
间接继承问题
若father类继承grandfather类、son类继承father类,就三个类的位置情况,son类继承情况不同,(private均不继承)如下表:
位置情况 | G_ protected | G_ default | G_ public | F_protected | F_default | F_public |
三个类位于同一个包 | √ | √ | √ | √ | √ | √ |
三个类位于不同包 | √ | × | √ | √ | × | √ |
grandfather和father同一个包 | √ | × | √ | √ | × | √ |
grandfather和son同一个包 | √ | × | √ | √ | × | √ |
father和son同一个包 | √ | × | √ | √ | √ | √ |
该表反映了前面提到的知识点。首先,继承允许多重继承,必定继承protect和public成员。其次,友好成员的继承与位置有关,位于同一个包中的类可继承友好成员。另外,private成员对外不可见,不能继承。