java中的static、final、this、super关键字


static关键字

  1. 所有的static关键字修饰的都是类相关的,类级别的
  2. 所有被static关键字修饰的,都是采用"类名."的方式访问,不需要new对象访问
  3. static修饰的变量:类变量
  4. static修饰的方法:类方法
  5. static是不允许用来修饰局部变量(原因在变量和常量常量中做了解释)

注解:实例方法/变量等,必须先有对象,才能访问,不然可能会空指针异常(java.lang.NullPointerException)

注意:空指针异常只要"空引用"访问"实例"相关的都是会发生空指针异常的。

什么时候成员变量声明为实例变量,什么时候声明为静态变量?

  当一个对象独享一份的是实例变量,当所有对象共享一份的是静态变量

实例相关的:一定需要通过"引用."来访问。

静态相关的:使用"类名."访问,但是使用"引用."访问也行(建议不要这样使用,这样会让别人困惑这个变量是实例的)

注解:

  1. 当使用"引用."去访问静态变量或者静态方法时,在底层实际上是使用的"类名."去访问的静态变量,

  2. 当一个对象通过new关键字创建出对象,并且把对象创建出的地址赋值给变量,那么这个变量就是"引用"

  3. 当这个方法体当中,直接访问了实例变量,那么这个方法一定是实例方法

静态代码块语法

1 static {
2             java语句;
3             java语句;
4         }

static 静态代码块在什么时候执行呢?

  类加载时执行,并且只执行一次(特点/特征)

注解:静态代码块在类加载时执行,并且在主方法(main方法)执行之前执行,并且一般按照自上而下的顺序执行

静态代码块的作用:

  静态代码块实际上是SUN公司给我们java程序员的一个特殊的时刻/时机,这个时机叫做:类加载时机(就是在类加载前做一些准备工作)

注意:static块可以出现类中的任何地方,除了方法内部,任何方法内部都不行

原因:静态代码快是最先执行的,在类加载时就执行了(优先级最高)

注解:静态代码块里可以访问静态变量,因为静态变量也是在类加载时初始化,但是静态变量的代码必须在静态代码块之前进行声明和初始化才能访问。

当然除了静态代码块还有实例语句块

实例语句块的执行时间:

  只要是构造方法执行,必然在构造方法执行之前,自动执行"实例语句块"中的代码,每次调用构造方法时都会执行实例代码块

实例语句块语法:

1 {
2         java语法;   
3         java语法;          
4 }

this关键字

  1. this是一个引用,this保存当前对象的内存地址,并指向自身,this存储在堆内存当中对象的内部

  2. this可以使用在实例方法中,也可以使用在构造方法中。

  3. this出现在实例方法中,谁调用这个实例方法,this就是谁,所以this代表是:当前对象

  4. this不能使用在静态方法中。(this代表当前对象,静态方法中不存在当前对象)

  5. this. 大部分情况下可以省略,但是用来区分局部变量和实例变量的时候不能省略

  6. this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的构造方法,目的是代码复用

例如:

1 public Student(){
2     this(1,"曹操");
3 }
4 public Student(int id,String name){
5     this.id  = id;
6     this.name = name;
7 }

"this." 不能省略的情况(出现在set和构造方法中等等)、

例如:

 1 public class Test{
 2     private String name;
 3     
 4     public void setName(String name){
 5     this.name = name
 6   }
 7 public Test(String name){
 8     this.name = name;
 9  }
10 }

注意:main()方法是静态的,JVM调用main方法的时候直接采用的是"类名."的方式,所以main方法中没有this

super关键字

  1. super能出现在实例方法和构造方法中
  2. super的语法是:"super", super()
  3. super不能使用在静态方法中
  4. super. 大部分是可以省略的
  5. super()只能出现在构造方法的第一行,通过当前的构造方法调用"父类"中的其他构造方法(或者创建子类的时候,先初始化父类型特征)

super的使用:

  1. super.属性名 【访问父类非私有化的属性】
  2. super.方法名 【访问父类非私有化的方法】
  3. super(实参) 【访问父类非私有化的构造方法】

"super." 什么时候不能省略?

在父类和子类中都有相同的属性或方法,想要在子类中访问父类的"特征",super.就不能省略,使用super.来加以区分

例如:

 1 public class Test{
 2     public static void main(String[] args){
 3         DiaoCan dc = new DiaoCan("貂蝉");
 4         dc.dancing;
 5     }    
 6 }
 7 
 8 class Customer{
 9       String name;
10       public Customer(){}
11       public Customer(String name){
12       //还有个super(),自己不写,系统默认加上的
13       this.name = name;
14     }
15 
16 }
17 
18 class DiaoCan extends Customer(){
19         //子类也有个name属性
20         String name;
21       public DiaoCan(){}
22         public DianCan(String name){
23         super(name);
24   }
25   public void dancing(){//打印结果
26       System.out.println(this.name+"正在跳舞");//null正在跳舞
27       System.out.println(super.name+"正在跳舞");//貂蝉正在跳舞
28       System.out.println(name+"正在跳舞");//null正在跳舞    
29     }
30 }

注解:

  1. 当子类的一个构造方法第一行既没有this(),又没有super()的话,默认会有一个super(),表示通过当前子类的构造方法调用父类的无参构造方法,所以必须保证父类的无参构造方法是存在的

  2. this()和super()不能共存,它们都只能出现在构造方法的第一行

  3. 子类能继承父类的私有化属性和方法,但是无法直接调用

super(实参)的作用是:初始化当前对象的父类型特征,并不是创建父类对象

final关键字

  1. final修饰的类无法继承。

  2. final修饰的方法无法覆盖。

  3. final修饰的变量只能赋一次值.

  4. final修饰的引用一旦指向某个对象,则不能再重新指向其它对象,直到程序运行结束,但该引用指向的对象内部的数据是可以修改的。

  5. final修饰的实例变量必须手动初始化,不能采用系统默认值。(这个赋值在声明变量后面赋值可以,在构造方法里赋值也行)

  6. final修饰的实例变量一般和static联合使用,称为常量

例如:

1 public static final double PI = 3.1415926;

反正就一句话:final修饰的东西不能变

posted @ 2020-09-22 14:44  想变强的菜鸟  阅读(296)  评论(0编辑  收藏  举报