首页 > 其他分享 >super与final关键字

super与final关键字

时间:2024-09-12 10:53:30浏览次数:9  
标签:变量 子类 关键字 父类 super final

在Java编程中,`super`关键字是一个非常重要的概念。它主要用于在子类中访问父类的成员,包括方法和变量。理解`super`关键字的使用场景和作用,对于编写继承关系复杂的代码非常有帮助。

#### 1. `super`关键字的基本概念

`super`关键字用于在子类中引用父类的成员。它可以用来调用父类的构造方法、访问父类的成员变量以及调用父类的方法。`super`关键字的主要用途包括:

- 调用父类的构造方法。
- 访问父类的成员变量。
- 调用父类的方法。

#### 2. 使用`super`调用父类构造方法

在Java中,子类的构造方法会自动调用父类的无参构造方法。如果父类没有无参构造方法,或者你希望子类调用父类的有参构造方法,就需要使用`super`关键字显式地调用父类的构造方法。

```java
class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    String breed;

    public Dog(String name, String breed) {
        super(name); // 调用父类的有参构造方法
        this.breed = breed;
    }
}
```

在上面的例子中,`Dog`类的构造方法通过`super(name)`显式地调用了父类`Animal`的有参构造方法,从而初始化了父类的`name`属性。

#### 3. 使用`super`访问父类的成员变量

当子类和父类具有相同名称的成员变量时,子类中的变量会覆盖父类的变量。如果需要在子类中访问父类的成员变量,可以使用`super`关键字。

```java
class Vehicle {
    int speed = 100;
}

class Car extends Vehicle {
    int speed = 120;

    void displaySpeed() {
        System.out.println("Car speed: " + speed); // 输出子类的speed
        System.out.println("Vehicle speed: " + super.speed); // 输出父类的speed
    }
}
```

在这个例子中,`Car`类中的`speed`变量覆盖了父类`Vehicle`的`speed`变量。通过`super.speed`,我们可以在子类中访问父类的`speed`变量。

#### 4. 使用`super`调用父类的方法

当子类重写(Override)了父类的方法时,如果需要在子类中调用父类的方法,可以使用`super`关键字。

```java
class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        super.makeSound(); // 调用父类的makeSound方法
        System.out.println("Dog barks");
    }
}
```

在这个例子中,`Dog`类重写了`makeSound`方法,并在方法中通过`super.makeSound()`调用了父类的`makeSound`方法。

### 总结

`super`关键字在Java中扮演着重要的角色,它使得子类能够方便地访问父类的成员。通过`super`,我们可以调用父类的构造方法、访问父类的成员变量以及调用父类的方法。理解并正确使用`super`关键字,有助于编写更加清晰和高效的继承关系代码。

### Java中的final关键字

在Java编程中,`final`关键字是一个非常重要的修饰符,它可以应用于类、方法和变量。`final`关键字的使用场景和作用各不相同,理解其用法对于编写高质量的Java代码至关重要。

#### 1. `final`关键字的基本概念

`final`关键字在Java中有三种主要用途:

- **final变量**:表示该变量的值不能被修改。
- **final方法**:表示该方法不能被子类重写。
- **final类**:表示该类不能被继承。

#### 2. `final`变量

当一个变量被声明为`final`时,它的值在初始化后就不能再被修改。`final`变量通常用于表示常量,常量的命名规范通常是全大写字母,单词之间用下划线分隔。

```java
final int MAX_SPEED = 200;
```

在上面的例子中,`MAX_SPEED`被声明为`final`变量,其值为200,且不能被修改。

##### 2.1 类中的`final`变量

在类中声明的`final`变量必须在声明时或在构造方法中进行初始化。

```java
class Car {
    final int MAX_SPEED;

    public Car() {
        MAX_SPEED = 200; // 在构造方法中初始化final变量
    }
}
```

##### 2.2 方法中的`final`变量

在方法中声明的`final`变量必须在声明时进行初始化。

```java
void calculateSpeed() {
    final int MAX_SPEED = 200;
    // MAX_SPEED = 250; // 编译错误,final变量不能被修改
}
```

#### 3. `final`方法

当一个方法被声明为`final`时,它不能被子类重写。`final`方法通常用于确保某些核心功能在子类中不会被修改。

```java
class Animal {
    final void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    // void makeSound() { // 编译错误,不能重写final方法
    //     System.out.println("Dog barks");
    // }
}
```

在上面的例子中,`Animal`类的`makeSound`方法被声明为`final`,因此`Dog`类不能重写该方法。

#### 4. `final`类

当一个类被声明为`final`时,它不能被其他类继承。`final`类通常用于确保类的实现不会被修改或扩展。

