生活中的抽象
抽象类的概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类的特性
- 抽象类不能被实例化
- 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用
- 在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口
抽象类和普通类的区别
抽象方法与抽象类的使用
public abstract class Base {
// A
public abstract void method1();
public abstract void method2();
public void method3(){}
// B
//public abstract Base(){}
//static abstract void method4();
// C
public Base(){
System.out.println("父类的无参构造方法");
}
// B
static void method4(){
System.out.print("静态方法表示类所特有的功能,这种功 能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现");
}
}
方法与重写的概念
- 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
- 子类能够根据需要实现父类的方法。
- 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
方法重写的命名规则
- 方法名相同
- 参数列表相同
- 返回值类型相同或者是其子类
- 访问权限不能严于父类
- 父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
- 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
- 父类的私有方法不能被子类覆盖
- 不能抛出比父类方法更多的异常
方法重写与实例
class ElectricAppliance{
public void move(){
System.out.println("电器需要电压");
}
}
class Television extends Animal{
public void move(){
System.out.println("电视需要220伏");
}
}
public class TestTelevision {
public static void main(String args[]){
// ElectricAppliance对象
ElectricAppliance a = new ElectricAppliance();
// Television 对象
ElectricApplianceb = new Television ();
a.move();// 执行 ElectricAppliance类的方法
b.move();//执行 Television 类的方法
}
}
接口的概念
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
接口无法被实例化,但是可以被实现。
接口与类的相似点
- 一个接口可以有多个方法
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名
- 接口的字节码文件保存在 .class 结尾的文件中
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中
接口和类的区别
- 接口不能用于实例化对象
- 接口没有构造方法
- 接口中所有的方法必须是抽象方法
- 接口不能包含成员变量,除了 static 和 final 变量
- 接口不是被类继承了,而是要被类实现
- 接口支持多继承
接口和抽象类的区别
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行接口没有构造方法
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口
接口的实例
/* 文件名 : MammalInt.java */
public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
…implements 接口名称[, 其他接口名称, 其他接口名称…, …] …
/* 文件名 : MammalInt.java */
public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
示例
// 创建Vehicle接口
public interface Vehicle {
Vehicle start(Vehicle v);
Vehicle stop(Vehicle v);
}
// 创建Bike类并继承Vehicle 这个接口
public class Bike implements Vehicle {
public Vehicle start(Vehicle v) {
System.out.println("自行车开动了");
return v;
}
public Vehicle stop(Vehicle v) {
System.out.println("自行车停下了");
return v;
}
}
// 创建interfaceDemo类
public class interfaceDemo {
public static void main(String[] args) {
Vehicle v1=new Bike(); //创建Bike对象
v1.start(v1);
v1.stop(v1);
}
}
接口的继承示例
// 文件名: Sports.java
public interface Sports{
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
// 文件名: Football.java
public interface Football extends Sports{
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
// 文件名: Hockey.java
public interface Hockey extends Sports{
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
总结
Java中的接口
属性全都是全局静态常量
方法都是全局抽象方法
无构造方法
一个类可以实现多个接口,非抽象类实现接口时必须实现接口中的全部方法
抽象类利于代码复用,接口利于代码维护