Java中final的使用,抽象类,对象转换与多态

本文详细介绍了Java中的final关键字在类、方法和变量上的使用,以及抽象类的概念和应用场景。通过绘制图形系统的例子展示了抽象类和抽象方法的实现。同时,文章还探讨了对象转换与多态,包括向上转型、动态多态以及如何通过抽象类实现多态性。示例代码展示了如何利用抽象类创建不同形状的图形,并计算它们的面积和周长,体现了Java代码的可维护性和可扩展性。
摘要由CSDN通过智能技术生成

Java中final的使用,抽象类,对象转换与多态

  • 用final修饰的类是最终类,不能被继承

  • 用final修饰方法,该方法不能被子类覆盖

  • 用final修饰变量,变量值只能被使用,不能被修改

  • 抽象类

  • 抽象类和抽象方法都使用abstract修饰,抽象方法只有方法的声明,没有方法的实现

  • 假如需要绘制一个图形系统,一般需要定义各种图形类,也需要定义一些抽象方法

  • 有抽象方法,必须要是抽象类

  • 在抽象类中可以定义构造方法,这些构造方法可以在子类的构造方法中调用,

  • 抽象类中可以定义构造方法,但是抽象类不能被实例化,即不能生成抽象类的对象

  • 抽象类需要被子类继承,才能被实例化

  • 注意:abstract和final不能在同一个类中中使用,因为final类不能被继承,而abstract类必须被继承


abstract class Shape{ //定义抽象类
    String name ;
    public Shape(){}
    public Shape(String name){ //定义带参数的构造方法
        this.name = name ;
    }
    public abstract double getArea() ; //求面积的抽象方法
    public abstract double getPerimeter() ; //定义求周长的抽象方法
}
public class Circle extends Shape { //继承抽象类Shape并重写相应的方法
    private double radius ;
    public Circle(){
        this(0.0) ; //调用本类的带参数构造方法
    }
    public Circle(double radius){ //定义带参数的构造方法
        super("圆") ; //调用父类带参数的构造方法
        this.radius = radius ;
    }
    public void setRadius(double radius){ //修改方法
        this.radius = radius ;
    }
    public double getRadius(){ //访问方法
        return radius ;
    }
    @Override
    public double getArea() { //实现父类求面积的抽象方法
       return Math.PI * radius * radius;
    }
    @Override
    public double getPerimeter() { //实现父类求周长的方法
        return 2 * Math.PI * radius;
    }
    public String toString(){ //重写object类的toString()方法
        return "[圆] radius = " + radius ;
    }
    public static void main(String[] args){
        Circle circle = new Circle() ;
        circle.setRadius(2.0) ;
        System.out.println(circle.toString()) ;
        System.out.println("圆形的面积为:"+ circle.getArea()) ;
        System.out.println("圆形的周长为:" + circle.getPerimeter()) ;
        System.out.printf("%.2f%n",circle.getArea() ) ;// 四舍五入保留两位有效数字
        System.out.printf("%.2f",circle.getPerimeter()) ;
    }
}
  • 对象转换与多态
  • 继承关系使得一个子类继承父类的特征,并且附加一些新特征
  • 子类是父类的特殊化,每个子类的实例都是它父类的实例,但反过来不成立
  • 子类对象和父类对象在一定条件下可以相互转换,子类对象可以自动转换为父类对象,称为向上转换
  • 父类对象转换为子类对象称为强制转换
  • instanceof运算符用来测试一个实例是否是某个类型时问实例
  • 多态就是多种形式,java中一个类或者多个类可以定义多个同名的方法,这多个同名的方法完成的操作不同
  • 多态性是指在运行系时候,系统判断应该执行哪个方法的代码的能力
  • Java语言支持两种类型的多态
  • 1.静态多态:编译时多态,通过方法重载实现
  • 2.动态多态:运行时多态,通过方法覆盖实现
  • 对于一个子类的实例,如果子类覆盖了父类的方法,运行时调用子类的方法
  • 如果子类继承了父类的方法,则运行时系统调用父类的方法
  • 程序中使用抽象类Shapes对象引用具体类的实例,再调用getArea()方法时候,系统根据对象的实际类型调用相应的getArea()方法,如果将数组中再增加一个Shapes的子类,例如Triangle类,程序不需要修改,大大提高了程序的可维护性和可扩充性
abstract class Shapes{//父类形状类
    String name ;
    public Shapes(){
    }
    public Shapes(String name){
        this.name = name ;
    }
    public abstract double getArea() ;
    public abstract double getPerimeter() ;
}
class Circles extends Shapes{ //子类圆形类
    private double radius ;
    public Circles(double radius){
        super("圆形") ;
        this.radius = radius ;
    }
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
    @Override
    public double getPerimeter() {
        return 2 * Math.PI * radius ;
    }
}
class Rectangle extends Shapes{ //子类长方形类
    private double length ;
    private double width ;
    public Rectangle(double length, double width){
        super("长方形") ;
        this.length = length ;
        this.width = width ;
    }
    @Override
    public double getArea() {
        return length * width;
    }
    @Override
    public double getPerimeter() {
        return (length + width) * 2;
    }
}
class Square extends Shapes{ //子类正方形类
    private double side ;
    public Square(double side){
        this.side = side ;
    }
    @Override
    public double getArea() {
        return side * side;
    }

    @Override
    public double getPerimeter() {
        return side * 4 ;
    }
}

public class CastDemo {
   public static void main(String[] args){
       CastDemo castDemo = new CastDemo() ;
       boolean flag = (castDemo instanceof CastDemo) ; //判断castDemo是否是类CastDemo的实例
       System.out.println(flag) ;
       Shapes [] shapes = new Shapes[3] ;
       double sumArea = 0, sumPerimeter = 0  ;
       shapes[0] = new Circles(10);
       shapes[1] = new Rectangle(5,20) ;
       shapes[2] = new Square(10) ;
       for(Shapes shape : shapes){
           sumArea += shape.getArea() ;
       }
       System.out.println("所有图形的面积之和为:" + sumArea) ;
       System.out.println("所有图形的周长之和为:" + sumPerimeter) ;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值