抽象类和接口
1.抽象类
-
abstract修饰类
-
继承抽象类的子类必须要实现抽象父类的抽象方法
除非子类本身也是一个抽象类 -
如果继承抽象类的子类也是抽象类,则可以不用实现父类的抽象方法
-
抽象类中也可以有具体方法和抽象方法,也可以有属性(与接口比较),抽象类不能被实例化
接口中可以有属性,不能有普通方法,不能有构造函数 -
一个子类也只能继承一个抽象类(implement实现接口可以有多个)
2.抽象方法 -
抽象方法没有方法体
-
抽象方法必须在抽象类中
-
抽象方法必须被子类实现,除非子类也是抽象类
3.多态
多态是同一个行为具有多个不同表现形式或形态的能力
Java中多态的体现 -
类的继承
-
方法重载
-
方法重写
-
接口实现
`public abstract class Animal {
//抽象方法
public abstract void eat() ;
}`
public class Cat extends Animal{
public void eat() {
System.out.println("健康值+5");
}
}
public class Dog extends Animal{
public void eat() {
System.out.println("健康值+3");
}
}
public class Master {
//多态的表现形式
public void feed(Animal animal) {
animal.eat();
}
public static void main(String[] args) {
Animal cat=new Cat();
Master master=new Master();
master.feed(cat);
}
// public static void main(String[] args) {
// Cat cat=new Cat();
// cat.eat();
//
// Dog dog=new Dog();
// dog.eat();
// }
}
4.接口
接口中不可以定义成员变量,但可以定义常量
(1)为什么要使用接口
- 只有抽象方法的抽象类,可以用接口来表示
- 接口有比抽象类更好的特性
(2)优点 - 可以被多继承(一个类可以实现多个接口)
- 设计和实现完全分离
- 更自然的使用多态
- 更容易搭建程序框架
- 更容易更换实现
(3)特点 - 接口不能被实例化(不能构造接口的对象)
- 实现类必须实现接口的所有方法
- 实现类可以实现多个接口
- 接口中的变量都是静态常量
- Java中的多继承
能声明接口的变量:接口变量必须引用实现了接口的类对象
/**
* 定义一个HomeLetter接口
* @author Administrator
*
*/
public interface HomeLetter {
public String writeTitle(); //书写称谓
public String writeHello(); //书写问候
public String writeBody(); //书写内容
public String writeGreeting(); //书写祝福
public String writeSelft(); //书写落款
}
public class HomeLetterImpl implements HomeLetter{
/**
* 实现接口中的所有方法
*/
@Override
public String writeTitle() {
return "亲爱的爸爸、妈妈:";
}
@Override
public String writeHello() {
return "你们好嘛?";
}
@Override
public String writeBody() {
return "我在这里挺好的"+"\n"+"我会努力学习的,已经需要Java OOP了!"+"\n"+
"您二老保重身体啊";
}
@Override
public String writeGreeting() {
return " "+"此致"+"\n"+"敬礼";
}
@Override
public String writeSelft() {
return "\t\t"+"周杰"+"\n"+"\t"+"2017年1月1日";
}
}
public class Write {
public void show() {
HomeLetter hl=new HomeLetterImpl();
System.out.println(hl.writeTitle());
System.out.println();
System.out.println(hl.writeHello());
System.out.println(hl.writeBody());
System.out.println();
System.out.println(hl.writeGreeting());
System.out.println(hl.writeSelft());
}
}
public class Test {
public static void main(String[] args) {
Write write=new Write();
write.show();
}
}