趁暑假以后每天学习复习一点JAVA知识,从零开始总结JAVA的知识点
抽象类
定义一个抽象类
abstract class A{//定义一个抽象类
public void fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
使用规则:
- 其中抽象类中可以有抽象方法也可以有普通方法(见上代码)
- 抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理
- 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类
- 子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
- 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public
public class Main {
public static void main(String[] args) {
Test a=new C();
a.print();
C.run();
}
}
abstract class Test{
public void run(){
System.out.println("这个是普通方法");
}
public abstract void print();
}
class C extends Test{
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("这个是抽象方法");
}
public void put(){
System.out.println("class");
}
}
运行结果
这个是抽象方法
这个是普通方法
限制
(1)抽象类中有构造方法吗?
并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。
abstract class A{//定义一个抽象类
public A(){
System.out.println("*****A类构造方法*****");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A{//B类是抽象类的子类,是一个普通类
public B(){
System.out.println("*****B类构造方法*****");
}
@Override
public void print() {//强制要求覆写
System.out.println("Hello World !");
}
}
public class TestDemo {
public static void main(String[] args) {
A a = new B();//向上转型
}
}
运行结果
A类构造方法
B类构造方法
(2)抽象类可以用final声明么?
不能,因为抽象类必须有子类,而final定义的类不能有子类
实例
模板设计模式
例如,现在有三类事物:
(1)机器人:充电,工作;
(2)人:吃饭,工作,睡觉;
(3)猪:进食,睡觉。
现要求实现一个程序,可以实现三种不同事物的行为。
public class Main {
public static void main(String[] args) {
fun(new Robot());
fun(new People());
fun(new Pig());
}
public static void fun(Demo act){
act.commond(Demo.EAT);
act.commond(Demo.SLEEP);
act.commond(Demo.WORK);
}
}
abstract class Demo{
public static final int EAT = 1 ;
public static final int SLEEP = 3 ;
public static final int WORK = 5 ;
public abstract void work();
public abstract void eat();
public abstract void sleep();
public void commond(int flags){
switch(flags){
case EAT:
this.eat();
break;
case SLEEP:
this.sleep();
break;
case WORK:
this.work();
break;
case EAT + SLEEP:
this.eat();
this.sleep();
break;
case SLEEP + WORK:
this.sleep();
this.work();
break;
default:
break;
}
}
}
class People extends Demo{
@Override
public void work() {
System.out.println("人工作");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("人吃饭");
}
@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("人睡觉");
}
}
class Pig extends Demo{
@Override
public void work() {
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("猪吃饭");
}
@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("猪睡觉");
}
}
class Robot extends Demo{
@Override
public void work() {
System.out.println("机器人工作");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("机器人充电");
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
}