我是目录:
1、抽象类:
(1) 含有abstract修饰符的class即为抽象类,在方法前加上 abstract 关键字, 表示这是一个抽象方法. 同时抽象方法没有方法体(没有 { }, 不能执行具体代码)
abstract class Shape {
abstract public void draw();
}
(2)abstract 类不能创建实例对象
Shape shape = new Shape();
// 编译出错
Error:(30, 23) java: Shape是抽象的; 无法实例化
(3)抽象方法不能是 private 的
abstract class Shape {
abstract private void draw();
}
// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstract和private
(4)抽象类中可以包含其他的非抽象方法, 也可以包含字段. 这个非抽象方法和普通方法的规则都是一样的, 可以被重写,也可以被子类直接调用
abstract class Shape {
abstract public void draw();
void func() {
System.out.println("func");
}
}
class Rect extends Shape {
...
}
public class Test {
public static void main(String[] args) {
Shape shape = new Rect();
shape.func();
}
}
// 执行结果
func
2、接口:
(1)接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
接口不能被单独实例化
interface IShape {
void draw();
public static final int num = 10;
}
class Cycle implements IShape {
@Override
public void draw() {
System.out.println("○");
}
}
public class Test {
public static void main(String[] args) {
IShape shape = new Rect();
shape.draw();
}
}
(2)有的时候我们需要让一个类同时继承自多个父类. 这件事情在有些编程语言通过 多继承 的方式来实现的.
然而 Java 中 只支持单继承, 一个类只能 extends 一个父类. 但是可以 同时实现多个接口 , 也能达到多继承类似的效果。
现在我们通过类来表示一组动物:
// 定义一个父类 动物
class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
// 定义三个接口
interface IFlying {
void fly();
}
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 创建一个子类 猫
class Cat extends Animal implements IRunning {
public Cat(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "正在用四条腿跑");
}
}
// 创建一个子类 鸭子
class Duck extends Animal implements IRunning, ISwimming, IFlying {
public Duck(String name) {
super(name);
}
@Override
public void fly() {
System.out.println(this.name + "正在用翅膀飞");
}
@Override
public void run() {
System.out.println(this.name + "正在用两条腿跑");
}
@Override
public void swim() {
System.out.println(this.name + "正在漂在水上");
}
}
多态的好处, 让程序猿忘记类型.。。有了接口之后, 类的使用者就不必关注具体类型, 而
只关注某个类是否具备某种能力.
(3)接口间的继承:
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}
class Frog implements IAmphibious {
...
}
3、抽象类和接口的异同:
(1)相同:
- 不能实例化
- 可以将抽象类和接口类型作为引用类型
- 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类
(2)核心区别:
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法.
(抽象类存在的意义是为了让编译器更好的校验)
抽象类 | 接口 |
---|---|
普通类+抽象(非抽象)方法+构造方法 | 抽象方法+全局变量 |
各种权限 | public |
使用 extends 继承抽象类 | 使用 implements 实现接口 |
一个抽象类可以实现若干接口 | 接口不能继承抽象类,但是接口可以使用 extends 继承多个父接口 |
一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |
看到这里的小伙伴,觉得对你有用的话,点个赞,给个关注再走呗!!!