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) ;
}
}