本章目标

  • 掌握如何使用包组织类

  • 掌握访问权限修饰符

  • 重点掌握内部类的使用方式(难点)


什么是包(package)

包是 Java 中组织和管理类的一种机制,它可以防止类命名冲突和提供类访问权限控制

包的基本功能

  • 所有类是以包的形式进行组织和管理

  • 所有类之间的访问权限是以包为单位

  • 功能相近的类放在同一个包中(可以方便查找和使用)

  • 不同包中可以存在同名类(通过包可以避免命名冲突)

默认包

默认包( default 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 classinterface ( ) {
  //匿名内部类的主体
}
  • 匿名内部类是没有类名的局部内部类(不使用关键字class、extends等且没有构造器)

  • 匿名内部类的定义和对象实例化合并在一起(只需要实例化类的一个对象,使用匿名内部类可以使代码更为简洁)

  • 匿名内部类隐式地继承一个父类或实现了一个接口(匿名内部类在编程中使用得比较多,通常作为一个方法参数使用)

最有用的内部类形式

内部类的作用

很好实现数据隐藏

内部类允许类有 private 与 protected 访问权限( 普通类只允许 public )

拥有外部类所有访问权限

内部类访问外部类不受外部类的访问权限约束或限制

间接实现多重继承

它是 Java 设计者设计内部类的最大理由之一,正是由于内部类的存在使得Java 的继承机制更加完善

解决多接口同名方法问题

内部类可以解决实现类同时实现多个接口存在方法名相同不同但返回值类型不同的问题