入坑Java(八)abstract & implements
abstract
1)定义:
a.**abstract(抽象)**关键字可以用来修饰类和方法。
b.abstract修饰的类叫做抽象类,该类不能被实例化,也就是不能使用关键字new来创建该类对象。
c.abstract修饰的方法叫做抽象方法,抽象方法只有声明部分,而没有具体的方法体。
2)特点以及规范:
a.非抽象类子类的父类是一个抽象类的话,它必须具体实现父类的所有抽象方法,非抽象方法可以不实现。
b.抽象方法的类,必须用abstract来修饰(抽象类也可以没有抽象方法,但抽象方法必须出现在抽象类中)。
c.一个抽象类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现。
具体可以看例子:
public class TryAbstract {
public static void main(String[] args) {
System.out.println("a");
sonn person = new sonn();
person.ShowHello();
}
}
// 抽象类(也可以使用接口,但是子类必须得重新接口方法or子类是抽象类)
abstract class Humen implements Comparable {
// 抽象类成员可以是抽象的也可以是非抽象的,如下
public Humen() {
System.out.println("c");
}
// 抽象类不可以被实例化,但是有main方法的话,却是可以被执行的
public static void main(String[] args) {
System.out.println("抽象类不可以被实例化,但是有main方法的话,却是可以被调用的");
}
// 抽象方法必须写在抽象类里
abstract void ShowHello();
public void haha() {
}
}
// 继承抽象类
class sonn extends Humen {
// 继承抽象类,必须重写该类的抽象方法
@Override
public void ShowHello() {
// 抽象方法内不可有private参数
// private int b = 2;
System.out.println("b");
}
// 抽象类不可以被实例化,具体如下(解声明)
// Humen humen = new Humen();
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
// 子类也是抽象类的话,无需重新继承抽象类的抽象方法
abstract class abstractSon extends Humen {
// 不写Override也是可以的
}
implements
1)定义:
a.implement所表示的是接口
b.接口其实就是一个抽象类,这个类里面的方法全是抽象方法(抽象类可以包含非抽象方法,但接口这个抽象类里的方法必须全是抽象方法)
2)特点以及规范:
a.一个类可以实现多个接口,但只能继承一个父类
b.定义接口的类里面,方法默认是public abstract 的,也只能是public abstract
c.定义在接口里的变量只能是 public static final
d.可以通过interface关键字来定义抽象类为接口
e.可以通过implements 来实现接口,实现多个接口的时候,用“,”分隔开接口名称
具体看实例:
//可以继承一个父类,实现多个接口
public class TryCreateAndUseImplements extends FartherOne implements TheImplement1, TheImplement2 {
//实现接口后,也要实现接口里的方法,不然会报错。
@Override
public void implementWay3() {}
public void implementWay1() {}
public void implementWay2() {}
}
//定义接口
interface TheImplement1 {
// 因为接口里的方法都是抽象的,所以不用abstract来声明也是可以的
public void implementWay1();
// 也不需要在方法的后面在()后面加上{},如下:
public abstract void implementWay2();
}
//定义接口
interface TheImplement2 {
//默认public static final 所以不写也可以
int i = 1;
public static final int j = 2;
//只能是public static final,除此之外的都会报错
//protected int j = 2;
public void implementWay3();
}
class FartherOne{
protected int i = 1;
}
abstract 与 implements的区别
注意
之前有说过,父类声明子类实例化,这个叫对象上转型实例化,
如farther faa = new son();
但在接口中,它有另一个名字叫接口回调其实都是一个东西,接口声明,实现接口的类进行实例化。
-------END