Java基础09:面向对象进阶(下)

一、抽象类

1. 抽象类和抽象方法

  • 抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。
  • 抽象方法:将共性的方法抽取到父类之后,由于每一个子类执行的内容不一样,所以在父类中不能确定具体的方法体,该方法就可以定义为抽象方法。
  • 作用:强制让子类按照某种格式重写。

2. 定义格式

  • 抽象类
public abstract class 类名 {}
  • 抽象方法
public abstract 返回值类型 方法名(参数列表);

3. 注意事项

  • 抽象类不能实例化
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
  • 可以有构造方法。
  • 抽象类的子类,要么重写抽象类中的所有方法,要么是抽象类。

二、接口

1. 接口的定义

  • 接口用关键字interface来定义
public interface 接口名 {}
  • 接口不能实例化
  • 接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名 {}
  • 接口的子类(实现类),要么重写接口中的所有抽象方法,要么是抽象类。

2. 注意事项

  1. 接口和类的实现关系,可以单实现,也可以多实现。
public class 类名 implements 接口名1, 接口名2 {}
  1. 实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口名1, 接口名2 {}

3. 接口中成员的特点

  • 成员变量:只能是常量;默认修饰符:public static final
  • 构造方法:没有
  • 成员方法:只能是抽象方法;默认修饰符:public abstract
  • JDK7以前接口中只能定义抽象方法。JDK8接口中可以定义有方法体的方法。JDK9接口中可以定义私有方法。

4. 接口和类之间的关系

  • 类与类的关系:继承关系,只能是单继承,不能是多继承,但是可以多层继承。
  • 类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现镀铬接口。
  • 接口和接口的关系:继承关系,可以单继承,也可以多继承。

5. 接口中的默认方法(JDK8)

  • 允许在接口中定义默认方法,需要使用关键字default修饰。可以写方法体。
  • 作用:解决接口升级的问题。
  • 定义格式:
    public default 返回值类型 方法名(参数列表) {}
    
  • 注意事项
    • 默认方法不是抽象方法,不强制被重写。
    • public 可以省略,default不能省略
    • 如果实现了多个接口,并且多个接口中存在相同名字的默认方法,子类就必须对该方法重写。

6. 接口中的静态方法(JDK8)

  • 允许在接口中定义静态方法,需要用static修饰。可以写方法体。
  • 定义格式:
    public static 返回值类型 方法名(参数列表){}
    
  • 注意事项
    • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。
    • public可以省略,static不能省略
    • 静态方法不需要重写。

7. 接口中的私有方法(JDK9)

  • 不允许外部类访问的方法。
  • 定义格式:
    • 为默认方法服务
      private 返回值类型 方法名(参数列表){}
      
    • 为静态方法服务,默认方法不能调用。
      private static 返回值类型 方法名(参数列表){}
      

8. 接口的应用

  1. 接口代表规则,是行为的抽象。想让哪个类拥有一个行为,就让这个类实现对应的接口。
  2. 但一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称为接口多态。

9. 适配器设计模式

  • 适配器设计模式:用于解决接口与接口实现类之间的矛盾问题——当一个接口中抽象方法过多,但是只要使用其中一部分,就可以哟适配器设计模式。
  • 书写步骤:
    1. 编写中间类XXXAdapter,实现对应的接口;
    2. 对接口中的抽象方法进行空实现
    3. 让真正的实现类继承中间类,并重写需要用的方法;
  • 为了避免其他类创建适配器类的对象,中间的适配器类用abstract修饰。

三、内部类

1. 概念

  • 类的五大成员:属性、方法、构造方法、代码块、内部类。
  • 写在一个类里面的类就叫内部类。
  • 内部类表示的是事物时外部类的一部分,内部类单独存在没有任何意义。

2. 访问特点

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类不能直接访问内部类的成员,必须创建对象

3. 分类

a. 成员内部类

  • 写成成员位置,属于外部类的成员。
  • 可以被一些修饰符修饰,比如private、protected、public等。
  • 获取成员内部类对象:
    • 方式一:当成员内部类被private修饰时,在外部类编写方法,对外提供内部类对象。
    • 方式二:当成员内部类被非私有修饰时,直接创建对象。
      Outer.Inner oi = new Outer().new Inner();
      
  • 访问外部类的成员变量:
    System.out.println(Outer.this.变量名);
    

b. 静态内部类

  • 静态内部类也是成员内部类的一种。
  • 静态内部类只能访问外部类中静态变量和静态方法,如果想要访问非静态的需要创建对象。
  • 创建静态内部类:
    Outer.Inner oi = new Outer.Inner();
    
  • 调用静态内部类中的方法:
    • 非静态方法:先创建对象,用对象调用。
    • 静态方法:
      Outer.Inner.方法名();
      

c. 局部内部类(了解)

  1. 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
  2. 外界是无法直接使用,需要在方法内部创建对象并使用。
  3. 给类可以直接访问外部类的成员,也可以访问方法内的局部变量。

d. 匿名内部类(重要)

  • 匿名内部类本质上就是隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置。
  • 格式:
    new 类名或接口名(){
    	重写方法;
    };
    
  • 注意事项:
    • 包含了继承或实现、方法重写、创建对象。
    • 整体就是一个类的子类对象或者接口的实现类对象。
  • 使用场景:
    • 当方法的参数是接口或者类时,如果接口或类只使用一次,就可以传递这个接口(类)的实现类(子类)对象,简化代码。
public interface Swim {
    public abstract void swim();
}
public class Test {
    public static void main(String[] args) {
        new Swim() {
            @Override
            public void swim() {
                System.out.println("游泳");
            }
        };
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iFulling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值