抽象类
一、抽象类的概述
当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了。
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
二、抽象类的特点
①抽象类和抽象方法必须使用 abstract 关键字修饰
②抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
③抽象类不能实例化
④抽象类可以有构造方法
⑤抽象类的子类
要么重写抽象类中的所有抽象方法,要么是抽象类
//抽象类的定义
public abstract class 类名 {}
//抽象方法的定义
public abstract void eat();
三、 抽象类的案例
案例需求:
定义猫类(Cat)和狗类(Dog)
猫类成员方法:eat(猫吃鱼)drink(喝水…)
狗类成员方法:eat(狗吃肉)drink(喝水…)
//动物类:猫、狗共有的属性
abstract class Animal {
public void drink(){
System.out.println("喝水");
}
public Animal(){
}
public abstract void eat();
}
//猫类
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
//狗类
class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
//测试方法
public class Demo{
public static void main(String[] args) {
Dog d = new Dog();
d.eat(); //输出:狗吃肉
d.drink(); //输出:喝水
Cat c = new Cat();
c.eat(); //输出:猫吃鱼
c.drink(); //输出:喝水
//Animal a = new Animal();
//a.eat();
}
}
接口
一、接口的概述
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中接口存在的两个意义:
①用来定义规范
②用来做功能的拓展
二、接口的特点
①接口用关键字interface修饰
public interface 接口名 {}
②接口和类是实现关系,类实现接口用implements表示
public class 类名 implements 接口名 {}
③接口不能实例化
我们可以创建接口的实现类对象使用
④接口的子类
要么重写接口中的所有抽象方法,要么子类也是抽象类
三、接口的成员变量与成员方法的特点
①成员变量
只能是常量,默认修饰符:public static final
②成员方法
只能是抽象方法,默认修饰符:public abstract
③构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
//接口
interface Inter {
public static final int NUM = 10;
public abstract void show();
}
//实现类
class InterImpl implements Inter{
public void method(){
//NUM = 20;//编译时报错
System.out.println(NUM);
}
public void show(){}
}
//测试类
public class Demo{
public static void main(String[] args) {
InterImpl in=new InterImpl();
in.method(); //输出:10
System.out.println(Inter.NUM); //输出:10
}
}
四、类与接口的关系
①类与类的关系
继承关系,只能单继承,但是可以多层继承。
②类与接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。
③接口与接口的关系
继承关系,可以单继承,也可以多继承。
五、拓展知识:接口组成更新
①接口组成更新概述
1、常量:public static final
2、抽象方法:public abstract
3、默认方法(Java 8)
4、静态方法(Java 8)
5、私有方法(Java 9)
②接口中的默认方法
格式:public default 返回值类型 方法名(参数列表) { }
作用:解决接口升级的问题
注意事项:
1、默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字
2、public可以省略,default不能省略
3、如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写
③接口中的静态方法
格式:public static 返回值类型 方法名(参数列表) { }
注意事项:
1、静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
2、public可以省略,static不能省略
④接口中的私有方法
私有方法产生原因:Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性。
格式1:private 返回值类型 方法名(参数列表) { }
格式2:private static 返回值类型 方法名(参数列表) { }
注意事项:
1、默认方法可以调用私有的静态方法和非静态方法
2、静态方法只能调用私有的静态方法
public interface Inter{
//抽象方法
public abstract void test();
//接口中的默认方法
public default void show1(){
System.out.println("show1.....")
}
//接口中的静态方法
public static void show2(){
System.out.println("show2.....")
}
//接口中的私有方法(Java9)
private void show3(){
System.out.println("show3.....")
}
}