抽象类
-
为什么使用抽象类?
把多个共性的东西提取到一个类中,这是继承的做法。但是有时我们不想将具体实现抽取出来,而仅仅需要抽取共性的行为即可,此时,我们就需要抽象方法。一个没有具体的方法体的方法是抽象的方法。 在一个类中如果有抽象方法,该类必须定义为抽象类。 -
抽象类的特点
A:抽象类和抽象方法必须用关键字abstract修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
C:抽象类不能实例化
D:抽象类的子类
a:是一个抽象类。
b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。 -
抽象类的成员特点:
A:成员变量
有变量,有常量
B:构造方法
有构造方法
C:成员方法
有抽象,有非抽象 -
抽象类的几个小问题
A:抽象类有构造方法,不能实例化,那么构造方法有什么用?
用于子类访问父类数据的初始化
B:一个类如果没有抽象方法,却定义为了抽象类,有什么用?
为了不让创建对象 -
代码演示
动物抽象类:
public abstract class Animal {
//成员变量
private String name;//可以是变量
private final String type = "动物";//也可以是常量
//构造方法
public Animal(String name) {
this.name = name;
}
//抽象方法
public abstract void eat();
//非抽象方法
public void show(){
System.out.println("我是"+type+",我的名字是"+name);
}
}
狗,实现类
public class Dog extends Animal{
//当父类没有无参构造时,实现类需要重写带参构造
public Dog(String name) {
super(name);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
猫,实现类
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
public void eat() {
System.out.println("猫吃老鼠");
}
}
测试
@Test
public void test1() {
Animal animal = new Dog("王富贵");
animal.eat();
animal.show();
System.out.println("--------------");
Cat cat = new Cat("汤姆");
cat.eat();
cat.show();
}
运行结果
狗吃骨头
我是动物,我的名字是王富贵
--------------
猫吃老鼠
我是动物,我的名字是汤姆
接口
-
为什么使用接口?
由抽象类我们可知,它可以将一些类共性的东西提取出来,然而当我们需要一些特定的行为(方法)该怎么办呢?比如,借鉴上面的猫狗案例,我希望狗有看家的能力,而猫有跳高的能力。我们就可以通过实现接口的方式实现了。 -
接口的特点:
A:接口用关键字interface修饰
interface 接口名 {}
B:类实现接口用implements修饰
class 类名 implements 接口名 {}
C:接口不能实例化
D:接口的实现类
a:是一个抽象类。
b:是一个具体类,这个类必须重写接口中的所有抽象方法。 -
接口的成员特点:
A:成员变量
只能是常量
默认修饰符:public static final
B:构造方法
没有构造方法
C:成员方法
只能是抽象的
默认修饰符:public abstract -
类与类,类与接口,接口与接口
A:类与类
继承关系,只能单继承,可以多层继承
B:类与接口
实现关系,可以单实现,也可以多实现。
还可以在继承一个类的同时,实现多个接口
C:接口与接口
继承关系,可以单继承,也可以多继承 -
代码演示
两个接口
public interface Jump {
void Jump();
}
public interface LookHome {
void lookHome();
}
猫实现Jump
public class Cat extends Animal implements Jump{
public Cat(String name) {
super(name);
}
public void eat() {
System.out.println("猫吃老鼠");
}
public void Jump() {
System.out.println("我能跳高");
}
}
狗实现看家
public class Dog extends Animal implements LookHome{
public Dog(String name) {
super(name);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void lookHome() {
System.out.println("我能看家");
}
}
测试
@Test
public void test1() {
Dog dog = new Dog("王富贵");
dog.eat();
dog.show();
dog.lookHome();
System.out.println("--------------");
Cat cat = new Cat("汤姆");
cat.eat();
cat.show();
cat.Jump();
}
运行结果
狗吃骨头
我是动物,我的名字是王富贵
我能看家
--------------
猫吃老鼠
我是动物,我的名字是汤姆
我能跳高