zoukankan      html  css  js  c++  java
  • 1-3-2-抽象类

     父类的抽象方法就像图形计算面积的方法,是没有办法计算的,需要子类来计算抽象方法,就像正方形是可以计算面积的一样

    子类既是父类也是子类,就像汪星人就是汪星人,汪星人就是汪星人的父类,汪星人也是动物的子类一样

    抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束
    抽象类:抽象方法所在的类必须是抽象类,在class前直接写上abstract即可,抽象类里可以有非抽象方法
    //抽象类
    public abstract class Animal {
        //抽象方法
        public abstract void eat();
        public abstract void drink();
    
        //普通的成员方法
        public void normalMethod(){
    
        }
    }
    
    
    
     
    
    
    如何使用抽象类和抽象方法:
    1.不能直接创建new抽象类对象
    public class DemoMain {
        public static void main(String[] args) {
            Animal animal = new Animal();//错误写法
        }
    }

    2.必须用一个子类来继承抽象父类
    3.子类必须覆盖重写父类当中所有抽象方法
    public class Cat extends Animal {
        @Override
        public void eat() {
            System.out.println("猫吃鱼");
        }
    
        @Override
        public void drink() {
            System.out.println("猫喝水");
        }
    }

    4.虽然方法是父类创建的抽象方法,但是是子类对象进行使用
    public class DemoMain {
        public static void main(String[] args) {
    //        Animal animal = new Animal();//错误写法
            Cat cat = new Cat();//子类创建对象进行使用而不是父类创建
            cat.eat();
            cat.drink();
        }
    }
    
    
    

    1.第一个注意事项就是上面第4条的用法

    2.

    父类

    public abstract class Fu {
        //构造器
        public Fu(){
            System.out.println("父类构造器启动");
        }
        //抽象方法
        public abstract void eat();
    }

    子类

    public class Zi extends Fu {
        //子类构造器
    
        public Zi(){
            //构造器启动前会有一个隐藏的super()去调用父类的构造器
            //super();
            System.out.println("子类构造器启动");
        }
    
        //父类抽象方法
        @Override
        public void eat() {
            System.out.println("吃东西");
        }
    }

    启动类

    public class DemoMain {
        public static void main(String[] args) {
            Zi zi = new Zi();
            zi.eat();
        }
    }

    运行结果

    3.抽象方法所在的类必须是抽象类,在class前直接写上abstract即可,抽象类里可以有非抽象方法,也可以没有抽象方法
    //这样没有抽象方法的抽象类,也不能直接创建对象,在一些特殊场景下有用(适配器模式)
    public abstract class MyAbstract {
    
    }
    
    
    4.子类必须覆盖重写父类当中所有抽象方法,除非你的子类也是抽象类,否则就会编译不通过报错

    抽象父类Animal
    //父类
    public abstract class Animal {
        public abstract void sleep();
        public abstract void eat();
    }
    
    

    抽象子类Dog

    //子类
    public abstract class Dog extends Animal {
        @Override
        public void eat() {
            System.out.println("狗吃饭");
        }
        //这里隐藏了Animal中的public abstract void sleep();方法,Dog方法的子类可以重写该方法
    }

    Dog子类Dog2Ha

    public class Dog2Ha extends Dog {
        @Override
        public void sleep() {
            System.out.println("二哈睡觉");
        }
    }

    Dog子类DogGold

    //Dog类的子类
    public class DogGold extends Dog{
        //这里只有重写sleep方法,因为eat方法在Dog被重写过了
        @Override
        public void sleep() {
            System.out.println("金毛睡觉");
        }
    }

    启动类

    public class DemoMain2 {
        public static void main(String[] args) {
    //        Animal animal = new Animal();//这是抽象类,错误的
    //        Dog dog = new Dog();//这也是错误的,这也是抽象类
            Dog2Ha dog2Ha = new Dog2Ha();
            dog2Ha.eat();
            dog2Ha.sleep();
            System.out.println("================");
            DogGold dogGold = new DogGold();
            dogGold.eat();
            dogGold.sleep();
        }
    }
    结果
     


  • 相关阅读:
    Docker Swarm(十)Portainer 集群可视化管理
    Docker Swarm(九)资源限制
    Docker Swarm(八)滚动更新、回滚服务
    Docker Swarm(七)Scale 扩(缩)容服务
    Docker Swarm(六)Label 节点标签与服务约束
    Docker Swarm(五)Config 配置管理
    select样式调整
    在VS2008和VS2010中禁用Visual Assist X
    解决IE与FF 中 input focus 光标移动在最后的方案
    Office Web APP预览如何去掉顶部版权标志“Microsoft Office Web Apps”
  • 原文地址:https://www.cnblogs.com/KeepCalmAndNeverSayNever/p/12506836.html
Copyright © 2011-2022 走看看