Java四大特性(抽象、封装、继承、多态)
一、类
(一)同级类
在一个.java 文件中可以有多个同级类(和 public 一样的位置,注意不是内部类),编译一个 java 文件会生成多个 class 文件。修饰符只可以 abstract/final/和无修饰符,不能是其他的 protected/private/public等修饰符。一个.java文件最多有一个public修饰的类名。
(二)内部类
内部类是一个类当中的一个类,相当于一个类进行了嵌套,就如同循环的嵌套一般。
内部类有一个特征:内部类当中可以调用外部类当中的属性和方法,而外部类却不能调用内部类当中的。
1.静态内部类
- 作为类的静态成员,存在于某个类的内部。
- 静态内部类虽然是外部类的成员,但是在未创建外部类的对象的情况下,可以直接创建静态内部类的对象。静态内部类可以引用外部类的静态成员变量和静态方法,但不能引用外部类的普通成员。
2.成员内部类
-
作为类的成员,存在于某个类的内部。
-
成员内部类可以调用外部类的所有成员,但只有在创建了外部类的对象后,才能调用外部的成员。
3.局部内部类
- 存在于某个方法的内部。
- 局部内部类只能在方法内部中使用,内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法的执行完毕就被销毁。当外部类的方法结束时,局部变量就会被销毁了,但是内部类对象可能还存在 (只有没有人再引用它时,才会死亡)。
4.匿名内部类
- 匿名内部类之所以匿名是因为匿名内部类的具体名字不会被我们在程序当众编写出来,因为它已经在主方法当中被实例化了。
- 匿名内部类可以继承两类数据结构:抽象类或者接口。
- 存在于某个类的内部,但是无类名的类。
// 语法
new 类或者接口的名字 (){
/**
*匿名内部类的主体,大括号中是匿名内部类的主体,这个主体就是类或者接口的实现,
*如果是类,那么匿名内部类是该类的子类,如果是接口,匿名内部类需要完成接口的实现。
**/
}
【代码示例】
class people{
public void show(Message message){
message.show();
System.out.println("people的show打印");
}
}
class Message{
public void show(){
System.out.println("这是message的show方法");
}
}
public class Demo {
public static void main(String args[]){
people p = new people();
p.show(new Message(){
public void show(){
// super.show();
System.out.println("匿名内部类的打印");
}
});
}
}
// 运行结果
匿名内部类的打印
people的show打印
5.局部内部类和匿名内部类只能访问 final 的局部变量
当外部类的方法结束时,局部变量就会被销毁了,但是内部类对象可能还存在。
第一个问题:内部类对象访问了一个不存在的变量。为了解决这个问题,就将局部变量复制了一份作为内部类的成员变量,这样当局部变量死亡后,内部类仍可以访问它,实际访问的是局部变量的”copy”。这样就好像延长了局部变量的生命周期。
第二个问题:将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部类中修改了成员变量,方法中的局部变量也得跟着改变,但是将局部变量设置为 final