首页 > 其他分享 >用父类的对象引用子类对象中重写的方法 静态方法重写

用父类的对象引用子类对象中重写的方法 静态方法重写

时间:2024-09-12 13:13:14浏览次数:11  
标签:静态方法 子类 Shape sh double print 重写 public

用父类的对象引用子类对象中重写的或继承的方法
比如,以下程序中,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()方法也声明为静态的(但这通常不是面向对象编程的最佳实践)。

标签:静态方法,子类,Shape,sh,double,print,重写,public
From: https://www.cnblogs.com/hutbluo/p/18381514

相关文章

  • Java中的继承和重写
    ###Java中的继承关系继承是面向对象编程(OOP)中的一个核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以重用父类的代码,并且可以在不修改父类的情况下扩展或修改其行为。在Java中,继承关系通过`extends`关键字来实现。####1.继承的基本概念在Java中,......
  • 静态成员、静态方法、静态代码块
    静态成员      静态数据成员是属于类的,并且为这个类所有对象共享,只占一块内存空间、      随着类的加载而先创建出来,然后对象才被创建出来。      一般是通过类名去访问去访问、修改,不推荐,(因为如果用对象去访问,结果可能被覆盖,后续可能混......
  • 【SpringBoot】静态方法获取 bean的
    背景:使用springboot,要从spring容器里面取到一个bean,那是很容易的。但从静态方法里面取出一个bean,有什么方法呢?比如:场景1:要写一个工具类,可以提供静态方法去获取一个bean。场景2:要写一个工具类,可以提供静态方法去获取一个bean,并且这个工具类不能给spring管理(因为常规操作,交给......
  • 方法重载和方法重写
    1.方法重载有时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如,杂技师能训练动物,对于不同的动物有不同的训练方式:publicvoidtrain(DogDog){//训练小狗站立、排队、做算术···}publicvoidtrain(Monkeymonkey){//训练小......
  • IIS:部署VUE前后端分离,重写URL
    启用IIS路由和ULR重写功能  详细过程:“IIS:URLrewrite转发请求-le.li-博客园(cnblogs.com)”配置URL重写后,与网站同级别路径有个web.config <?xmlversion="1.0"encoding="UTF-8"?><configuration><system.webServer><rewrite>......
  • 2-4Java重写与重载
    Java重写与重载重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比......
  • 使用AtomicInteger原子类尝试优化分析
    1.使用AtomicInteger原子类尝试优化分析Java的java.util.concurrent.atomic包提供了一些原子类,可以在并发编程中避免显式加锁。最简单的我们可以使用AtomicInteger来替代显式的锁。packageorg.zyf.javabasic.thread.lock.opti;importjava.util.concurrent.atomic.AtomicInteger......
  • 简单谈谈方法重载和方法重写(编译时多态和运行时多态)
    这篇文章来聊一聊方法重载和重写到底是有什么区别,重载实现的是编译时多态,而方法重写实现的是运行时多态,那什么又是编译时多态和运行时多态呢?定义一个Animal类,publicclassAnimal{publicvoidsay(intage){System.out.println("我的年龄是"+age);}......
  • Python中的方法重写与多态:解锁编程的无限可能
    在编程的世界里,灵活性与扩展性往往是衡量一个语言是否强大、易于维护的关键指标。Python,作为一种被广泛使用的高级编程语言,不仅以其简洁易读的语法赢得了众多开发者的喜爱,更因其支持多种面向对象特性而备受青睐。其中,“方法重写”与“多态”便是两个核心概念,它们不仅能够极......
  • Python中的方法重写与多态:解锁编程的无限可能
    在编程的世界里,灵活性与扩展性往往是衡量一个语言是否强大、易于维护的关键指标。Python,作为一种被广泛使用的高级编程语言,不仅以其简洁易读的语法赢得了众多开发者的喜爱,更因其支持多种面向对象特性而备受青睐。其中,“方法重写”与“多态”便是两个核心概念,它们不仅能够极大地提高......