不会还有人不知道Java的抽象类吧?不会吧不会吧

在 Java 中抽象类的语法格式如下:

<abstract>class<class_name> {
    <abstract><type><method_name>(parameter-iist);
}

其中,abstract 表示该类或该方法是抽象的;class_name 表示抽象类的名称;method_name 表示抽象方法名称,parameter-list 表示方法参数列表。

抽象方法没有方法体
抽象方法必须存在于抽象类中
子类重写父类时,必须重写父类所有的抽象方法。
抽象类和抽象方法都要使用 abstract 关键字声明。
抽象类不能实例化,也就是不能使用 new 关键字创建对象。(其实是可以的,只不过没意义,例子里就是这样写的)

例子:使用长方形类继承了形状类,又用菱形继承了长方形类,寻思写复杂点,多练几遍

package test;

public class Abstract {

    //定义形状抽象类
    public abstract class Shape {
        public int width;   // 长度
        public int height; // 高度,不是宽度。

        public Shape(int width, int height) {
            this.width = width;
            this.height = height;
        }
        // 定义抽象方法,计算面积area,定义抽象类周长length
        public abstract double area(); 
    }
    
    //又定义抽象长方形类,继承形状类
    public abstract class Square extends Shape{ 
        public Square (int width,int height){
            super(width, height );
        }

        @Override
        public double area() {  //重写父类抽象方法
            return width*height;
        }
        public abstract double length();
    }

    //定义菱形类,继承长方形类
    public class Diamond extends Square{
        public Diamond(int width,int height){
            super(width, height );
        }

        @Override
        public double area() {
            return width*height*0.5;
        }
        @Override
        public double length() {
            return width*2+height*2; //公式貌似不对,但不要在意这些细节哈哈
        }

    }
    public  static void main(String args[]){
        Abstract.Diamond d =new Abstract ().new Diamond (1,3);//长方形的
        System.out.println ( d.area () );
        System.out.println ( d.length () );

        Abstract.Square s =new Abstract ().new Square (2,4) { //菱形的
            @Override
            public double length() {
                return width*2+height*2;
            }
        };
        System.out.println ( s.area() );
        System.out.println ( s.length () );
    }
}

输出如下:

1.5
8.0
12.0

之前main方法我是这么写的:

public  static void main(String args[]){
      Diamond d =new Diamond (1,3);//长方形的
        System.out.println ( d.area () );
        System.out.println ( d.length () );
}

然后报错:
Error:(49, 20) java: /D:/Abstract.java:49: 无法从静态上下文中引用非静态变量 this

问题在于我把 class Diamond 放到了 public class Abstract 内部,导致Diamond 成了Abstract 的非静态内部类,属于Abstract 的一个成员,在静态方法main中不能访问非静态的成员,也就不能直接new Diamond(),只能通过外部类的对象访问,like this:
Abstract.Diamond d =new Abstract ().new Diamond (1,3);

注意:在使用 abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章