1.抽象类与抽象方法
1.格式
public abstract 返回值类型 方法表(参数列表); //直接分号结束此方法。
2.抽象类定义
public abstract class 类名{}
1.1.注意事项
①、抽象类不能实例化。②、抽象类中不一定有抽象方法,有抽象方法的一定是抽象类
③、可以有构造方法。④、抽象类的子类要么重写抽象类中所有的抽象方法,要么是抽象类
1.2多态与抽象类的区别
简单理解(一个是类的多种形态,一个是类中行为的多种形态)
- 目的:多态的目的是允许通过统一的接口来使用不同类型的对象,而抽象方法的目的是定义一个必须由子类实现的方法模板。
- 实现:多态可以通过继承和接口实现,而抽象方法则通过在抽象类或接口中声明来实现。
- 使用场景:多态用于运行时动态绑定,而抽象方法用于定义类的行为规范,要求子类必须实现。
- 强制性:多态不是强制性的,子类可以选择不重写父类的方法;而抽象方法则是强制性的,子类必须实现抽象方法
2.接口
2.1接口的定义与使用
接口就是一种规则,是对行为的一种抽象。
2.2接口与类之间的关系
在类与接口的实现过程中,一个类要实现多个接口,必须要重写接口中所有的抽象方法。
接口与接口中,所实现的接口是最底层的接口。那么它必须将父类以上所有的抽象方法也都一一实现。
2.3接口扩展<默认方法>
默认方法格式:public default 返回值类型 方法名(参数列表){}
①、默认方法不是抽象方法,所以不强制被重写。但如果被重写,重写时需要去掉default关键字
②、public可以省略,default不能省略
③、如果实现了多个接口,多个接口中存在相同名字的默认方法,子类必须对该方法进行重写。
静态方法格式:public static 返回值类型 方法名(参数列表){}
①、静态方法只能通过接口名去调用,不能通过实现类名或者对象名去调用。(Inter.show)
在多个接口实现的多个方法中,可能会存在重复的代码。
对于默认的方法,可将重复代码抽象成为普通的私有方法。
对于静态方法,可将重复代码抽象成为静态的私有方法。
2.4 接口适配器
当一个接口中抽象方法过多时,实际只需要一部分时,可以使用适配器模式。
1.编写xxxAdapter,实现对应的接口
2.对接口中的抽象方法实现空实现
3.让真正的实现类继承中间类,并重写需要用的方法。
4.为了避免其他类创建适配器对象,中间的适配器需要用abstract进行修饰。
3.内部类
类的五大成员:属性、方法、构造方法、代码块、内部类
3.1内部类概念
写在一个类里面的类叫做内部类。(B类是A类的一部分,且B存在没有意义)
3.2成员内部类
可以被private,default,protected,public,static修饰
当成员内部类被private修饰时,创建变量时不能够直接调用,需要创建get的变量方法,而后再用创建的对象去调用。
3.3获取成员内部类的两种方式
①.成员变量被非私有修饰时,可直接创建对象并调用。
Outer.Inner oi=new Outer().new Inner();
②.成员变量被私有方式修饰时,可直接创建对象并调用。
1.用get方法调用直接输出
Outer o=new Outer();
System.out.println(o.getInstance());
=====================================================================
2.用object接收,Inner作为私有变量,外界不知道它的存在
Outer o=new Outer();
Outer.Inner inner=o.getInstance();<错误表达>
Object inner=o.getInstance();<正确表达>
JDK16以前在内部类中无法定义静态变量 ,JDK16以后才可以。
3.4内部类的逐级调用
内部类对象中有隐藏的外部类的地址值。
Outer.this是调用外部对象的地址值。this是调用者的地址值。
3.5静态内部类
package a07; public class Outer { int a = 10; static int b = 20; static class Inner { //①.静态内部类也是成员内部类中的一种 public void show1() { //②.静态内部类可以访问外部类中的静态变量和静态方法 Outer o = new Outer(); System.out.println(o.a); //③.如果需要访问非静态的需要创建外部类的对象 System.out.println(b); } } }
3.6局部内部类
写在方法中,与int name变量名称同级。
3.7匿名内部类
1.格式
new 类名或者接口(){
重写方法;
};
=====================
//代码演示
new Swim() { //创建对象<此处也为类的开始>
@Override //方法的重写
public void swim(){
System.out.println;
}
}; //<此处为类的结束>
//同时蕴含着实现关系(后面的大类实现了swim接口)
这个整体实际上是一个对象,真正的类是后面大括号里面的那部分。如果括号前面是类,那便是继承关系,如果前面是接口那就是实现关系。(所以实质就是一个类的子类对象或者是接口的实现类对象)
3.8匿名内部类隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置。