目录
一、抽象类和抽象方法
-
抽象类无法实例化,无法创建对象。因为抽象类是类和类之间共有的特征,将这些具有共同特征的类再进一步抽象形成了抽象类,由于类本身是不存在的,所以抽象类无法创建对象。抽象类和抽象类实际上可能还会有共同特征,还可以进一步抽象。
-
类与类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。类本身是不存在的,所以抽象类无法创建对象【无法实例化】,所以抽象类是用来被子类继承的,子类可以继承抽象类,可以实例化对象。类到对象是实例化,对象到类是抽象
-
抽象类属于引用数据类型
-
语法:【修饰符列表】abstract class 类名{ 类体; }
-
final与abstract不能联合使用,这两个关键字是对立的;
-
抽象类可以有成员变量、成员方法及构造方法,构造方法供子类使用
-
抽象类可以有抽象方法,也可以没有,但有抽象方法的一定是抽象类
-
抽象方法表示没有实现的方法,没有方法体的方法【即没有花括号】,它以分号结尾,用abstract修饰
-
一个非抽象类继承抽象类,子类必须将从父类继承过来的方法进行覆盖/重写【可称重写过程为实现】。而抽象类继承抽象类,子类可以不进行方法覆盖/重写
package com.two.me;
public class AbstractTest01 {
public static void main(String[] args) {
// new Animal();报错,无法实例化
Animal a = new Cat();//new不了Bird
a.move();
}
}
//抽象类
abstract class Animal{
// public void move();抽象类中必须是抽象方法
public abstract void move();
}
//class Bird extends Animal{ }报错:Bird不是抽象的, 并且未覆盖com.two.me.Animal中的抽象方法move()
//一个非抽象类继承抽象类,子类必须将从父类继承过来的方法进行覆盖/重写
class Cat extends Animal {
public void move() {//进行实现无错
System.out.println("Cat!");
}
}
abstract class Bird extends Animal{
public void move() {//要去掉abstract
System.out.println("Bird!");
}
}
二、接口
-
接口是引用数据类型,编译之后是一个class文件。接口是完全抽象的
-
语法:interface 接口名。interface是定义接口用的
-
接口支持多继承,接口中只能包含常量和抽象方法,接口中的方法只能是抽象方法,不能有方法体,就是不能有花括号
-
接口中的抽象方法的 public abstract 可以省略,并且接口的所有元素是用public修饰的
-
接口中的常量用 public static final 修饰,且其可省
-
接口没有构造器,不能构造方法。接口也不能实例化对象
-
接口是抽象类,而抽象类不一定是接口
-
类和类之间叫继承,类和接口之间叫实现
-
当一个非抽象的类实现接口时,必须将接口中所有的抽象方法都实现
-
一个类可以同时可以实现多个接口
-
经测试,接口与接口没有继承关系也可以进行强转,
package com.two.me;
public class InterfaceTest01 {
public static void main(String[] args) {
System.out.println(Math.PI);//访问PI
// Math.PI = 1;无法为最终常量分配值
//接口随便定义一个变量都是常量
}
}
interface Math {
double PI = 3.14159258;
int sum(int a,int b);
int sub(int c);
}
interface B {
}
//一个接口可以继承多个接口
interface C extends Math,B {
}
abstract class MyMath implements Math {
//去掉abstract后,报错:要添上abstract或者实现sub方法
public int sum(int a,int b){//不要忘记修饰符public
return a+b;
}
}