用父类的对象引用子类对象中重写的或继承的方法
比如,以下程序中,Shape是抽象类,Circle和Rectangle是子类,均重写了抽象方法
//定义抽象类
public abstract class Shape {
//定义2个抽象方法
public abstract double GetArea();
public abstract double GetCircum();
//定义普通方法
public void print()
{
System.out.println("周长:"+GetCircum()+"面积:"+GetArea());
}
}
//基于Shape抽象类定义Circle类
public class Circle extends Shape{
public double radius; //新增数组成员:半径
//构造函数
public Circle(double r){
this.radius=r;
}
//重写继承的方法(抽象方法的具体实现)
public double GetArea(){
return 3.14radiusradius;
}
public double GetCircum(){
return 23.14radius;
}
public void print(){
System.out.print("圆的");
super.print();
}
}
//基于抽象类Shape定义Rectangle类
public class Rectangle extends Shape {
//新增2个数据成员:长、宽
public double width;
public double length;
//构造函数
public Rectangle(double wid,double len){
this.width=wid;
this.length=len;
}
//抽象方法的具体实现
public double GetArea(){
return widthlength;
}
public double GetCircum(){
return 2(width+length);
}
public void print(){
System.out.print("矩形的");
super.print();
}
}
//测试类Test
public class Test {
public static void main(String[] args){
//创建圆的对象cir
Circle cir=new Circle(5);
//创建矩形的对象rec
Rectangle rec=new Rectangle(2,4);
cir.print(); //输出圆的的信息
rec.print(); //输出矩形的的信息
Shape sh;//声明抽象类的对象,但不能创建
sh=cir; //用sh引用cir
sh.print(); //输出圆的的信息
sh=rec; //用sh引用rec
sh.print(); //输出矩形的信息
}
}
问题:用sh输出圆的信息和输出矩形的信息的程序语句中,除了对象名,其他都是完全相同的。即出现重复代码的情况。
优化:在测试类中,将输出图形的信息用一个方法实现。
public static void show(Shape sh) { sh.print(); }
则main()方法中的后5行代码可以优化为:
show(cir);
show(rec);
优化的目标: 用一条语句实现对多个子类对象的操作,将子类对象作为参数即可。
final
1.修饰类,则该类是最终类,即不能作为父类再定义新的子类;
2.修饰方法,则该方法为最终的方法,不能被重写;
3.修饰成员变量,则该成员为常量,其值不能被改变。
非静态方法getArea()不能从静态上下文中引用:
这个错误通常发生在尝试在静态方法或静态代码块中调用非静态方法时。您需要确保getArea()是在非静态上下文中被调用的,比如在一个实例方法中。但是,从错误信息来看,这个调用似乎是在Shape.java的某个静态方法或静态代码块中发生的。您需要检查Shape.java中的相关代码,并确保getArea()是在实例上被调用的。
解决方案:确保getArea()是在类的实例上被调用的,或者将getArea()声明为静态方法(但这通常不是推荐的做法,因为面积通常与特定的形状实例相关联)。
print()方法在Circle和Rectangle中不能覆盖Shape中的静态方法:
这个错误表明Shape类中的print()方法是静态的,而Circle和Rectangle中的print()方法是实例方法。在Java中,静态方法不能被实例方法覆盖(或重写),因为静态方法是属于类的,而不是类的实例。
解决方案:将Shape类中的print()方法改为非静态的,或者将Circle和Rectangle中的print()方法也声明为静态的(但这通常不是面向对象编程的最佳实践)。