• java学习日记 抽象类


    1、抽象类就是在普通类结构中增加抽象方法的组成。抽象类用abstract来声明。

    abstract class Ab{//定义一个抽象类
        public void fun(){//普通方法
            System.out.println("存在方法体的方法");
        }
        //此方法并没有方法体的声明,并且有abstract关键字,表示抽象方法
        public abstract void print();
    }

    抽象类不能实例化

    abstract class Ab{//定义一个抽象类
        public void fun(){//普通方法
            System.out.println("存在方法体的方法");
        }
        //此方法并没有方法体的声明,并且有abstract关键字,表示抽象方法
        public abstract void print();
    }
    
    //一个子类只能继承一个抽象类,属于单继承局限
    class Ab2 extends Ab{//Ab2类是Ab类的子类,并且是一个普通类
        public void print(){//强制要求覆写的方法
            System.out.println("Hello world!");
        }
    
    }
    public class AbstractDemo {
        public static void main(String[] args) {
            Ab ab = new Ab2();//向上转型
            ab.print();
        }
    }

    运行结果:

    Hello world!
    • 1. 抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。

    • 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

    • 3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现。

    • 4. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

    2、抽象类不能用final定义,因为抽象类必须有子类,final定义的类不能有子类。

      外部抽象类不允许使用static声明,但是内部的抽象类运行使用static声明。

    abstract class Abs{
        //static定义的内部类属于外部类
        static abstract class Abs2{
            public abstract void print();
        }
    }
    
    class X extends Abs.Abs2{
        public void print(){
            System.out.println("Hello");
        }
    }
    public class AbstractDemo2 {
        public static void main(String[] args) {
            Abs.Abs2 a = new X();
            a.print();
        }
    }

    任何情况下,要执行类中的static方法时,都可以在没有对象的时候直接调用,对于抽象类也是一样。

    abstract class Abs{
        public static void print(){
                System.out.println("Hello");
            }
    }
    
    
    public class AbstractDemo2 {
        public static void main(String[] args) {
            Abs.print();
        }
    }

    为用户隐藏不需要知道的子类:

    abstract class Abst{//定义一个抽象类
        public abstract void print();
        private static class Abst2 extends Abst{//内部抽象类子类
            public void print(){
                System.out.println("Hello");
            }
        }
        public static Abst getInstance(){
            return new Abst2();
        }
    }
    
    public class AbstractDemo3 {
        public static void main(String[] args) {
            //此时取得抽象类,完全不需要知道B类的存在
            Abst a = Abst.getInstance();
            a.print();
        }
    }

    构造方法遗留问题:

    abstract class Abstr{
        public Abstr(){  //2、父类构造方法
            this.print();  //3、调用print()方法
        }
        public abstract void print();
    }
    
    class Abstr2 extends Abstr{
        private int num =100;
        public Abstr2(int mun){
            this.num = num;
        }
        public void print(){   //4、调用覆写后方法
            System.out.println("num="+num); //num未初始化,内容是其对应数据类型的默认值
        }
    }
    public class AbstractDemo4 {
        public static void main(String[] args) {
            new Abstr2(30); //1、执行构造
        }
    }

    输出结果:

    num=0
    public class AbstractDemo4 {
        public static void main(String[] args) {
            new Abstr2(30).print(); //1、执行构造
        }
    }
    
    
    
    
    num=0
    num=30

    3、抽象类应用——模板设计

     

    abstract class Action1{
        public static final int EAT = 1;
        public static final int SLEEP =3;
        public static final int WORK =5;
        public void command(int flag){
            // switch 只支持数值判断,而if支持条件判断
            switch (flag){
                case EAT:
                    this.eat();
                    break;
                case SLEEP:
                    this.sleep();
                    break;
                case WORK:
                    this.work();
                    break;
                case EAT+WORK:
                    this.eat();
                    this.work();
                    break;
            }
        }
        //因为现在不确定子类的实现是什么样的
        public abstract void eat();
        public abstract void sleep();
        public abstract void work();
    
    }
    class Robot extends Action1{
        public void eat(){
            System.out.println("机器人补充能量");
        }
        public void sleep(){}
        public void work(){
            System.out.println("机器人正在努力工作");
        }
    }
    class Human extends Action1{
        public void eat(){
            System.out.println("人类正在吃饭");
        }
        public void sleep(){
            System.out.println("人在睡觉");
        }
        public void work(){
            System.out.println("人为了梦想在工作");
        }
    }
    class Pig extends Action1{
        public void eat(){
            System.out.println("猪正在吃东西");
        }
        public void sleep(){
            System.out.println("猪在睡觉养膘");
        }
        public void work(){}
    }
    public class AbstractDemo5 {
        public static void main(String[] args) {
            fun(new Robot());
            fun(new Human());
            fun(new Pig());
        }
        public static void fun(Action1 action){
            action.command(Action1.EAT);
            action.command(Action1.SLEEP);
            action.command(Action1.WORK);
        }
    }

    运行结果:

    机器人补充能量
    机器人正在努力工作
    人类正在吃饭
    人在睡觉
    人为了梦想在工作
    猪正在吃东西
    猪在睡觉养膘
  • 相关阅读:
    AWK 学习手札之一: an AWK tutorial
    SQL语句教程学习笔记之一
    c#支付宝支付
    table隔行变色
    读取接口
    倒计时
    新建的mvc项目运行之后报错找不到页面
    sql向表中添加字段
    取小数点后面几位数
    H5拨打电话
  • 原文地址:https://www.cnblogs.com/cathycheng/p/13177654.html
Copyright © 2020-2023  润新知