一、抽象类
简单来说:在class前面加上abstract就是一个抽象类。
1.抽象类的特点
1)抽象方法所在的类必须是抽象类
2)抽象类不能实例化,因为抽象类本身就是一个抽象的
3)如果想实现抽象类,创建一个子类去继承它
4)子类继承一个抽象类,子类必须重写抽象里面所有的抽象方法(子类也是抽象类除外)
5)抽象类里面可以定义普通方法
6)抽象类里面有构造方法
2.抽象方法特点:
1)只有方法定义没有方法体
*举例:
动物类(Animal)-抽象方法(eat)-普通方法(sleep)-构造方法(Animal)
//动物类
public abstract class Animal {
//吃饭:动物吃饭,就是一个抽象,因为我不知道具体是什么动物
public abstract void eat(); //抽象方法所在类必须为抽象类,但是抽象类里可以有普通方法。
public void sleep(){
}
public Animal(){
}
}
写两个子类吧- 猫(Cat),狗(Dog)
继承父类用extends,由抽象类特点第3)条,通过子类继承来实现抽象类eat()
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫爱吃鱼");
}
}
狗啃骨头。自己尝试写:
@override怎么调出来?
答:重写父类方法,点鼠标右键的Source,或者菜单栏上的Source菜单,有Override/implement methods。。 从那里选出来的就自动生成这个。出来后方法内容为空,自己添加即可。
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗爱吃骨头");
}
}
Test一下:
public class TestAnimal {
public static void main(String[] args) {
//Animal a=new Animal(); 抽象类不能实例化(即new Animal 违法。)
Dog d=new Dog();
d.eat();
//多态
Animal cat=new Cat();
cat.eat();
}
}
结果:
这就是抽象类的使用。
*小总结:
抽象类VS一般类
- 1.相同点:
抽象类和一般类都是用来描述事物的,都在内部定了成员。 - 2.不同:
1)一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足。
2)一般类中不能定义抽象方法,只能定非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。
3)一般类可以被实例化。抽象类不可以被实例化。 - 3.*注意:
不能用abstract
修饰属性、私有方法、构造器、静态方法、final的方法。
二、接口
:就是多个类之间的公共规范,接口里面的方法都是抽象方法,是一个特殊的抽象类。
1.定义
public interface 接口名{ 常量; }
接口A:
public interface A {
}
这就是一个接口。
其他特点
2.接口里面的成员变量都是常量,默认都会加上"public static final"修饰
3.接口里面的方法默认会被public abstract修饰,也就是我定义的方法不加public abstract,默认也会加上
4.接口不能实例化,抽象类是继承,接口是用来实现的
5.一个类实现了接口,要实现这个接口里面所有的抽象方法
6.一个类可以实现多个接口
7.接口可以继承接口,并可以继承多个接口
8.接口没有构造方法
*小例子(对上面的特点逐一验证介绍)
- 交通工具接口,验证1)2)3)8)
public interface Traffic {
//int a=10;//这是一个常量
//
public static final int A=10;
public abstract void start();//是一个抽象方法
public void add();//是抽象方法
void run();//是
abstract void stop();//是
// public void method(){
// } //无构造方法
}
- 实例化验证4):
(看注释部分)
public class TestTraffic {
public static void main(String[] args) {
//Traffic t=new Traffic(); 这里是不行的。会报错,说明无法实例化
}
- 验证要实现所有的抽象方法5)(接口里面没有普通方法)
建一个汽车类吧,实现交通工具接口
//汽车
public class Car implements Traffic{
@Override
public void start() {
System.out.println("小汽车启动了。。。。。。。");
}
@Override
public void add() {
System.out.println("小汽车加速了。。。。。。。");
}
@Override
public void run() {
System.out.println("小汽车开始跑了。。。。。。。");
}
@Override
public void stop() {
System.out.println("小汽车停止了。。。。。。。");
}
}
全部抽象方法。
- 验证6)一个类可以实现多个接口
同样用汽车类,汽车还可以加油吧。所以建一个加油接口,汽车类调用加油接口来实现加油。
//针对于加油交通工具的接口
public interface Oil {
void addOil();
}
然后是汽车(同时实现交通工具和加油接口)
//小汽车
public class Car implements Traffic,Oil {
@Override
public void start() {
System.out.println("小汽车启动了。。。。。");
}
@Override
public void add() {
System.out.println("小汽车加速了。。。。。。");
}
@Override
public void run() {
System.out.println("小汽车开始跑了。。。。。");
}
@Override
public void stop() {
System.out.println("小汽车停止了。。。");
}
@Override
public void addOil() {
System.out.println("汽车加油");
}
}
- 验证7)接口可继承接口,且可继承多个接口。可自行验证。
前边有个A接口,还有一个Traffic接口。找一个B接口来继承一下这两个接口,看是否报错。不报错则可用。
public interface B extends A,Traffic {
}
就这么简单。
*小总结:
- 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
- 通过接口可以指明多个类需要实现的方法,一般用于定义对象的扩张功能。
- 接口主要用来定义规范。解除耦合关系。
三、抽象类VS接 口
1.相同点
1)都不能被实例化。只能被其他类实现和继承。
2)都可以包含抽象方法,实现的类都必须实现这些抽象方法,否则实现的类就是抽象类。
2.不同点
①定义不同:抽象类abstract
class ;接口 interface
②抽象类可以包含普通的方法;接口不能包含普通方法,只能包含抽象方法;
③抽象类里既可以定义普通属性,也可以定义静态常量;接口里只能定义静态常量属性,不能定义普通属性;
③抽象类可以包含构造方法;接口不包含构造方法。(抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。)
④抽象类可以包含初始化块;接口不包含初始化块
⑤抽象类是继承;接口类是实现。
⑥抽象类是单继承,接口类可以多继承。