百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Java关键字:final,static,this,super

myzbx 2025-07-21 16:28 4 浏览

1. final 关键字:

  • final 关键字,意思是最终的、不可改变的,初始化之后就不能再次修改 ,用来修饰类、方法和变量,具有以下特点:
  • final 修饰的类不能被继承,final类中的所有成员方法都会被隐式的指定为 final 方法;
  • final 修饰的方法不能被重写;
  • final 修饰的变量是常量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象;

final的使用场景:使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化了)。类中所有的 private 方法都隐式地指定为 final。

2. static 关键字:

static 关键字主要有以下四种使用场景:

  • 修饰成员变量和成员方法: 被static 修饰的成员属于类,不属于单个这个类的某个对象,也就是说被类中所有对象共享,可以并且建议通过类名调用(创建对象来调用也不报错,不建议 )。被static声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名, 类名.静态方法名()
  • 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次;
  • 静态内部类(static 修饰类的话只能修饰内部类): 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非 static 成员变量和方法。
  • 静态导包(用来导入类中的静态资源,1.5 之后的新特性): 格式为:import,static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。

3. this 关键字:


this 是自身的一个对象的引用,可以简单地理解为代表对象本身,(本质上this是一个变量,存储的是当前对象的地址)。站在内存的角度,也就是说:this是指向对象本身的一个指针。

this 的用法在 Java 中大体可以分为3种:

  • 普通的直接引用this是当前对象的一个引用,相当于是指向当前对象本身。
  • 形参与成员名字重名,用 this 来区分:
class Person {
    private int age = 10;
    public Person(){
    System.out.println("初始化年龄:"+age);
}
    public int getAge(int age){
        this.age = age;
        return this.age;
    }
}
 
public class TestDemo {
    public static void main(String[] args) {
        Person assassin = new Person();
        System.out.println("assassin's age is " + assassin .getAge(12));
    }
}

运行结果:



可以看到,这里 agegetAge 成员方法的形参,this.agePerson 类的成员变量。

  • 引用构造函数
    下面与
    super一起讲,thissuper很像,都是对象的引用;

4. super 关键字:

super可以理解为是指向自己父(超/基)类对象的一个指针,指向的是离自己最近的一个父类。

super 也有三种用法:

普通的直接引用

this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。

子类中的成员变量或方法与父类中的成员变量或方法同名

实例:

package com.test;

class Country {
    String name;
    void value() {
        name = "China";
    }
}
class City extends Country {
    String name;
    void value() {
        name = "Shanghai";
        super.value();      //调用父类的方法
        System.out.println(name);
        System.out.println(super.name);
    }
    public static void main(String[] args) {
        City c=new City();
        c.value();
    }
}

运行结果:

可以看到,这里既调用了父类的方法,也调用了父类的变量。若不调用父类方法 value(),只调用父类变量 name 的话,则父类 name 值为默认值 null

引用构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

使用 this 和 super 要注意的问题:

  • 在构造器中使用 super() 调用父类中的其他构造方法时,该语句必须处于构造器的首行,否则编译器会报错。另外,this 调用本类中的其他构造方法时,也要放在首行
    -thissuper不能用在static方法中。

简单解释一下:

被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享。而 this 代表对本类对象的引用,指向本类对象;而 super 代表对父类对象的引用,指向父类对象;所以, this 和 super 是属于对象范畴的东西,而静态方法是属于类范畴的东西。

相关推荐

java基础都在这了,小主们拿去吧(java基础总结大全)

-----面向对象---------面向对象和面向过程的区别?面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事务在整个问题中的行为。面向过程是分析出解决问...

Java 8:一文掌握 Lambda 表达式 | CSDN 博文精选

作者|Android大强哥责编|郭芮出品|CSDN博客本文将介绍Java8新增的Lambda表达式,包括Lambda表达式的常见用法以及方法引用的用法,并对Lambda...

如何理解Python类中的self?(python方法中self.属性)

许多python初学者,在接触到python面向对象的时候,就被类中包含的方法中的self打败了,不知道self是何物?既然写在方法中,是必须参数,为何在调用方法的时候不给它传参数还能正常运行?和我们...

javascript的this用法(javascript中的this)

this是Javascript语言的一个关键字。它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,functiontest(){this.x=1;}随着函数使用场合的不同,th...

JavaScript 的 this 原理是什么?(js中this的含义)

JavaScript中的this是一个关键字,代表当前执行代码的上下文对象。它的值在运行时确定,根据不同的调用方式和执行环境,this的值也会发生变化。具体来说,this的取值规则如下:如果...

小白学习Java开发如何入门?你可能需要这份学习路线图

21世纪进入信息时代,信息科技给人类的生产和生活方式带来了深刻的变革,信息产业已成为推动国家经济发展的主导产业之一,Java作为含金量极高的一门IT技术,很多人希望从事这个行业,那么想学好Java,要...

Java类与对象知识点总结(java第十一章类和对象)

#头号有新人##java#1.类与对象java是一门纯面向对象的语言,在java面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要是要依靠对象之间的交互完成一件事情。用面向对象的思想...

JavaScript面试题精选:10个高频问题详解

引言JavaScript是现代Web开发的支柱。无论您是在准备面试还是复习知识,这里有10个经常被问到的JavaScript问题,配有简洁准确的答案。1.var、let和const有什么区别?v...

三石说:java基础 类与对象(java类和对象总结)

类:类是封装对象的行为和属性的载体,具有相同属行和行为的一类实体。类中包含方法和属性。类中的构造方法:1.构造方法没有返回值2.名称与类名相同,在构造方法中可以为成员变量赋值,也就是初始化成员变量,若...

C#自学——委托、LINQ(c#中委托)

委托的概念委托是一种可以指向方法的数据类型(委托类型),可以声明委托类型的变量数据类型指的是类似类的,前面提到过一切皆对象,委托就是将方法当作对象使用声明委托delegate返回值类型委托类型名称...

JVM(三)对象的生死判定和算法详解

导读:对象除了生死之外,还有其他状态吗?对象真正的死亡,难道只经历一次简单的判定?如何在垂死的边缘“拯救”一个将死对象?判断对象的生死存活都有那些算法?本文带你一起找到这些答案。在正式开始之前,我们先...

这几道面试题,可以考考自己(面试真题去哪里找)

选择几道主流面试题,让大家自我检验一下,理论与实践相结合,才能更容易拿到高薪。Copy如何在.NET中做deepcopy?1)使用序列化反序列化对象实现深度克隆2)使用反射实现深度克隆trycat...

掌握 C# 和 .NET:常用术语与概念(c#用于什么)

在群里看到一则招聘信息,《基本功扎实,对DDD、OO、IOC、AOP等有深刻认识,熟悉常用设计模式。》OO是什么??查了一下原来OO原来指的是面向对象编程(OOP),于是就总结了一些常用的术语...

Java新特性:Lambda表达式(java lambda表达式的3种简写方式)

1、Lambda表达式概述1.1、Lambda表达式的简介Lambda表达式(Lambdaexpression),也可称为闭包(Closure),是Java(SE)8中一个重要的新特性。Lam...

JS的this指向问题(js如何改变this指向)

一句话概括this指向:谁调用this就指向谁这句话可能太过广义,那么请看以下的各种this指向场景1.箭头函数(=>)箭头函数this的指向不会发生改变,也就是说在创建箭头函数时就已经确定了...