码迷,mamicode.com
首页 > 编程语言 > 详细

Java(18)抽象类

时间:2020-09-09 18:54:55      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:extends   pac   oid   表示   extend   stat   私有   eth   static   

抽象类

当父类的方法实现没有意义时,通常用abstract将方法修饰为抽象方法,如Animal父类的run()方法,把该方法体写出来是没有意义的(动物的跑的方式不能确定)。因为抽象方法的存在,也要将类用abstract修饰,这样的类称为抽象类。

  • 含有抽象方法的类必须被声明为抽象类

    public class Test01 {
        public abstract void run();
        //报错:Abstract method in non-abstract class,表示抽象方法不在抽象类内
    }
    
    public abstract class Test01 {
        public abstract void run(){};// 此处不能有花括号
        //报错:Abstract methods cannot have a body,表示抽象方法不能有方法体
    }
    
    //----------------正确的做法在下面-----------------------------
    public abstract class Test01 {
        public abstract void run();
    }
    
  • 抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,则要声明为抽象类。

    package day01;
    
    public abstract class Test01{
        public abstract void move();
        public abstract void eat();
    }
    class Dog extends Test01{
        @Override
        public void move() {
            System.out.println("狗的移动方式是跑");
        }
    
        @Override
        public void eat() {
            System.out.println("狗的吃东西的方式是舔");
        }
        //如果不重写实现从父类继承来的方法会报错:
        // Class ‘Dog‘ must either be declared abstract or implement abstract method ‘move()‘ in ‘Test01‘
        //必须重写所有全部的抽象方法,如果不重写全部抽象方法,必须将当前类声明为抽象类,如下面的hicken类。
    }
    abstract class Chicken extends Test01{
        @Override
        public void eat() {
            System.out.println("小鸡吃东西的方式是啄");
        }
        //可以看到抽象类可以继承抽象类,被声明为抽象类的子类不必重写全部父类抽象方法。
    }
    class MainClass{
        public static void main(String[] args) {
            Test01 a=new Test01() {
                @Override
                public void move() {
                    System.out.println("true");
                }
    
                @Override
                public void eat() {
                    System.out.println("emmm");
                }
            };//如果要实例化,必须按照此方法重写所有抽象方法
            a.eat();//输出emmm
        }
    }
    
  • 不能用abstract修饰属性、私有方法、构造器、静态方法、final方法或final

    package day01;
    
    public abstract class Test01{
        private int a;
    
        public abstract int a=10;
        //会报错:Modifier ‘abstract‘ not allowed here
        private abstract void fun1(){
            //报错:Illegal combination of modifiers: ‘abstract‘ and ‘private‘
        }
        public abstract Test01(){
            //报错:Modifier ‘abstract‘ not allowed here
        }
    }
    

Java(18)抽象类

标签:extends   pac   oid   表示   extend   stat   私有   eth   static   

原文地址:https://www.cnblogs.com/jimmy888/p/13580901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!