```java
final class MathUtils {
    public static int add(int a, int b) {
        return a + b;
    }
}

// class AdvancedMathUtils extends MathUtils { // 编译错误,不能继承final类
// }
```

在上面的例子中,`MathUtils`类被声明为`final`,因此不能有子类继承它。

### 总结

`final`关键字在Java中有着多重用途,它可以帮助我们编写更加安全和稳定的代码。通过将变量声明为`final`,我们可以确保其值不会被意外修改;通过将方法声明为`final`,我们可以防止其被重写;通过将类声明为`final`,我们可以防止其被继承。理解并正确使用`final`关键字,有助于编写更加清晰和高效的Java代码。

希望本文能够帮助你更好地理解super关键字和`inal关键字的用法,并在实际编程中灵活运用。

标签:变量,子类,关键字,父类,super,final
From: https://blog.csdn.net/2301_77081232/article/details/142169292

相关文章

  • ITextSharp 搜索关键字定位【转】
      #regionIText模块privateclassMyRenderListener:IRenderListener{publicvoidBeginTextBlock(){}publicvoidEndTextBlock(){}publicvoidRenderImage(ImageRenderInforenderInfo){}......
  • python根据关键字查找文件所在路径位置
    importosimportfnmatchdeffind_files(directory,keyword):"""在给定目录及其子目录中查找包含关键词的文件"""forroot,dirs,filesinos.walk(directory):forbasenameinfiles:ifkeywordinbasename:......
  • static和final有什么区别
    1.是什么    static 和 final 是Java中两个非常重要的关键字,它们各自有着独特的用途和含义,但也可以在某些情况下一起使用。下面我将详细解释这两个关键字的区别,并通过例子来加深理解。static关键字  static 关键字用于声明属于类本身而不是类的某个特定对象的......
  • Supervision:你的可复用计算机视觉工具箱!!
    推荐一个计算机视觉的工具箱,使用它你可以在你电脑上实现人体跟踪、分割、检测等一系列计算机视觉的场景。Supervision是由Roboflow精心打造的开源计算机视觉工具,已经在GitHub上赢得了超过16k颗星星,人气爆棚!如果你想在你电脑上实现如下AI功能,可以试试这个工具。你可......
  • 0基础开始Pine量化 多重时间框架EMA+Supertrend策略(附代码)
    0基础开始Pine量化多重时间框架EMA+Supertrend策略(附代码)基于金叉动量捕捉策略:多重时间框架指数移动平均线交叉系统和三重超级趋势交叉策略在发明者量化网站上回测试验啥是EMA(指数移动平均线)EMA(ExponentialMovingAverage)是一种用于金融市场技术分析的趋势跟踪指标。与简......
  • Python 中的 super(类名, self).__init__() 的含义
    Questionpytorch中定义的神经网络类的__init__()中,经常定义super(类名,self).__init__(),解释下这句话。比如:classTestNN(nn.Module):#初始化函数def__init__(self,parm1,...): super(TestNN,self).__init__() passAnswer这其实是python中的魔术......
  • 【Harmony】文本高亮显示、关键字凸显字体大小、颜色、背景色等风格自定义、嵌入html
    预览效果如图(网上找到demo,如有疑问请留评论蛤!):这个是超链接例子的数据结构如下:newCustomMessage($r('app.media.styled_text_user_image1'),'央视新闻','2小时前',[newCustomSpan(CustomSpanType.Normal,'【准备回家!'),newCustomSpan(CustomSpanType.Hasht......
  • 论文解析二: SuperGlue 同时进行特征匹配以及滤除外点的网络
    目录1.SuperGlue摘要2.SuperGlue网络结构2.1AttentionalGraphNeuralNetwork(注意图神经网络)2.1.1KeyPointEncoder:解决同时进行特征匹配以及滤除外点的网络2.1.2AttentionalAggregation2.2OptimalMatchingLayer(最优匹配层)2.3损失函数3.整体代码详解......
  • 中文关键字检索分析-导出到csv或者excel-多文件或文件夹-使用python和asyncio和pandas
    1.02版本把原来的tab一个个拼接成文件输出,改成pandas的dataframe使用asyncio库来使用协程,但是测试下来速度好像是差不多的。可能速度太快了,没能很好的测出来差异。原来的最初的代码是java版本的,现在用python重写一遍java版本使用completableFuture来异步IO,主要是文件输......
  • final
    用final修饰就表示不可以再被改变,已经是最终的了。final可以修饰方法、类和变量。用final修饰方法就表示这个方法是最终的方法,不能被子类重写。用final修饰一个类,就表示这个类是最终的类,不能被继承。用final修饰变量,则该变量应该被叫做常量,只能被赋值一次且在被使用......