Day35--抽象类
抽象类: abstract 修饰符可修饰方法和类。修饰方法则为抽象方法;修饰类则为抽象类。
抽象类中可以无抽象方法,但有抽象方法的类须声明为抽象类。
抽象类不能用 new 关键字创建对象,他是用来让子类继承的。
抽象方法,只有方法的声明,没有方法的实现,他是用来让子类实现的。
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
示例:
当在类的修饰符内添加abstract,这个类就是抽象类
package com.liu.oop.demo08;
//抽象类 abstract
public abstract class Action {
}
方法也可以只写名字和返回值,不写如何具体的实现
package com.liu.oop.demo08;
//抽象类 abstract
public abstract class Action {
//约束---有人帮我们写具体内容,就不用在这里写的很详细
//abstract 抽象方法,只有方法名字,没有方法的实现
public abstract void doSomething();
}
如何重写这个方法?
新建Action的子类A类
此时立刻报错
package com.liu.oop.demo08;
public class A extends Action {
}
//报错原因:A类必须声明为抽象,或者实现Action的抽象方法doSomething
抽象类,它的子类必须要实现它的方法;或者子类是抽象
在A里面,重写doSomething方法
package com.liu.oop.demo08;
public class A extends Action {
@Override
public void doSomething() {
}
}
拓展:extends是有局限性的,它是单继承,只能有一个父类,有时无法满足我们的需求。这时,我们可以用接口
接口可以多继承
抽象类是无法被new实例化的
示例:
package com.liu.oop;
import com.liu.oop.demo08.A;
import com.liu.oop.demo08.Action;
public class Application {
public static void main(String[] args) {
new Action();//报错
}
}
有抽象方法,它的类必然是抽象类
package com.liu.oop.demo08;
//抽象类 abstract
public class Action {
//约束---有人帮我们写具体内容,就不用在这里写的很详细
//abstract 抽象方法,只有方法名字,没有方法的实现
public abstract void doSomething();//---------报错
}
抽象类的方法可以不是抽象的
下面的代码里面,meaningless不是抽象方法,但是可以存在
package com.liu.oop.demo08;
//抽象类 abstract
public abstract class Action {
//约束---有人帮我们写具体内容,就不用在这里写的很详细
//abstract 抽象方法,只有方法名字,没有方法的实现
public abstract void doSomething();
public void meaningless(){
}
}
总结:
1.不能 new 这个抽象类,只能靠子类去实现它;约束!
2.抽象类中可以写普通的方法。
3.抽象方法必须在抽象类中。
抽象的抽象:约束。