2018-12-18 static,final,super,this关键字详解

1.final 关键字

final关键字可以用来修饰类,方法,变量
(一)修饰类
表示类不能被继承,
(二)修饰方法
表示方法不能被重写,也不能被重载
(三)修饰变量
当修饰成员变量/类变量的时候,变量在声明的时候必须要被赋初值。
当修饰局部变量的时候,变量可以在声明的时候不赋初值。
无论是修饰成员变量还是局部变量,当他们被赋初值之后,他们的值就不能在改变了。

2.this关键词

this关键字用以表示"引用类"的实例
this关键词还可以用来调用本类当中的其他构造器,但是要放在第一行,与super()用法差不多
this关键字是可以选择的,这个关键字的作用主要是是代码更加的清晰明了。
需要注意的是this只能在方法当中使用(构造器除外),有this为属性,无this为参数名

1.this关键字表示当前类的实例

package com.xd.map;

public class Test5 {    
    
    public static void main(String[] args) {
        Test5 test5=new Test5();
        test5.test();
    }
    public void test() {
        //注意this关键词不能出现在static方法当中,因为this可以省略
        this.mp();
    }
    public void mp() {
        System.out.println("zheshi ");
    }

}
   

2.this表示当前引用它的那个类的实例

package com.xd.map;

public class Test5 {    
    Child[] child;
    void manageEmployees() {
        //this表示当前引用它的child所在类的实例
        int totalEmp = this.child.length;
        System.out.println("Total child: " + totalEmp);
        //this表示当前引用它的report方法所在类的实例
        this.report();
    } 
    void report() { 
        
    }
}
   

3.this关键词用来调用本类当中的其他构造器(注意此时this必须在构造器当中)

package com.xd.map;

public class Test5 {    
    
   public Test5() {
       this(2);
       System.out.println("无参构造器...........");
   }
   public Test5(int a) {
       
       System.out.println("含有一个参数的构造器"+a);
   }
   public static void main(String[] args) {
    
       Test5 test5=new Test5();
   }

}
   

3.super关键字

super关键字用来从父类访问子类的方法与变量
1.调用父类的变量与方法(注意此时super可以处于普通方法当中)

class Parent {
    public int a;
    public  void  test() {
        System.out.println("a="+a);
    }
}
public class Child extends Parent {

    public static void main(String[] args) {
        
        Child child=new Child();
        child.mp();
    }
    public void mp() {
        System.out.println("super关键词测试...");
        super.a=10;
        super.test();//10
    }
}

2.调用父类的构造器(此时super必须要位于构造器当中的第一行)

class Parent {
    
    public Parent() {
        System.out.println("无参构造器...");
    }
    public Parent(int a) {
        System.out.println("有参构造器:a"+a);
    }
    
}
public class Child extends Parent {

    public Child() {
        //调用父类的构造器,必须要在第一行
        super(10);
        System.out.println("调用父类的有参构造器");
    }
    public static void main(String[] args) {
        
        Child child=new Child();
    }
}

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

super 调用父类中的其他构造方法时,调用时要放在构造方法的首行!this 调用本类中的其他构造方法时,也要放在首行。
this、super不能用在static方法中。

为什么super与this不能出现在static修饰的方法当:
被 static 修饰的方法属于类,不属于单个这个类的某个对象,被类中所有对象共享。而 this 代表对本类对象的引用,指向本类对象;而 super 代表对父类对象的引用,指向父类对象;所以, this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西。
即:this谁调用他,他就指向谁,super指向父类,然而被static修饰的成员只是属于本类的。

4.static关键字

1.static关键词主要有如下的几种用法

修饰成员变量和成员方法
静态代码块
修饰类(只能修饰内部类)
静态导包(用来导入类中的静态资源,1.5之后的新特性)

