【java】子类与继承

目录

一、子类与父类

二、子类的继承性

三、子类与对象

四、方法重写

五、super关键字

六、final关键字

七、对象的上转型对象

八、继承与多态

九、抽象类与抽象方法


一、子类与父类

1、子类

由继承得到的类称为子类,被继承的类称为父类(超类)

Java不支持多重继承,即子类只能有一个父类。

在类的声明中,使用extends关键字来定义一个子类,格式如下:

class  子类名  extends  父类名{
    .......
}
2、子类的树型结构

二、子类的继承性

1、子类和父类在同一包中的继承性

类可以有两种重要的成员,即成员变量方法。子类继承了父类不是private的成员属性和成员方法。

2、子类和父类不在同一包中的继承性

子类只继承父类中的protected和public访问权限的成员变量和成员方法。

三、子类与对象

当使用子类构造方法创建对象时,不仅子类声明中的成员变量被分配了内存,而且父类的成员变量也分配了内存空间。

:子类继承的方法只能操作子类继承的成员变量或未继承的成员变量,不可能操作子类新声明的变量。

四、成员变量的隐藏和方法重写

1、成员变量的隐藏

当子类的成员变量和父类的成员变量出现同名时(变量类型可以不同),这样子就会隐藏所继承的成员变量。

特点

①子类对象已经自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量;

②子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的方法操作的成员变量一定是被子类继承或者隐藏的成员变量;

③子类继承的方法只能操作子类继承和隐藏的成员变量;

④子类新定义的方法可以操作子类继承和子类新声明的成员变量,但无法操作子类隐藏的成员变量(需要使用super关键字操作子类隐藏的成员变量)。

例如:

class Parent {
    int value = 10;
}
 
class Child extends Parent {
    int value = 20;
 
    void showValue() {
        int value = 30;
        System.out.println("Local value: " + value);
        System.out.println("Child value: " + this.value);
        System.out.println("Parent value: " + super.value);
    }
}
 
public class FieldHiding {
    public static void main(String[] args) {
        Child child = new Child();
        child.showValue();
    }
}
2、方法重写(overriding)

子类通过重写可以隐藏已继承的方法(方法重写又称方法覆盖)

重写规则

①如果子类可以继承父类的某个方法,这个子类就有权力重写这个方法;

②子类的方法名字,返回类型,参数类型个数都要和父类的一致才算重写。

重写目的

隐藏继承的方法,增加拓展新功能。


        重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限
高到低:public--->protected--->默认的--->private    

例如:

class Animal {
    void speak() {
        System.out.println("Animal speaks");
    }
}
 
class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("Dog barks");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog();
        myAnimal.speak(); // 输出 "Dog barks",因为 speak 方法被重写
    }
}

五、super关键字

1、用super操作被隐藏的成员变量和方法

子类一旦隐藏继承的成员变量/方法,那么子类创建的对象就不再拥有该变量/方法,该变量将归关键字super所有,可以使用super来访问。

2、使用super调用父类的构造方法

在加载子类的时候会使用super()调用父类的默认构造方法

例如:调用父类的构造函数(在构造函数中)

class Child extends Parent {
    public Child() {
        super(); // 调用父类的默认构造函数
    }
}

调用父类的构造函数(在子类的其他构造函数中):

class Child extends Parent {
    public Child(int value) {
        super(value); // 调用父类带参数的构造函数
    }
}

六、final关键字

final关键字可以修饰类(表示最终类,不能被继承)成员变量(表示常量,不能被修改)、方法中的局部变量(修饰方法表示最终方法,只能调用不能重写)

final class A {  

.....

 } 


:   final 修饰的类不能被继承,不能有子类

final 修饰方法,那么这个方法不允许子类重写,也就是说,不允许子类隐藏可以继承的final方法老老实实继承,不许任何修改。

例如:修饰基本数据类型变量

public final int i = 10;
// i = 20; // 这行代码会报错,因为i已经被初始化,不能再被更改。

修饰方法:

public class MyClass {
    public final void myMethod() {
        // 方法体
    }
}
 
// 下面的代码会报错,因为final修饰的方法不能被重写。
class MySubClass extends MyClass {
    @Override
    public void myMethod() {
        // 方法体
    }
}

修饰类:

public final class MyClass {
    // 类体
}
 
// 下面的代码会报错,因为final修饰的类不能被继承。
class MySubClass extends MyClass {
    // 类体
}

七、对象的上转型对象

上转对象不能操作子类新增的成员变量/方法(失掉这一部分属性);

