抽象类
abstract: 修饰方法/类
-
有抽象方法的类必须定义为抽象类
-
抽象类不能被实例化,即不能使用new关键字
-
抽象类可以有构造函数,创建子类对象时使用
-
一个抽象类至多有0个抽象方法,至多所有都是
-
子类必须重写父类抽象方法或者子类也为抽象类 非抽象方法可不重写
-
抽象方法: 就是项目开发时候的一种[规范] 抽象方法只做方法的声明 不做方法的具体实现
abstract public class MyAB { //使用abstract修饰类
public double n;
final static public double PI = 3.14;
public MyAB() {
}
public MyAB(double n) {
this.n = n;
}
abstract public double ZC(double n); //使用abstract修饰方法 没有方法体
abstract public double Area(double n);
}
public class Circle extends MyAB{
//非抽象子类必须重写
@Override
public double ZC(double n) {
return PI*2*n;
}
@Override
public double Area(double n) {
return PI*n*n;
}
}
接口
接口可以看做是一种极端的抽象类(接口不属于类)。它不允许有构造方法,不允许被实例化
-
接口使用interface 代表的是接口
-
接口中定义的变量都使用 public static final(可省略) 也就意味着定义的都是常量
-
在接口中定义的方法都是使用 public abstract 修饰的 也就意味着是抽象方法(JDK7及以前版本)
-
接口不可以被实例化(不可以被new对象)
-
接口中不可以定义构造方法 /代码块/静态代码块
-
一个类可以实现多个接口 使用(implements) 每一个接口之间使用逗号进行分割
-
一个类既想继承一个类又想实现多个接口 顺序是先继承 再实现 例子:public class Cla extends Fu implements Face1,Face2
public interface Face1 {
public static final int a =100;
int b=10; // 默认为public static final 可不写
public abstract void aa();
void bb(); //方法默认为public abstract 同样无方法体
}
public interface Face2 {
}
public class Fu {
}
public class Cla extends Fu implements Face1,Face2 {
public void aa(int a){
}
public void bb(){
}
}
接口和接口之间注意:
-
接口和接口之间是多继承
-
类和类之间是单继承 类和接口之间是多实现 接口和接口之间是多继承
-
如果一个接口继承了两个接口,再父接口中定义相同的常量 外部获得时候就会报错
-
如果一个接口继承了两个接口 两个父接口中有相同方法 这样操作不报错 但是在子接口中相当于只有一个
JDK8/9接口种新增的操作
-
JDK8中新增了 静态方法/非静态方法(必须加上default) 都需要使用public 修饰
-
JDK9中新增了私有的静态/非静态方法
-
上面的非抽象方法 子类是可以实现 也可以不实现!!
public interface B {
String name="b";
void aa();
}
public interface C {
String name="c";
void aa(int num);
}
public interface A extends B,C {
//String name="a";
}
public class Zi implements A {
@Override
public void aa() {
}
@Override
public void aa(int num) {
}
}
System.out.println(A.name); //报错 在A中定义String后打印a
public interface D {
//jdk8 public可省略
public static void test(){
System.out.println("新增了静态方法");
}
public default void test2(){
System.out.println("新增了default方法");
}
//jdk9+ 便于将多个方法中的冗余代码进行提取,并且不对外公开。减少冗余、也实现了代码隐藏
private void aa(){
}
}
区别
接口:
-
实现类可以实现多个接口。
-
接口中只能包含public static final属性。
-
接口只能有抽象方法,静态方法,default修饰的方法。
-
接口不允许有构造方法。
-
接口可以多继承
-
不可以创建对象
抽象类:
-
子类只能继承一个抽象类。
-
抽象类可以包含任意类型属性。
-
抽象类可以有普通方法,静态方法,抽象方法,但是不能有default修饰的方法。
-
抽象类可以有构造方法。
-
不可以创建对象