1.抽象类
abstract修饰的类就是抽象类(父类通常是抽象的,不能实例化)
格式:public abstract class A{...}
特征:①不可以直接实例化
②可以有构造方法,可以有属性(留给子类使用),可以有自定义方法
③可以有抽象方法,子类必须重写抽象父类的抽象方法,除非子类也是抽象类
应用场景:是一个 (is a) A extends [abstract] B 用于重用
举个例子:A为抽象父类,A定义了一个方法:会计算。B,C为子类,D类想用类B和类C的方法。B会加法,C会减法。D也想会计算。
public abstract class A(){
private String name;
public A(String name){
this.name
}
public abstract int cal(int a,int b);
}
public class B extends A(){
//子类B必须重写抽象父类的抽象方法
@Override
public int cal(int a,int b){
return a+b;
}
}
public class C extends A(){
//子类C必须重写抽象父类的抽象方法
@Override
public int cal(int a,int b){
return a-b;
}
}
public class D{
//D想用A的计算
public void cal(A a,int c,int b){
System.out.println(a.cal(c,b));
}
}
//测试类
public class Test{
public static void main(String[] args){
//instance实例
D d = new D();
d.cal(b,c:2,b:3);//得到的值为5
d.cal(c,c:2,b:3);//得到的值为-1
}
}
2.接口
格式:public interface A {...}
特点:①不可以直接实例化
②不能有构造方法,属性默认为公共的静态的常量;方法默认为公共的抽象的,不能有方法体
③实现类(子类)implements必须重写父接口的所有方法,除非子类是抽象类或接口
应用场景:有一个(has a) A implements interface B 用于扩展
(有一个类A,类B想扩展A的功能,那么先新建一个接口;再新建一个新的类(B)继承原来的类(A),再实现一个接口)
举个例子:
给Calculator定义了一个带参方法
public class Calculator{
public int add(int a,int b){
return a+b;
}
}
//Calculator2类想扩展Calculator类的方法,需要先新建一个接口MultiAdd
public interface MultiAdd{
int add(int...arr);
}
//Calculator2类继承Calculator,实现MultiAdd
public class Calculator2 extends Calculator implements MultiAdd {
@Override
public int add (int...arr){
int sum = 0;
for(int i : arr){
sum = add(sum,i);
}
return sum;
}
}
//测试类
public class Test{
public static void main(String[] args){
Calculator2 c2 = new Calculator2;
}
}