上转对象可以访问子类继承或者隐藏的成员变量/方法,也可以调用子类继承的方法或子类重写的实例方法。调用方法时,调用的是子类重写的方法

例如:

class Animal {
    void speak() {
        System.out.println("Animal is speaking.");
    }
}
 
class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("Dog is barking.");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog(); // 上转型对象
        myAnimal.speak(); // 输出 "Dog is barking."
    }
}

在这个例子中,Dog 类继承自 Animal 类,并重写了 speak 方法。创建了一个 Dog 类型的对象,并将其上转型为 Animal 类型,然后调用 speak 方法。输出结果是 "Dog is barking.",即使调用的方法是在父类中定义的,但实际执行的是子类中重写的方法。

八、继承与多态

继承面向对象编程中的一种机制,允许一个类(子类)基于另一个类(父类)来创建。子类可以继承父类属性和方法,并且可以在不修改父类的情况下进行扩展,可以达到代码复用的目的。

class Animal {
    void speak() {
        System.out.println("Animal is speaking.");
    }
}
 
class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("Woof! Woof!");
    }
}
 
class Cat extends Animal {
    @Override
    void speak() {
        System.out.println("Meow! Meow!");
    }
}
 
public class PolymorphismExample {
    public static void main(String[] args) {
        Animal[] animals = {new Dog(), new Cat()};
 
        for (Animal animal : animals) {
            animal.speak();
        }
    }
}

:java不存在多继承,要用接口来实现多继承。

多态性就是指父类的某个方法被其子类重写时可以各自产生自己的功能行为。

九、抽象类和抽象方法

用关键字abstract修饰的类称为abstract类(抽象类)

abstract class A{
 ...
}

使用关键字abstract修饰的方法称为abstract方法(抽象方法)

abstract int min(intx,inty);
abstract类中可以有abstract方法,也可以没有abstract方法
abstract class A{                        //抽象类
     abstract int min(int x,int y);     //抽象方法
     int max(int x,int y){
            return x<y?y:x;
   }
}    

特点
①abstract类 不能用new运算符创建对象
 继承抽象类的类必须重写抽象类的抽象方法(不能使用abstract和final修饰同一个方法)

②abstract类中可以有abstract方法

③abstract的子类
 如果一个非抽象类继承该抽象类,必须重写父类的抽象方法(给出方法体),如果是抽象类继承抽象类则,可重写或者继承

④abstract类的对象作上转型的对象
 抽象类可以抽象出重要的行为标准,该标准用抽象方法来表示。

 抽象类声明的对象可以成为其子类的对象的上转型对象  

### Java 子类继承使用详解 Java继承机制允许子类父类继承属性和方法,从而实现代码的复用性和扩展性。以下是关于 Java子类继承的具体概念及其使用的示例。 #### 1. 子类继承父类的内容 子类可以从父类继承以下内容: - **公共方法**:子类可以直接继承并调用父类中的 `public` 和 `protected` 方法[^2]。 - **私有字段**:虽然子类会隐式继承父类的私有字段,但由于封装原则,这些字段无法直接访问[^1]。 - **构造器链**:尽管子类不会显式继承父类的构造方法,但在创建子类实例时,默认情况下会先调用父类无参构造函数来初始化父类部分的状态。 #### 2. 示例代码展示 下面是一段完整的代码演示了如何定义父子关系以及调用继承的方法: ```java // 定义父类 class Parent { private String name; // 私有字段 public Parent() { this.name = "Parent"; } public void display() { System.out.println("This is from parent class."); } } // 定义子类 class Child extends Parent { public void childMethod() { System.out.println("Child's own method."); } @Override public void display() { super.display(); // 调用父类同名方法 System.out.println("Overridden in child class."); } } // 测试程序 public class TestInheritance { public static void main(String[] args) { Child c = new Child(); // 调用子类自己的方法 c.childMethod(); // 调用重写的display方法 c.display(); } } ``` 上述代码展示了几个重要点: - 子类可以通过 `super` 关键字访问父类的成员或方法[^4]。 - 如果需要修改父类的行为,则可以在子类中覆盖(override)相应的方法,并加上 `@Override` 注解以确保安全。 #### 3. 输出结果解释 运行以上测试代码后得到如下输出: ``` Child's own method. This is from parent class. Overridden in child class. ``` 此结果显示了子类不仅能够执行自己新增的功能(`childMethod`),还能调整已有功能的表现形式(即覆写了`display()`)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值