2.修饰成员变量与方法:
被static修饰的成员属于类,随着类的记载而加载,被static 声明的成员变量属于静态成员变量,静态成员变量存储在java内存区域的方法区当中,方法区与堆区一样,都是一个内存的共享区域,在java虚拟机当中将方法区看做是堆的一部分,他用来存储被jvm加载的类信息,常量,静态变量,即时编译的代码。

3.静态代码块
静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—非静态代码块—构造方法)。 该类不管创建多少对象,静态代码块只执行一次.

package com.xd.map;

public class Test5 {    

    public Test5(){
        System.out.println("这个是构造器");
    }
    {
        System.out.println("这是非静态代码块");
    }
   static {
       System.out.println("这是静态代码块");
   }
   
   
   public static void main(String[] args) {
       Test5 t5=new Test5();
       
   }
   

}
   
这是静态代码块
这是非静态代码块
这个是构造器

静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问.

图片.png

图片.png

4.静态导包

格式为:import static

这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法

  Math. --- 将Math中的所有静态资源导入,这时候可以直接使用里面的静态方法,而不用通过类名进行调用
  如果只想导入单一某个静态方法,只需要将换成对应的方法名即可
 
import static java.lang.Math.;

  换成import static java.lang.Math.max;具有一样的效果
 
public class Demo {
    public static void main(String[] args) {
 
        int max = max(1,2);
        System.out.println(max);
    }
}

5.静态方法与非静态方法
静态方法与非静态方法都是在调用的时候才执行的,为调用的时候是加载在方法区里面的

6.静态代码块与非静态代码块
静态代码块是在加载类的时候执行的,非静态代码块是在创建的对象的实例的时候执行的,静态代码块与非静态代码块都是构造器之前执行的,静态代码块只能执行一次,非静态代码块执行多次

package com.xd.map;

public class Test5 {    

    {
        System.out.println("这是非静态代码块");
    }
   static {
       System.out.println("这是静态代码块");
   }
 
   public static void main(String[] args) {   
   }
  
} 
这是静态代码块

非静态代码块与构造器的区别:非静态代码块是不对所有的对象进行初始化,构造器是对调用他的那个对象进行初始化

public class Test {
    public Test() {
        System.out.print(默认构造方法!--);
    }

     非静态代码块
    {
        System.out.print(非静态代码块!--);
    }
     静态代码块
    static {
        System.out.print(静态代码块!--);
    }

    public static void test() {
        System.out.print(静态方法中的内容! --);
        {
            System.out.print(静态方法中的代码块!--);
        }
    }
    public static void main(String[] args) {
   
        Test.test();-
    }

结果:

静态代码块!--静态方法中的内容! --静态方法中的代码块!-
public class Test {
    public Test() {
        System.out.print(默认构造方法!--);
    }

     非静态代码块
    {
        System.out.print(非静态代码块!--);
    }
     静态代码块
    static {
        System.out.print(静态代码块!--);
    }
    public static void test() {
        System.out.print(静态方法中的内容! --);
        {
            System.out.print(静态方法中的代码块!--);
        }
    }
    public static void main(String[] args) {
        Test test = new Test();   
    }

结果

静态代码块!--非静态代码块!--默认构造方法!--

非静态代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 标识符 什么是标识符就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字cla...
    奋斗的老王阅读 1,034评论 1 51
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 1,612评论 0 6
  • 南方的冬日,下了几天冷雨,莫名的孤寂与阴冷象嗖嗖嗖的北风,无孔不入! 往日,先生的大手是我纯天然“...
    南国茉莉CC阅读 230评论 0 1
  • 今天空巴学习会参观了三厂车间,从进料螺杆高温融化,搅拌增粘,纺丝,牵引,切丝烘干再打包入库。整个车间运作井然有...
    陈雪央阅读 167评论 0 0
  • 那个时候我们班有个耐看的女孩冰冰,耐看到什么程度呢?远远的看着她,自己就夹不到面条;面对面的看着她,喝水都呛。和她...
    火锅不暖阅读 356评论 0 2

友情链接更多精彩内容