(七)Java面向对象进阶知识3

目录

1.抽象类abstract

2.接口

3.内部类

3.1成员内部类

3.2静态内部类&局部内部类

3.3匿名内部类


1.抽象类abstract

在面向对象编程中我们会抽取不同Javabean类中的共性部分定义为父类,这就是继承的由来,子类往往需要去重写父类的方法,但是如果Javabean特别复杂就有可能忘记,这时候就可以把方法定义为抽象方法,父类也就成为了抽象类。

public abstract class Animal {
    public abstract void eat();
}

抽象类和抽象方法的注意事项:

  • 抽象类不能实例化,用于继承
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 可以有构造方法(用于创建子类对象时,给属性赋值)
  • 抽象类的子类要么重写抽象类中的所有抽象方法,要么是抽象类

2.接口

接口就是一种规则,是对行为的抽象

  • 接口用关键字interface来定义,public interface 接口名 {}
  • 接口不能实例化
  • 接口和类之间是实现关系,通过implements关键字表示
  • 接口和接口的关系:继承关系,可以单继承,也可以多继承
  • public class 类名 implements 接口名 {}
  • 接口的子类(实现类)
public interface swim {
    public abstract void swim();
}

接口中成员的特点:

  1. 成员变量:只能是常量,默认修饰符:public static final
  2. 构造方法:无
  3. 成员方法:只能是抽象方法,默认修饰符:public abstract

JDK8之后接口新增了有方法体的方法,不需要实现类立即重写,因为在实际开发中如果全是没有方法体的抽象方法,一旦接口发生修改,所有实现类都会报错,也得立即去修改,这样很不方便不合理,所以在JDK8以后接口中新增的方法:

  1. 允许在接口中定义默认方法,需要使用关键字 default 修饰,作用:解决接口升级的问题
  2. 允许在接口中定义定义静态方法,需要用static修饰

接口中默认方法的定义格式:

  • 格式:public default 返回值类型 方法名(参数列表){}
  • 范例:public default void show(){}

接口中静态方法的定义格式:

  • 格式:public static 返回值类型 方法名(参数列表){}
  • 范例:public static void show(){}

接口中默认方法的注意事项:

  • 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
  • public可以省略,default不能省略,因为没有default就默认为abstract
  • 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写

接口中静态方法的注意事项:

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用(因为是static)
  • public可以省略,static不能省略

3.内部类

写在一个类里面的类

public class Car{  //外部类
    String name;
    int Carage;
    int CarColor;
    class engine{ //内部类
        String engineName;
        int engineAge;
    }
}

内部类的访问特点:

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

3.1成员内部类

位于成员位置的内部类,地位和成员方法一样,创建成员内部类对象可以利用链式编程

Outer.Inner oi = new Outer().new Inner();

3.2静态内部类&局部内部类

静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。

public class car {
    String name;
    static class engine{
        
    }
}

3.3匿名内部类

是一种隐藏了名字的内部类,开发过程中经常需要使用,可以写在成员位置,也可以写在局部位置。书写格式:

new 类名或者接口名(){
     重写方法;
};
//正常实现接口的类,实现一个接口需要定义一个新的类,很麻烦
public class person implements Swim {
    @Override
    public void Swim(){
        System.out.println("重写了接口的方法");
    }
}
//匿名内部类
new Swim(){
    @Override
    public void swim() {
        System.out.println("重写了接口的方法");
    }
};

使用场景:当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码,比如事件监听中经常用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值