java子类赋值给父类

本文通过一个示例代码解释了Java中子类变量如何隐藏父类变量,以及静态与非静态方法的重写规则。当使用父类引用指向子类对象时,调用成员变量会使用父类的变量,但可以通过强制类型转换访问子类变量。对于静态方法,子类的重写是隐藏,而非静态方法则是覆盖。同时,private方法虽然可以被子类覆盖,但调用时必须通过子类实例进行。
摘要由CSDN通过智能技术生成

package test1;

 

import java.io.*;

 

public class demo {

publicstatic void main(String[] arg){

Shapes=new Circle();

call(s);

}        

staticvoid call(Shape s){

s.f1();

s.f2();

s.f3();

((Circle)s).f3();

System.out.println(s.a);

}

}

class Shape{

staticint a=0;

voidf1(){

System.out.println("shape.f1()");

f2();

}

voidf2(){

System.out.println("shape.f2()");

}

staticvoid f3(){

System.out.println("shape.f3()");

}

}

class Circle extendsShape{

inta=1;

voidf2(){

System.out.println("circle.f2()");

}

staticvoid f3(){

System.out.println("circle.f3()");

}

}

运行结果

shape.f1()

circle.f2()

circle.f2()

shape.f3()

circle.f3()

0

 

 

如上图代码

1:对于变量,子类的变量只能隐藏父类的变量而不能覆盖(不论1:父类的变量是静态的,子类的变量是非静态的。2:父类的变量是非静态的,子类的变量是静态的。3都是静态。4:都是非静态)。此时若Shape s=new Circle()调用s.a使用的是父类的变量,可以通过强制转换((Circle)s).a来使用子类的变量。

2.对于方法的重写,

2.1如果父类的方法是静态的,那么子类必须已完全相同的静态方法来重写,此重写是隐藏,此时若Shape s=new Circle()调用s.f3()那么使用的是父类的方法。可以通过强制转换((Circle)s).f3()来使用子类的静态方法。

2.2如果父类的方法是default的,那么子类必须已完全相同的default方法来重写,此重写是覆盖,此时若Shape s=new Circle()调用s.f3()那么使用的是父类的方法。

3.如果父类的方法是private的,那么子类可以用其它类型来覆盖,但是调用时,必须强制转换成子类来调用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值