目录
抽象类
1、 概念
抽象类是一种不能实例化的类,它只能作为其他类的父类来使用。它的主要作用是定义类的模板和规范,提供一个公共的接口供子类实现。抽象类通过使用abstract
关键字来声明,并且可以包含抽象方法和非抽象方法。
2 、特点
抽象类不能被实例化,只能被继承。
抽象类可以包含抽象方法和非抽象方法。
抽象方法只有声明而没有实现,子类必须实现抽象方法。
如果一个类继承了抽象类,那么它必须实现所有抽象方法,或者自己也声明为抽象类。
3 、示例代码
// 抽象类
abstract class Animal {
abstract void eat(); // 抽象方法
void sleep() {
System.out.println("动物在睡觉");
}
}
// 子类实现抽象类
class Dog extends Animal {
@Override
void eat() {
System.out.println("狗在吃东西");
}
}
// 测试类
public class AbstractClassExample {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.sleep();
}
}
输出结果:
狗在吃东西
动物在睡觉
接口
1、 概念
接口是一种定义类的行为和功能的规范。它类似于抽象类,但是只能包含常量和抽象方法,不能包含实例变量和非抽象方法。接口通过使用interface关键字来声明,并且可以被类实现(使用关键字implements
)。
2 、特点
接口不能被实例化,只能被类实现。
接口只能包含常量和抽象方法,不能包含实例变量和非抽象方法。
类实现接口时,必须实现接口中的所有抽象方法。
类可以实现多个接口,实现多继承的效果。
3 、示例代码
// 接口
interface Animal {
void eat(); // 抽象方法
void sleep(); // 抽象方法
}
// 实现接口的类
class Dog implements Animal {
@Override
public void eat() {
System.out.println("狗在吃东西");
}
@Override
public void sleep() {
System.out.println("狗在睡觉");
}
}
// 测试类
public class InterfaceExample {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.sleep();
}
}
输出结果:
狗在吃东西
狗在睡觉
抽象类和接口
1、 相同点
都是用于定义类的模板和规范。
都不能被实例化,只能被继承或实现。
都可以包含抽象方法。
都可以被子类继承或实现,并且必须实现抽象方法。
2、 不同点
抽象类可以包含非抽象方法,而接口只能包含抽象方法和常量。
类只能继承一个抽象类,但是可以实现多个接口。
抽象类提供了一种代码复用的机制,而接口提供了一种多继承的方式。
3、 如何选择
如果需要定义类的模板,并且希望提供一些默认的实现,可以使用抽象类。如果需要定义类的行为规范,并且希望实现多继承的效果,可以使用接口。在设计代码时,根据具体的需求和设计原则来选择使用抽象类还是接口。
综合案例
public abstract class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public abstract class Coach extends Person{
public Coach() {
super();
}
public Coach(String name, int age) {
super(name, age);
}
public abstract void action();
}
public class BasketballCoach extends Coach{
public BasketballCoach() {
super();
}
public BasketballCoach(String name, int age) {
super(name, age);
}
@Override
public void action() {
System.out.println("教篮球");
}
}
public class PingpongCoach extends Coach implements SpeakingEnglish{
public PingpongCoach() {
super();
}
public PingpongCoach(String name, int age) {
super(name, age);
}
@Override
public void action() {
System.out.println("教乒乓球");
}
@Override
public void speakingEnglish() {
System.out.println("学英语");
}
}
import com.self.test.polymophic.Animal;
public abstract class Sportsmen extends Person{
public Sportsmen() {
super();
}
public Sportsmen(String name, int age) {
super(name, age);
}
public abstract void action();
}
public class Basketball extends Sportsmen{
public Basketball() {
super();
}
public Basketball(String name, int age) {
super(name, age);
}
@Override
public void action() {
System.out.println("打篮球");
}
}
public class Pingpong extends Sportsmen implements SpeakingEnglish{
public Pingpong() {
super();
}
public Pingpong(String name, int age) {
super(name, age);
}
@Override
public void action() {
System.out.println("打乒乓球");
}
@Override
public void speakingEnglish() {
System.out.println("学英语");
}
}
public interface SpeakingEnglish {
void speakingEnglish();
}
public class Test {
public static void main(String[] args) {
Pingpong per = new Pingpong("XX",20);
System.out.println(per.getName() + "," + per.getAge());
per.action();
per.speakingEnglish();
}
}