本案例是为了验证继承中 父类与子类 静态方法,实例方法,同名属性的的关系 ---继承?重写? 隐藏 ?

/**
 * 本案例是为了验证继承中 父类与子类 静态方法,实例方法,同名属性的的关系 ---继承?重写? 隐藏 ? *
 * @author 张永志 1279938986@qq.com
 */
class Father {
    String id = "010";
    String name = "Father";
    public static int age = 30;
    String pro = "IT";

    void run1() {
        System.out.println("父类的run1()方法");
        System.out.println(name + ":" + age);
    }

    static void run2() {
        System.out.println("父类的run2()方法");
    }
    void run3(){
        System.out.println("父类run3()方法");
    }
}
/**
 * 当子类中有父类的同名属性(变量)时,父类的变量被隐藏
 */
class Son extends Father {
    String name = "Son";
    int age = 2;
    int id = 010;// 注意此处的id为int类型且为八进制的010
    String sex = "男";
    @Override // 子类重写了弗雷德方法则
    void run1() {
        System.out.println("子类的run1()方法");
        // 下一行中的name和age的输出是什么先思考,再运行
        System.out.println(name + ":" + age + ":" + id);
        System.out.println(this.name + ":" + this.age + ":" + this.id);
        System.out.println(super.name + ":" + super.age + ":" + super.id);
    }

    // 注意 run2()为静态方法 在子类中再次写后 父类的方法被隐藏
    static void run2() {
        System.out.println("子类的run2()方法");
    }
    void run4(){
        System.out.println("父类run4()方法");
    }
}

public class TestExtends {
    public static void main(String[] args) {
        System.out.println("-------父类的方法和属性-----------");
        Father f1 = new Father();
        f1.run1();
        f1.run2();
        f1.run3();
        System.out.println("---------子类的方法和属性------------------");
        Son son1 = new Son();
        son1.run1();
        son1.run2();
        son1.run3();//继承父类的方法
        son1.run4();
        System.out.println("-----------重点来了:定义是父类, new的是子类如何执行的呢----------------");
        Father f2 = new Son();
        f2.run1();
        f2.run2();
        f2.run3();
        //f2.run4();   //不可运行  没有为类型 Father 定义方法 run4()
        System.out.println(f2.name + ":" + f2.age + ":" + f2.id);
        // System.out.println(f2.sex);//此处不可以运行运行子类的sex字段,因为父类没有sex字段
        /**
         * 解释原因:f2.run1() 因为子类中的方法是实例方法会覆盖掉父类的方法故运行的是子类的run1(); f2.run2()
         * 因为是类方法(静态方法)只会被隐藏不会被覆盖,故运行的方法是父类的run2(); f2.name和f2.age
         * 因为子类父类均有同名属性,,同名属性只会被隐藏不会被覆盖,故调用的是父类的name和age f2.sex不可以调用 因为父类没有
         * sex的属性
         */
        System.out.println("------将f2强转为Son类型 注意执行的情况---------------------");
        Son s2 = (Son) (f2);
        s2.run1();
        s2.run2();
        s2.run3();
        s2.run4();
        System.out.println(s2.name + ":" + s2.age + ":" + s2.id);
        System.out.println(s2.sex + ":" + s2.pro);
        // s2可以执行子类的全部属性和方法包含继承的属性和方法
        System.out.println("-------将父类强转为子类------------");
        Son s3 = (Son) f1; // 此语句编译时不会出错运行时会出现转换异常
        // 问:f2为什么可以强制转换为Son
        // 因为 f2本身是由Son类型转换过来的 只是回归自身而已
        s3.run1();
        s3.run2();
        s3.run3();
        s3.run4();
    }

}


运行情况:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值