一、权限修饰符
Java提供public、protected、默认、private 4种访问控制符,在类、成员变量、成员方法的前面可以使用访问控制符关键字,没有显示使用的均为默认控制类型。
1. public
public 访问权限最具开放性。修饰为 public 的类可以被其他任何类及成员访问和引用。简单来说就是由 public 修饰的类或者类成员可以被任何类访问,其既可以位于同一个包中,也可以位于不同包中。
2. protected
protected 可以用来修饰类的成员变量或方法。被它修饰的类成员可以被本类、本包中的其他类和其他包中的子类访问。
3. 默认
如果在定义类、接口、成员变量、成员方法时没有指定访问权限控制符,其权限就为默认权限。默认的时候只能被本类和同一个包中的其他类。
4. private
私有访问控制 private 用来声明类的私有成员,它提供了最高保护级别。被它修饰的成员变量或方法只能被该类自身所访问和修改。
上述4种访问权限控制符可访问权限总结如下表:
本类 | 本包 | 不同包中的子类 | 不同包中的所有类 | |
---|---|---|---|---|
private | ✔ | |||
默认 | ✔ | ✔ | ||
protected | ✔ | ✔ | ✔ | |
public | ✔ | ✔ | ✔ | ✔ |
二、内部类
Java支持在一个类中声明另一个类,这样的类称为内部类,而包含内部类的类称为外部类。内部类一般来实现一些没有通用意义的功能逻辑。内部类的使用要依赖于外部类。
定义内部类比较简单,只需将类的定义放在一个用于封装它的外部类的类体内部即可。根据位置不同可以分为成员内部类和局部内部类。在成员位置定义的类称为成员内部类,定义在局部位置的类称为局部内部类。在测试类中访问内部类的格式为:
外部类名.内部类名 对象名 = 外部类对象.内部类对象
在内部类中可以随意访问外部类的成员方法和成员变量,尽管这些类成员被修饰为private。成员被静态修饰后的访问方式是:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
局部内部类可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能;并且局部内部类访问局部变量必须用final修饰,因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。
三、匿名内部类
匿名内部类就是局部内部类的简单写法,匿名内部类的前提是有一个类或者接口(类可以是抽象类)。匿名内部类的实现代码为:
new A(){
重写方法;
};
匿名内部类的本质是一个对象(继承了该类或者实现了该接口的匿名对象)。与类有关的匿名类举例如下:
abstract class Student{
abstract void speak();
}
class Teacher{
void look(Student a){
a.speak();
}
}
public class Ex5 {
public static void main(String[] args) {
Teacher zhang=new Teacher();
Student liu=new Student() {
@Override
void speak() {
System.out.println("这是匿名类中的方法");
}
};
zhang.look(liu);
}
}
程序运行结果如下:
这是匿名类中的方法
在上例中,抽象类 Student 中包含抽象方法 speak(),因此不能直接创建实例对象,但是在main() 方法中直接使用匿名对象创建了一个对象,创建过程中需要重写抽象方法。