Java泛型与继承和超类:从小白到实践达人

在Java编程中,理解和掌握**extendssuperreflection(反射)**是非常重要的概念。这些机制不仅帮助我们实现代码的复用,还为程序的灵活性和扩展性提供了强大的支持。


一、extends:继承与超类

1. 什么是 extends?

在Java中,classinterface可以通过extends关键字来继承父类(super class)或者父接口(super interface)。这种机制允许我们将代码复用,并扩展现有类的功能。

2. extends 的语法

基本语法如下:

class ClassName extends SuperClassName {
    // 类体
}
  • ClassName:子类或子接口的名称。
  • SuperClassName:父类或父接口的名称。

3. 示例

示例1:继承一个简单的父类

public class Parent {   // 父类
    public void talk() {
        System.out.println("Parent talk");
    }
}

public class Child extends Parent {   // 子类
    public void talk() {
        System.out.println("Child talk");
    }
}

在上述代码中,Child类通过extends Parent继承了父类Parent的所有属性和方法。

示例2:继承一个接口

interface Base {   // 父接口
    void method();
}

public class Child extends Object implements Base {   // 子类同时实现接口
    @Override
    void myMethod() {
        System.out.println("Child's method");
    }
}

Child类既继承了Object的属性,又实现了父接口Base中的方法。

4. extends 的作用与意义

  • 复用代码:减少重复编写逻辑。
  • 代码扩展性:通过继承,可以随时增加新功能。
  • 信息隔离:子类只继承父类的属性,不会影响父类的行为。

二、super:调用基类构造函数

在Java中,super关键字用于调用父类(或基类)的构造函数。它是一个特殊的保留字,必须大写。

1. super 的语法

基本语法如下:

void super(int i);   // 调用基类构造函数
  • 在子类或子接口中,调用父类的构造函数时,需要使用super()
  • 如果不需要显式调用基类构造函数,则可以省略参数。

2. 示例

示例1:显式调用基类构造函数

public class Child extends Parent {   // 子类
    public Child() {
        super();   // 调用父类的构造函数
        System.out.println("Child object created");
    }

    public void talk() {
        System.out.println("Child's talk");
    }
}

在上述代码中,子类Child的构造函数调用了基类Parent的构造函数。

示例2:隐式调用

public class Child extends Parent {   // 子类
    public Child() {
        System.out.println("Child object created");
    }

    public void talk() {
        System.out.println("Child's talk");
    }
}

如果没有显式地使用super(),则默认调用父类的构造函数(除非基类或父类本身没有定义构造函数)。

3. super 的作用与意义

  • 继承构造逻辑:确保子类能够正确调用父类的初始化操作。
  • 代码复用:避免手动编写构造函数,直接继承父类的构造逻辑。
  • 异常处理:如果父类有显式抛出的异常,需要通过super()进行处理。

三、泛型(Generics)

1. 什么是泛型?

泛型是一种编程范式,允许程序在不固定类型的情况下进行操作。它使代码更加灵活和抽象,可以避免重复编写相同逻辑。

2. 泛型的关键概念

  • TypeVariable:泛型的类型变量,用于表示具体类型。
  • Generic Parameter:泛型参数的名称,用于描述类型。
  • Generics Method:带有泛型参数的方法或类。

3. 示例

示例1:定义一个泛型类

public class List<T> {   // 泛型参数T代表元素的类型
    public T get(int index) {
        return elements[index];
    }
}

List<String> stringList = new ArrayList<>();   // 创建一个字符串列表
stringList.add("Hello");
System.out.println(stringList.get(0));   // 输出 "Hello"

在上述代码中,List是泛型类,T表示元素的类型。通过定义get(int)方法,并在实例化时传入具体类型(如String),实现了动态数据处理。

示例2:使用泛型接口

import java.util.List;

public class Program {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>(args);
        
        // 检查是否为空
        if (stringList.isEmpty()) {
            System.out.println("No strings");
        } else {
            String firstString = stringList.get(0);
            System.out.println(firstString);
        }
    }
}

这里,List表示一个包含字符串类型的列表。通过泛型接口实现了对不同类型的元素进行操作。

4. 泛型的作用与意义

  • 代码抽象:使代码更具概括性。
  • 类型安全:确保变量和方法的工作类型,避免兼容性问题。
  • 复用性高:同一方法可以处理多种数据类型,提升代码的重用率。

四、instanceof 关键字

1. 什么是 instanceof

instanceof关键字用于判断一个对象是否属于某个类或接口。它返回布尔类型的布尔值。

2. instanceof 的语法

基本语法如下:

boolean result = (Object o) instanceof Class<?>;   // 判断o是否是Class的实例
  • Class是一个类型参数,表示目标类。
  • 如果对象o的实际类型属于该类或其子类,则返回true

3. 示例

示例1:判断具体类型

public class Test {
    public static void main(String[] args) {
        Object obj = new Integer();   // 实例化整数对象

        if ((obj instanceof Integer)) {
            System.out.println("obj is an instance of Integer");
        } else {
            System.out.println("Not an Integer");
        }
    }
}

在上述代码中,instanceof判断了obj是否是Integer类的实例。

示例2:继承关系

public class Test {
    public static void main(String[] args) {
        Object obj = new MySubclass();   // 实例化子类

        if ((obj instanceof MyClass)) {
            System.out.println("MySubclass extends MyClass");
        } else {
            System.out.println("Not a subclass of MyClass");
        }
    }
}

public class MyClass {   // 基类
    public abstract void myMethod();
}

public class MySubclass extends MyClass {   // 子类
    @Override
    public void myMethod() {
        System.out.println("MySubclass's method");
    }
}

这里,instanceof判断了obj是否是MyClass的实例,结果为真。

4. instanceof 的作用与意义

  • 类型检查:用于验证对象的实际类型。
  • 继承关系检测:判断对象是否属于某个基类或子类。
  • 动态反射:在运行时动态判断类型,提高代码灵活性。

总结

通过本次学习,我们掌握了以下知识点:

  1. extends用于继承父类的属性和方法,减少重复编码。
  2. super()用于调用父类的构造函数或初始化逻辑。
  3. 泛型允许在不固定类型的情况下编写代码,提升代码的复用性和灵活性。
  4. instanceof关键字用于判断对象的具体类型。

这些知识点在Java编程中非常基础

你可能感兴趣的:(JAVA,java,开发语言)