目录
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();
}
接口中成员的特点:
- 成员变量:只能是常量,默认修饰符:public static final
- 构造方法:无
- 成员方法:只能是抽象方法,默认修饰符:public abstract
JDK8之后接口新增了有方法体的方法,不需要实现类立即重写,因为在实际开发中如果全是没有方法体的抽象方法,一旦接口发生修改,所有实现类都会报错,也得立即去修改,这样很不方便不合理,所以在JDK8以后接口中新增的方法:
- 允许在接口中定义默认方法,需要使用关键字 default 修饰,作用:解决接口升级的问题
- 允许在接口中定义定义静态方法,需要用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("重写了接口的方法");
}
};
使用场景:当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码,比如事件监听中经常用到。