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();   
    }

结果

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

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