抽象类和抽象方法

抽象类

  • abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
  • 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
  • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
  • 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。

抽象类Action:

package oop.demo11;

//abstract 抽象类:本质是类   extends:  类是单继承,没法继承多个类     (但接口可以多继承)
public abstract class Action {

    //约束~有人帮我们实现~
    //abstract 抽象方法,只有方法的名字,没有方法的实现!
    public abstract void doSomething();

    //1.不能new这个抽象类,只能靠子类去实现它:约束!
    //2.抽象类中可以写普通方法
    //3.抽象方法必须在抽象类中
    //抽象的抽象:约束

    public void hello(){
        System.out.println("HelloWorld!");
    }
}

//思考题?
/*
1.抽象类既然不能new对象,那么它存在构造器吗?
在out底下找到此抽象类Action.class文件,复制到java底下,打开idea查看有没有构造器。(用idea查看反编译文件)
发现有无参构造,下列为class文件代码
public abstract class Action {
    public Action() {
    }

    public abstract void doSomething();

    public void hello() {
        System.out.println("HelloWorld!");
    }
}
 */

/*
2.抽象类存在的意义是什么?
    提高开发效率
 */

继承抽象类的子类A:

package oop.demo11;

/*
抽象类的所有方法,继承了它的子类都必须要实现它的方法,
除非这个子类也是抽象类,那就不用重写方法了,再让子类的子类去实现
 */
public class A extends Action {
    @Override
    public void doSomething() {
        System.out.println("子类重写抽象方法");
    }
}
package oop.demo11;

public class Application {
    public static void main(String[] args) {

        //new Action();//报错提示:'Action' is abstract; cannot be instantiated “Action”是抽象的;不能被实例化
        //抽象类不能new,只能new它的子类对象,如果子类还没实现,就要子类的子类了
        A a = new A();
        a.doSomething();
    }
}

思考?

  • 1.抽象类既然不能new对象,那么它存在构造器吗?
  • 2.抽象类存在的意义是什么?

问题答案参考1

问题答案参考2


  • 抽象类具体实例:

    求矩形和三角形面积,相同点是都有长,宽,三角形的高可以理解为宽,面积是抽象方法,在子类中实现。

    抽象类Shape:

    public abstract class Shape {    //shape:形状
        public double length;//长
        public double width;//宽
    
        public Shape(double length,double width){
            this.length = length;
            this.width = width;
        }
    
        public abstract double area();//area:面积
    }
    

    矩形子类Rectangle:

    public class Rectangle extends Shape{    //rectangle:矩形
    
    
        public Rectangle(double length, double width) {
            super(length, width);
        }
    
        @Override
        public double area() {
            return length*width;
        }
    }
    

    三角形子类Triangle:

    public class Triangle extends Shape {  //triangle:三角形
    
        public Triangle(double length, double width) {
            super(length, width);
        }
    
        @Override
        public double area() {
            return width*length/2;
        }
    }
    

    main方法Application类:

    public class Application {
        public static void main(String[] args) {
            Rectangle rectangle = new Rectangle(5, 3);
            System.out.println("矩形的面积为:"+ rectangle.area() + "㎡");
    
            Triangle triangle = new Triangle(4, 5);
            System.out.println("三角形的面积为:"+ triangle.area()+ "㎡");
        }
    }
    

    输出:

    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值