[Java基础]面向对象-关键字分析:this,static,final,super

系列文章目录

【Java基础】Java总览_小王师傅66的博客-CSDN博客

[Java基础]基本概念(上)(标识符,关键字,基本数据类型)_小王师傅66的博客-CSDN博客

[Java基础]基本概念(下)运算符,表达式和语句,分支,循环,方法,变量的作用域,递归调用_小王师傅66的博客-CSDN博客

[Java基础]面向对象_小王师傅66的博客-CSDN博客

[Java基础]面向对象-内存解析_小王师傅66的博客-CSDN博客

Java字节码分析快速入门/字节码执行分析(一)_java 字节码入门_小王师傅66的博客-CSDN博客

JVM-运行时数据区_小王师傅66的博客-CSDN博客


目录

系列文章目录

前言

一、this

是什么?

举个例子

二、static

是什么

举个例子

三、final

四、super

总结


前言

        在前面的文章中,我们讲过Java关键字是电脑提前定义好的,有特殊意义的标识符。Java关键字对编译器有特殊意义,用来表示一种数据类型,或程序的结构。关键字不能用来做为对象,类,方法,包,参数的名称。在这篇文章中,我们将介绍Java类中常用的关键字的使用:this,static,final,super


一、this

是什么?

1、在类的方法或属性中使用this关键字,代表使用该方法或属性所属实例对象的引用;

2、当必须指出当前使用方法的对象时,要使用this;

3、有时使用this可以区分成员变量和方法参数重名的情况;

4、this可以看做一个变量,它的值是当前对象的引用;

举个例子

class CirclePoint {
    private double x;
    private double y;

    CirclePoint() {
    }

    CirclePoint(double x, double y) {
        this.x = x; // 成员变量和参数名相同,使用this区分
        this.y = y;
    }

    CirclePoint moveLeft(){
        x--;
        return this;  // 返回当前对象的引用
    }
}

        另外,在实例方法、实例初始化块和构造方法中,局部变量表第0位都存放着当前对象的引用,方便通过this关键字访问对象本身。 (在静态方法、静态初始化块、类构造器中没有this对象的概念,静态方法的栈帧由该类的class对象创建,静态方法依赖类本身;局部内部类中,内部类没有继承外部类,所以局部内部类的方法中,第0位也不会存放外部类的引用。)

二、static

是什么

        在类中,用static声明的变量是静态变量,是类的公共变量,在第一次使用时初始化;静态变量对于该类的所有对象来说只有一份;

        在类中,用static声明的方法是静态方法。非静态方法,需要在生成对象时产生。调用静态方法时,不会将对象的引用传递给它,所以在静态方法中不能调用非静态成员。

        可以通过对象引用或类名访问静态成员,不需要实例化,通常用来存储类级别的信息。

举个例子

1、声明静态变量
public class Demo {
  public static int value = 10;
}
2、声明静态方法 
public class Demo {
  public static void print() {
    System.out.println("Static method");
  }
}
3、静态初始化块
public class Demo {
  static {
    System.out.println("Static initializer"); 
  }
}
 
4、静态内部类
public class Outer {
  
  static class Inner {
    public static void show() {
      System.out.println("Static inner class");
    }
  }
  
}
5、静态导入
import static java.util.concurrent.TimeUnit.NANOSECONDS;

 long startNanoTime = nanoTime();

        静态变量和静态方法都独立于对象存在,不需要创建实例就可以访问,在jvm中存放在方法区中。

        这里需要注意的是,方法区和数据段是两个概念。 数据段是操作系统概念,是进程地址空间中的一部分,用于存储全局变量和静态变量。方法区是JVM概念,是一块逻辑区域,存储类信息、静态变量和常量池等数据。两者的主要区别在于: 数据段是进程级的,每个进程都有自己的数据段,仅可在进程内访问。方法区是JVM级的,所有线程共享一块共享的方法区,可跨线程访问。两者的关系是: JVM会向操作系统申请一块 native 内存作为进程的数据段。 然后从这块内存中划分出一部分作为方法区使用。 方法区中的静态域部分对应于这个进程的数据段。所以方法区和数据段不是包含关系,而是两个不同层次的概念。数据段存储于进程内存空间中,而方法区逻辑上属于JVM的一部分,但最终也是映射到 native 内存的数据段区域进行存储的。 

三、final       

        final关键字,可以用来声明变量,方法,类,参数,其主要作用是使数据不可修改,进而保证系统的安全性和可靠性。

1、 final变量把一个变量声明为final后,它就不能被重新赋值,即变成一个常量。例如:

final int AGE = 25;
AGE = 30; //错误,不能重新赋值

2、final方法把一个方法声明为final后,它就不能被子类重写。例如:

public final void print(){
  System.out.println("Hello");
}

public class B extends A {
  public void print(){ //错误,不能重写final方法
    System.out.println("World");
  }
}

3、 final类把一个类声明为final后,它就不能被继承。例如:

final class A {}

class B extends A { //错误,不能继承final类
}

4. final参数 把一个方法的参数声明为final后,它就成了一个常量不可改变。例如:

void method(final int a) {
  a = 20; //错误,不能重新赋值
}

四、super

        在Java中,使用super引用基类的成员。

1、调用父类的构造方法:在子类的构造方法中使用super()可以调用父类的构造方法。

public class Father {
  public Father() {
    System.out.println("Father的构造方法");
  }
}

public class Son extends Father {
  public Son() {
    super(); // 调用父类的构造方法
    System.out.println("Son的构造方法"); 
  }
}

2.、调用父类的方法:如果子类重写了父类的方法,可以使用super.方法名() 调用父类的方法。

public class Father {
  public void print() {
    System.out.println("Father");
  }
}

public class Son extends Father {
  public void print() {
    super.print(); // 调用父类的print()方法
    System.out.println("Son");
  }
}

        使用super可以访问父类的构造方法或方法,避免被子类重写或隐藏。它在继承关系中发挥着重要作用。


总结

        在这篇文章中,我们主要学习了Java的4个关键字:this,static,final,super。this可用于获取方法、属性所属对象的引用;static标识公共变量,公共方法,在开发过程中,可减少重复的代码,节省内存空间;final使数据不可改变,保证系统的安全性和可靠性。super关键字,使子类可以访问到基类的方法和属性。

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