包、访问修饰符和内部类
本章目标
-
掌握如何使用包组织类
-
掌握访问权限修饰符
-
重点掌握内部类的使用方式(难点)
什么是包(package)
包是 Java 中组织和管理类的一种机制,它可以防止类命名冲突和提供类访问权限控制
包的基本功能
-
所有类是以包的形式进行组织和管理
-
所有类之间的访问权限是以包为单位
-
功能相近的类放在同一个包中(可以方便查找和使用)
-
不同包中可以存在同名类(通过包可以避免命名冲突)
默认包
-
默认包没有包名,所以不能被其他包所引用
创建包
package 包名;
-
包的命名一般是由小写字母和点号组成
-
为了确保包命名的唯一性,Sun 公司建议一般采用互联网域名的逆序作为包名例如:com. dtinone
注意:创建 Java 源文件必须有包,不再允许使用默认包
导入包
import 包名;
-
可以导入自己创建的包、JDK 类库包或第三方类库包
-
导入包后包中所有类即可被使用
-
JDK 类库中 java.lang 包是由编译器自动导入
Jar 包和 Java 包区别
-
Java 包(package):组织管理类(相当于文件夹)
-
Jar 包:压缩 Java 包(相当于压缩文件)
访问权限修饰符
Java 中类、属性(或成员变量)、方法和构造器都有一个访问权限修饰符,用来控制被外部访问的权限
Java 有四种访问权限修饰符
public(公开访问级别)
-
用 public 关键字修饰的成员(类、属性、方法、构造器)
-
对外公开,一般称“公有的”,可以同一包访问,而且可以不同包访问
protected(受保护访问级别)
-
用 protected 关键字修饰的成员(类、属性、方法、构造器)
-
一般称“受保护的”,只能被类本身的方法及子类访问(即使子类在不同的包中也可以访问)
无关键字(默认访问级别)
-
无关键字修饰的成员(类、属性、方法、构造器)
-
一般称“默认访问模式“,只允许在同一个包中进行访问(可以被所在包中的其它类访问)
private(私有访问级别)
-
用 private 关键字修饰的成员(类、属性、方法、构造器)
-
不对外公开,一般称“私有的,只能被该类的对象访问(其子类不能访问,不同包也不能访问)
访问权限修饰符的作用
-
对外开放
-
封装隐藏
什么是内部类
内部类就是 Java 语言中在类的内部定义类,内部类所在的类称为外部类
-
内部类同普通类一样,需要编译并生成独立的 Class 文件,可以实例化对象
-
内部类使用非常灵活,掌握难度比较大,但合理的使用内部类可以编写出更为优雅和高效的程序
静态内部类
public class Outer { //定义静态内部类 static class Inner { … } }
静态内部类只可以访问外部类的静态成员变量和静态方法(包括私有的静态成员变量和静态方法)
静态内部类是最简单的内部类形式
成员内部类
public class Outer { //定义成员内部类 class Inner { … } }
成员内部类可以访问外部类的所有成员变量和方法(包括静态或非静态成员变量和方法)
局部内部类
public class Outer { void methodName { //定义局部内部类 class Inner { … } } }
局部内部类在方法中定义,只能在方法中使用(即只能在方法当中实例化局部内部类对象,并调用其定义的方法)
最少用的内部类形式
匿名内部类
new class 或 interface ( ) { //匿名内部类的主体 }
-
匿名内部类是没有类名的局部内部类(不使用关键字class、extends等且没有构造器)
-
匿名内部类的定义和对象实例化合并在一起(只需要实例化类的一个对象,使用匿名内部类可以使代码更为简洁)
-
匿名内部类隐式地继承一个父类或实现了一个接口(匿名内部类在编程中使用得比较多,通常作为一个方法参数使用)
最有用的内部类形式
内部类的作用
很好实现数据隐藏
内部类允许类有 private 与 protected 访问权限( 普通类只允许 public )
拥有外部类所有访问权限
内部类访问外部类不受外部类的访问权限约束或限制
间接实现多重继承
它是 Java 设计者设计内部类的最大理由之一,正是由于内部类的存在使得Java 的继承机制更加完善
解决多接口同名方法问题