java父类子类继承问题

    java的子类继承父类,在初始化时,初始化子类可读取父类的方法,但如果初始化父类,则不可读取子类的方法。

    创建对象时,Father c = new Child()   子类继承父类时,针对覆写的方法,调用的是子类方法,在静态属性上,不存在覆写,还是用的是父类的属性

public class Father {
    protected  int age;
    public Father(){
        age=38;
    }
    void eat(){
        System.out.println("父亲吃饭");
    }
}
public class Child extends Father {
    protected int age;
    public Child(){
        age=18;
    }
    @Override
    void eat(){
        System.out.println("孩子吃饭");
//        super.eat();  使用的是父类的该方法
    }
    void play(){
        System.out.println("孩子玩游戏");
    }
}
public class Test {

    public static void main(String[] args) {

        Father c = new Child();
        c.eat();       //输出为 “孩子在吃饭” 因为复写了父类的eat方法
//        c.play();
        System.out.println("年龄:"+ c.age);  //输出为“年龄:40” 属性/变量不存在重写和覆盖
    }
}

在父类子类加载顺序上,大致可以分为

1.父类静态代码块 (  java虚拟机加载类时,就会执行该块代码,故只执行一次)

2 .子类静态代码块 (  java虚拟机加载类时,就会执行该块代码,故只执行一次)

3.父类属性对象初始化

4.父类普通代码块(每次new,每次执行)

5.父类构造函数(每次new,每次执行)

6.子类属性对象初始化

7.子类普通代码块(每次new,每次执行)

8.子类构造函数(每次new,每次执行)

9.子类重写父类方法,调用时会调用子类重写之后的方法

public class A {
    public static String AAA = "A静态代码";

    public A(){
        System.out.println("A");
    }

    B b = new B();

}

public class B {
    public static String BBB = "B静态代码";
    public B(){
        System.out.println("B");
    }
}
public class C extends A {
    public static String CCC = "C静态代码";
    B b = new B();
    public C(){
        System.out.println("C");
    }

    public static void main(String[] args) {
        new C();
    }

}

运行结果BABC

进入程序后,先进入C类的父类,在A类中先加载了new B()方法【输出B】,然后执行A的构造方法【输出A】,进入C类,执行C的new B()【输出B】,执行C的构造方法【输出C】

 

### Java 父类 子类 继承 示例 代码 教程 #### 定义父类子类Java中,定义一个简单的父类`ParentClass`,该类有一个方法用于打印消息: ```java class ParentClass { public void printMessage() { System.out.println("这是父类的方法"); } } ``` 接着创建一个继承自`ParentClass`的子类`ChildClass`,并重写父类中的`printMessage()`方法来展示不同的行为[^3]。 ```java class ChildClass extends ParentClass { @Override public void printMessage() { System.out.println("这是子类重写的方法"); } } ``` 为了测试这两个类的行为,在主函数中实例化子类对象,并调用其方法查看输出结果: ```java public class Main { public static void main(String[] args) { ChildClass child = new ChildClass(); child.printMessage(); // 输出 "这是子类重写的方法" } } ``` 上述例子展示了如何让子类覆盖来自父类的方法实现。这有助于提高代码灵活性以及适应特定需求下的功能调整。 #### 构造器链式调用 除了属性和方法外,构造器也可以被子类所利用。考虑另一个场景,如果希望初始化过程中传递参数给父类,则可以在子类构造器内部使用关键字`super()`显式地调用父类带参构造器[^4]。 ```java class Parent { private int value; public Parent(int value) { this.value = value; } } class Child extends Parent { private String name; public Child(int value, String name) { super(value); this.name = name; } } ``` 在这个案例里,每当创建一个新的`Child`对象时都会先执行一次`Parent`类里的构造逻辑,从而确保了数据成员能够得到恰当设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值