内部类
内部类:成员内部类和局部内部类(匿名类)
- 成员内部类:格式: 修饰符 class 外部类名称{
修饰符 class 内部类名称(定义在类的内部)
}
内用外,随意访问,外用内,需要内部类对象
a) 间接方式:在外部类的方法当中,使用内部类,然后main只是调用外部类的方法;直接方式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称;
b) 内部类调用外部类的成员变量 外部类名称.this.外部类成员变量; - 局部内部类:格式: class 内部类名称(定义在方法的内部,不能用修饰符,因为局部内部类只能供所属方法使用,其他类不能访问)
a) 如果希望访问所在方法的局部变量,那么这个局部变量必须是[有效final的]->被final修饰;原因:
i. .new出来的对象在堆内存当中,局部变量是跟着方法走的,在栈内存当中;方法运行结束之后,立刻出栈,局部变量就会立刻消失;new出来的对象会在堆当中持续存在,直到垃圾回收消失。 - 匿名内部类(lambda表达式前提):格式:接口名称 对象名 = new 接口名称{覆盖重写所有的抽象方法};
a) 使用前提:如果接口的实现类(或者是父类的子类),只需要实现唯一的一次,那么这种情况下就可以省略该类的定义,而改为使用匿名内部类;
b) 匿名内部类创建之后,只能使用一次;
**
接口
**
- 接口就是一种公共规范标准,接口是引用数据类型,其中重要的内容,抽象方法。接口没有静态代码块,没有构造方法;接口不能直接使用,必须有一个类来实现;一个类的接口可以同时实现多个;
a) 格式 public class 实现类名称 implements 接口名称{//……};
b) 实现类必须重写接口中所有的抽象方法;如果没有,那么这个类必须是抽象类 - 接口格式, public interface 接口名称{接口内容},备注:当关键字class换成interface之后,编译生成的字节码文件仍然是:.java -> .class。
- 接口中可以定义的内容:
a) Java 7 :常量,抽象方法(public abstract);
i. 接口中定义的常量,必须用 public static final 三个关键字修饰
b) Java 8 :额外添加:默认方法,静态方法,接口中的默认方法,可以解决接口升级问题
i. 接口的默认方法,可以通过实现类对象直接调用,也可以被接口的默认方法覆盖重写,如果接口中存在
ii. 不能通过接口实现类对象来调用接中的静态方法,可以通过接口直接调用
c) Java 9 :额外添加:私有方法
i. 普通私有方法,解决多个默认方法之间的重复代码问题
ii. 静态私有方法,解决多个静态方法之间的重复代码问题 - 注意事项:接口与接口之间是多继承的
a) 多个父类接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,而且带着default关键字
b) 一个类如果直接父类的方法和接口中的默认方法重名,那么会优先调用父类中的方法