JAVA中子类能修改父类吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中子类能修改父类吗?相关的知识,希望对你有一定的参考价值。

JAVA中子类能修改父类吗?如果能的话,在子类里调用父类的东西是修改后的了,可直接使用父类,还是原来的东西.

class Father
int x=10,y=20;
void speak()
System.out.println("I am Father:"+"x="+x+":y="+y);

void calculate(String s)
System.out.println(s+"x*y="+x+"*"+y+"="+x*y);


class Son extends Father
int x=30;
void speak()
System.out.println("I am Son:"+"x="+x+":y="+y);

void this_super()
super.x=100; //修改父类中的x,y值
super.y=200;
super.speak();
this.speak();
calculate("在子类中直接调用");//验证父类中的值已被修改
x=200;//this.x=200;
y=300;//this.y=300;向父类追踪,相当super.y



public class Ex4_3
public static void main(String args[])

Father father=new Father();
Son son=new Son();
System.out.println("----调用son对象的修改数据方法-----");
son.this_super(); //用son对象中的方法
System.out.println("----调用father对象计算方法-----");
father.calculate("修改后用father对象调用");



【运行结果】

---------------------调用son对象的修改数据方法--------------------
I am Father:x=100:y=200

----------------------调用father对象计算方法--------------------------
修改后用father对象调用x*y=10*20=200

----调用son对象的修改数据方法-----
I am Father:x=100:y=200
I am Son:x=30:y=200
在子类中直接调用x*y=100*200=20000
----调用father对象计算方法-----
修改后用father对象调用x*y=10*20=200

子类不能修改父类的方法,但是可以覆盖,就是子类中参数与名称都与父类相同,在子类中调用时调用子类的方法,若在父类中依旧调用父类中原方法。
参考技术A 看的我这个糊涂啊。后来才发现,原来Father father=new Father();
Son son=new Son();
这两个对象之间没有任何关系。因此,你所谓的子类修改父类是不会发生的。

子类里可以显式的调用父类的方法。
参考技术B 看的我这个糊涂啊。后来才发现,原来Father father=new Father();
Son son=new Son();
这两个对象之间没有任何关系。因此,你所谓的子类修改父类是不会发生的。
参考技术C 调用重写后的,不过要是静态方法就调用重写前的。

Java中子类重写父类的方法为啥返回值类型要小于等于父类方法的返回值类型?

个人观点:子类重写父类方法,假设子类和父类都有抛出异常的逻辑,假设父类抛出了IOException,而子类抛出了Exception(包含IOException),你可以想象一张小渔网怎么能网住一头鲸鱼,这就是子类抛出异常必须是父类异常的派生类的原因。
所以从返回上说,可以推出子类方法返回值类型不能大于父类方法,因为返回时抛出的异常必须能被父类捕获。
再补充一点:为什么重写还有一条规则是访问控制符必须高于父类?那是因为为了多态的实现。有时候父类需要上转型引用子类的方法实现多态,这就导致子类方法的访问控制符必须高于父类,否则子类里写成了private,父类还怎么访问?
同理,子类方法返回值类型小于父类,因为父类引用子类方法实现多态,你不能让一个返回空的方法的返回值经过一个不能返回空的方法出去。
参考技术A 方法覆盖的原则:
1:子类中的方法名必须跟父类中的相同,参数列表也必须相同
2:返回类型只有两种情况:
a:和父类相同
b:是父类中返回类型的子类
3:子类方法的访问权限,必须比父类方法的访问权限更大或者相同,但是必须注意如果父类访问权限是private,子类是继承不到的。所以不存在覆盖的概念

如果说返回值类型都不相同或者不是其返回类型的子类 那么就不能称之为方法的覆盖
参考技术B 首先你得明白继承的含义

字符类就是继承
继承之后有一个方法覆写的概念【非private】
覆写就是可以沿用父类的方法,但是沿用父类的该方法的返回值类型【这其实又涉及到了多态】

以上是关于JAVA中子类能修改父类吗?的主要内容,如果未能解决你的问题,请参考以下文章

java子类从父类继承某个属性,怎么添加特定的注解不影响父类

java子类能继承父类属性吗?

php子类的构造函数能继承父类的吗?

java 既然子类能继承父类的所有属性与方法,那子类不能不定义成员变量?

java子类中如何访问和修改父类成员

java中一个子类是不是可以继承父类的构造方法