一、抽象类与抽象方法
//抽象类
public abstract class Pet {
//抽象方法
public abstract void Dog() ;
}
在“多态”中已经叙述了抽象类和抽象方法的概念,现在继续补充详细说明。
1、抽象类和普通类的区别
- 抽象类不能被实例化(但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例)
- 普通类可以被实例化
2、抽象方法和普通方法的区别
- 有无方法体
3、抽象类和抽象方法的使用
- 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类
- 如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
- 没有抽象构造方法,也没有抽象静态方法
- 抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
二、接口
接口:在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。接口并不是类。一个类通过继承接口的方式,从而来继承接口的抽象方法。
所有方法默认都是 public abstrsct:
public interface MyInterface {
public void foo();
//其他方法
}
接口的特性:
- 接口没有构造方法,不可以被实例化
- 实现类必须实现接口的所有方法,除非这个类为抽象类
- 实现类可以实现多个接口(implements、多个接口使用逗号隔开)
- 接口中的变量都是静态常量(public static final)
- 一个接口不能实现另一个接口,但可以继承其他多个接口
抽象类和接口:
相同点:
- 代表系统的抽象层
- 都不能被实例化
- 都能包含抽象方法(用于描述系统提供的服务,不必提供具体实现)
不同点:
- 在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
- 一个类只能继承一个直接的父类,但可以实现多个接口
使用原则:
- 接口做系统与外界交互的窗口(接口提供服务)
- 接口本身一旦制定,就不允许随意修改
- 抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点
抽象类便于复用,接口便于代码维护
练习:
父类:
public class HandSet {
public HandSet() {
}
public HandSet(String brand, String type) {
this.brand = brand;
this.type = type;
}
private String brand;
private String type;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void prent(){
System.out.println(getBrand()+getType());
}
public void sendInfo(){
System.out.println("发信息");
}
public void call (){
System.out.println("打电话");
}
public void info(){
System.out.println("信息");
}
}
接口1:
public interface Network {
public void networkConn();
}
接口2:
public interface PlayWiring {
public void play();
}
接口3:
public interface TheakePictures{
public void takePictures();
}
子类1:
public class AptitudeHandset extends HandSet implements Network,TheakePictures,PlayWiring{
@Override
public void networkConn() {
System.out.println("上网");
}
@Override
public void play() {
System.out.println("播放视频");
}
@Override
public void takePictures() {
System.out.println("照相");
}
}
子类2:
public class CommonHandset extends HandSet implements PlayWiring{
@Override
public void play() {
System.out.println("播放音频");
}
}
主方法:
public class Test {
public static void main(String[] args) {
HandSet common = new HandSet("中国","普通手机");
HandSet aptitude = new HandSet("中国","智能手机");
AptitudeHandset a = new AptitudeHandset();
CommonHandset c = new CommonHandset();
// System.out.println("普通手机");
common.prent();
c.sendInfo();
c.call();
c.info();
c.play();
aptitude.prent();
a.sendInfo();
a.call();
a.info();
a.networkConn();
a.play();
a.takePictures();
}
}