【java】访问修饰符

时间:2021-06-30 21:05:05

派生类继承了基类中除了构造函数和析构函数之外的所有成员,派生类不能选择继承一部分而舍弃另外一部分成员。对于从基类继承而来的在派生类中没有用的成员,可以通过指定继承方式,使这些成员在派生类中成为不可访问的,从而减少数据冗余和增加数据的安全性。

不同的继承方式决定的不同访问控制权限体现在:

(1)派生类的成员函数对所继承的基类成员的访问控制

(2)类外面通过派生类对象对其所继承基类成员的访问控制 

综述:

首先,不同的继承方式,不影响派生类的成员函数对从基类继承的成员访问,即派生类的成员函数不能直接访问基类私有成员,可以直接访问基类的保护成员和公有成员。

其次,不同的继承方式,对类外的其他函数通过派生类对象访问从基类继承的公有成员,有不同的影响:只有公有继承方式的时候,通过派生对象可以访问从基类继承的公有成员,其他继承方式下,不能访问从基类继承的任何成员。

最后,在不同的继承方式下面,基类成员被继承到派生类后,访问的属性有不同的变化。具体如下表:

【java】访问修饰符

按照上面的解释:

B从A类中以哪种方式继承下来,对于C(想要继承B)的类来说,是有些影响的。例如B以private的方式继承A,那么就算C以public的继承B,原先A中的基类成员变成了private,那岂不是C就不能访问了?归根就是说对父类在间接子类中的访问权限问题。

访问权限修饰符

可见/访问性 在同一类中 同一包中 不同包中  同一包子类中  不同包子类中 
 public  yes  yes  yes  yes  yes
 protected   yes  yes  no  yes  yes
 package   yes  yes  no  yes  no
 private  yes  no  no  no  no

 

(1) 在java中有public、protected、private三种显示的修饰符用于控制可见性,package不是显示的修饰符,它是隐含的,即如果在类、变量等前没加显示的可见性修饰符,那它就是package级别的。如果在类的定义中没有指定package,那么java会把它放在缺省包中,一般来说这个缺省的包就是当前目录。
(2) 在子类中的方法如果重载了父类的方法,那么该方法的可见级别应更底或者相同,如父类中的方法是public,那么子类中方法必须是public。
(3) 在java中,一般来说,变量成员最好是private,对它们的访问可以通过public的方法,在这些方法中可以做些控制以保证数据的一致性。这些方法名一般以get和set做为前缀。

2. 包
包名一般为小写,而类名的第一个字母一般为大写,这样在引用时,可以明显的分辨出包名和类名。如果在类的定义之前没有使用package定义包名,那么该类就属于缺省的包。

2.1 Hello Package
首先通过一个简单的package的定义来学习package的使用:

package testPackage;

public class Test
{
 public static void main(String args[])
 {
  mNode node = new mNode();
  node.print("hello");
 }
}
说明:
(1) 使用package关键字指明类所在的包;
(2) package语句必须在文件的最前面;
(3) 编译时可使用javac –d . Test.java自动产生包需要目录;
(4) 可以使用java testPackage.Test来执行编译后的代码;
2.2 包的几个作用:
(1) 可以更好的组织类,包与文件夹类似,文件夹可以将不同的文件放在同一个文件夹中,而包也可以将不同的类文件放在同一包中;
(2) 减少类名的冲突问题,这也与文件夹类似,同一文件夹中的文件不能重名,不同文件中的文件可以重名,同一包中的类名不能重复,不同包中的类名可以重复;
(3) 对包中的类起了一定的保护作用,详见java的访问控制;
2.3 import的使用
(1) 直接引用指定的类,如import java.util.Vector;
(2) 引用一个包中的多个类,如import java.awt.*。更确切的说,它并不是引用java.awt中的所有类,而只引用定义为public的类,并且只引用被代码引用的类,所以这种引用方法并不会降低程序的性能;
(3) *号代替类名,在不能代替包名,如import java.awt.*,只引用java.awt下的类,而不引用java.awt下的包;
(4) import java.awt.F*,这种使用方法是错误的;
(5) import语句在所有类定义之前,在package定义之后;
(6) import只告诉编译器及解释器哪里可以找到类、变量、方法的定义,而并没有将这些定义引入代码中;
2.4 包中类的使用
有以下几种机制可以使用包中的类:
(1) 如果要使用的类是属于java.lang包的,那么可以直接使用类名来引用指定的类,而不需要加上包名,因为包java.lang不用显示使用import,它是缺省引入的;
(2) 如果要使用的类在其它包(java.lang除外)中,那么可以通过包名加上类名来引用该类,如java.awt.Font
(3) 对于经常要使用的类(该类在其它包中),那么最好使用import引用指定的包,如java.awt.*
(4) 如果import引入的不同的包中包含有相同的类名,那么这些类的使用必须加上包名
(5) 接口也可以属于某个包,也可以使用import引入其它包中的类和接口