final和static用法

目录


1.final

1.1修饰类

1.2修饰方法

1.3修饰方法

1.4修饰变量

2.static

2.1修饰成员变量

2.2修饰方法

2.3静态代码块

2.4修饰内部类

2.5static导入包

2.6static例子

2.6.1静态代码块

 2.6.2静态代码块和构造函数

2.6.3  面试题(继承、静态代码块、构造函数、成员变量)

2.6.4static代码块多个按照顺序执行


1.final

主要用法有以下四种:

用来修饰数据:变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;

用来修饰方法参数:在变量的生存期中它的值不能被改变;

修饰方法:该方法无法被重写;(不常用)

修饰类:该类无法被继承extends。(不常用)

1.1修饰类

以下代码编译器直接报错

packagefinalstudy;

/**

*@authoryuguang

*@date2021/2/3 10:24

*@description

* todo final修饰类无法被继承

*/

publicclassTestFinal01{

publicstaticvoidmain(String[] args){

ManPeople man =newManPeople();

        System.out.println(man.getAge());

    }

}

classManPeopleextendsPeople{

}

finalclassPeople{

privateString name;

privateintage;

publicStringgetName(){

returnname;

    }

publicvoidsetName(String name){

this.name = name;

    }

publicintgetAge(){

returnage;

    }

publicvoidsetAge(intage){

this.age = age;

    }

}

1.2修饰方法

编译器报错

packagefinalstudy;

/**

*@authoryuguang

*@date2021/2/3 10:24

*@descriptiontodo final修饰方法无法被重写override

*/

publicclassTestFinal02{

publicstaticvoidmain(String[] args){

People man1 =newManPeople();

        System.out.println(man1.getNameAndAge());

ManPeople man =newManPeople();

man.setAge(18);

man.setName("xixi");

        System.out.println(man.getNameAndAge());

    }

}

classManPeopleextendsPeople{

@Override

publicStringgetNameAndAge(){

return"不想告诉你";

    }

}

classPeople{

privateString name;

privateintage;

publicfinalStringgetNameAndAge(){

returnname +" : "+ age;

    }

publicStringgetName(){

returnname;

    }

publicvoidsetName(String name){

this.name = name;

    }

publicintgetAge(){

returnage;

    }

publicvoidsetAge(intage){

this.age = age;

    }

}

1.3修饰方法

编译器报错代码

packagefinalstudy;

/**

*@authoryuguang

*@date2021/2/3 10:24

*@descriptiontodo final修饰方法无法被重写,编译器直接报错

*/

publicclassTestFinal03{

publicstaticvoidmain(String[] args){

intage =1;

        System.out.println(age++);

        System.out.println(++age);

People man1 =newManPeople();

        System.out.println(man1.getNameAndAge());

ManPeople man =newManPeople();

man.setAge(18);

man.setName("xixi");

        System.out.println(man.getNameAndAge());

System.out.println(man.testFinal(18,"xixi"));

    }

}

classManPeopleextendsPeople{

@Override

publicStringgetNameAndAge(){

return"不想告诉你";

    }

}

classPeople{

privateString name;

privateintage;

publicStringtestFinal(finalintage,finalString name){

name ="不告诉你";

age =18;

returnname +" : "+ age;

    }

//重载

publicStringtestFinal(finalString name,finalintage){

returnname +" : "+ age;

    }

publicStringgetNameAndAge(){

returnname +" : "+ age;

    }

//重载

publicfinalStringgetNameAndAge(String name){

returnname +" : "+ age;

    }

publicStringgetName(){

returnname;

    }

publicvoidsetName(String name){

this.name = name;

    }

publicintgetAge(){

returnage;

    }

publicvoidsetAge(intage){

this.age = age;

    }

}

1.4修饰变量

package finalstudy;

/**

*@authoryuguang

*@date2021/2/3 10:24

*@description

* 包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。

* 对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;

*/

publicclassTestFinal04{

privatefinalStringname =null;

privatefinalintage;

publicTestFinal04() {

age =0;

    }

publicstaticvoidmain(String[] args) {

//变量只能被赋值一次且它的值无法被改变

finalintage;

age =18;

        System.out.println(age);

//        age = 19; //报错

    }

}


2.static

引入地址(https://www.cnblogs.com/adeng/p/6971366.html

java中static关键字主要有两种作用:

第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。

第二,实现某个方法或属性与类而不是对象关联在一起。

简单来说,在java语言中,static主要有5中使用情况:成员变量、成员方法、代码块,内部类和静态导包。

基本用法:

static修饰成员变量:该成员变量属于类变量,可以通过 ClassName.attributeName 直接引用,而不需要new出类的实例。

static修饰成员方法:该方法属于类的方法,可以通过 ClassName.methodName 直接引用,而不需要new出类的实例。

static修饰代码块:仅在类初始化的时候执行一次,且加载顺序是严格按照类中静态资源的定义顺序来加载的;静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问。;父类代码块->子类代码块。

static修饰内部类:static不能修饰普通类,只能修饰内部类,被static修饰的内部类的创建方式: new OuterClass.InnerClass()。

static导入包:语法“import static java.lang.Math.*”,这样在类中就可以直接使用Math类中的静态方法而不需要写类名,个人认为,在频繁使用某个类的时候比较方便,但是降低了可读性。并且不建议导入*

2.1修饰成员变量

publicclassTestStatic02{

publicstaticvoidmain(String[] args){

System.out.println(People.description);

        People.printDescription();

    }

}

classPeople{

publicstaticString description ="人";

publicstaticvoidprintDescription(){

System.out.println("输出介绍: "+description);

    }

}

2.2修饰方法

publicclassTestStatic02{


publicstaticvoidmain(String[] args){

System.out.println(People.description);

        People.printDescription();

    }

}

classPeople{

publicstaticString description ="人";

publicstaticvoidprintDescription(){

System.out.println("输出介绍: "+description);

    }

}

2.3静态代码块

package study_static;

//初始化的顺序 静态代码块 > 构造代码块 > 构造函数

// 只需要进行一次的初始化操作都放在static代码块中进行。

publicclassTestStatic03{

publicstaticvoidmain(String[] args) {

PersonWithStatic withStatic =newPersonWithStatic();

withStatic.setSexType(1);

        System.out.println(withStatic.getSexText());

PersonNoStatic noStatic =newPersonNoStatic();

noStatic.setSexType(2);

        System.out.println(noStatic.getSexText());

    }

}

classPersonWithStatic{

privateStringsexText;

privateIntegersexType;

//常量

privatestaticStringwoman;

privatestaticStringman;

static{

man ="男";

woman ="女";

    }

publicStringgetSexText() {

if(sexType ==1) {

            sexText = woman;

}else{

            sexText = man;

        }

returnsexText;

    }

publicIntegergetSexType() {

returnsexType;

    }

publicvoidsetSexType(IntegersexType) {

        this.sexType = sexType;

    }

publicstaticStringgetWoman() {

returnwoman;

    }

publicstaticvoidsetWoman(Stringwoman) {

        PersonWithStatic.woman = woman;

    }

publicstaticStringgetMan() {

returnman;

    }

publicstaticvoidsetMan(Stringman) {

        PersonWithStatic.man = man;

    }

}

classPersonNoStatic{

privateStringsexText;

privateIntegersexType;

privatestaticStringwoman ="女";

privatestaticStringman ="男";

publicStringgetSexText() {

if(sexType ==1) {

            sexText = woman;

}else{

            sexText = man;

        }

returnsexText;

    }

publicvoidsetSexText(StringsexText) {

        this.sexText = sexText;

    }

publicIntegergetSexType() {

returnsexType;

    }

publicvoidsetSexType(IntegersexType) {

        this.sexType = sexType;

    }

publicstaticStringgetWoman() {

returnwoman;

    }

publicstaticvoidsetWoman(Stringwoman) {

        PersonNoStatic.woman = woman;

    }

publicstaticStringgetMan() {

returnman;

    }

publicstaticvoidsetMan(Stringman) {

        PersonNoStatic.man = man;

    }

}


2.4修饰内部类

static一般用来修饰成员变量或函数也修饰代码块,一般不能修饰类,只有内部类才可以,被修饰的内部类可以直接作为一个普通类来用,不需要创建一个外部类的实例,而普通内部类的引用需要创建一个外部类的实例。

package study_static;

publicclassTestStatic05{

publicstaticvoidmain(String[] args) {

//非静态内部类需创建一个父类的实例,方能new

TestStatic05 father =newTestStatic05();

Inner inner = father.newInner();

inner.print();

//静态内部类可以直接new

InnerStatic innerStatic =newInnerStatic();

innerStatic.print();

    }

classInner{

publicvoidprint() {

System.out.println("Inner");

        }

    }

staticclassInnerStatic{

publicstaticvoidprint() {

System.out.println("InnerStatic");

        }

    }

}

classInner1{

}




2.5static导入包


packagestudy_static;

importstaticjava.lang.Math.random;

importstaticjava.lang.System.out;


/**

*@authoryuguang

*@date2021/2/4 9:28

*@descriptionstatic 导入包

*/

publicclassTestStatic06{


publicstaticvoidmain(String[] args){

doublerandom = Math.random();

out.println((int) (random *10000));

//直接引入Math下面static方法

        out.println(random());

        out.println(random());

    }

}


2.6static例子

2.6.1静态代码块


publicclassTestStatic04{

publicstaticvoidmain(String[] args) throws ClassNotFoundException{

Class aClass = Class.forName("study_static.People1");

//        System.out.println(People1.description);

//        People1.printDescription();

    }

}

classPeople1{

//静态代码块

static{

System.out.println("People1 init ,static code");

    }

//静态变量

publicstaticString description ="人";

//静态方法

publicstaticvoidprintDescription(){

System.out.println("输出介绍: "+description);

    }

//空构造方法

publicPeople1(){

System.out.println("constructor");

    }

}

2.6.2静态代码块和构造函数

静态代码块中:父>子

等级:    静态代码块>构造函数

package study_static;

publicclassdemo2extendsBase{

static{

System.out.println("test static");

    }

publicdemo2(){

System.out.println("test constructor");

    }

publicstaticvoidmain(String[] args){

newdemo2();

    }

}

classBase{


static{

System.out.println("base static");

    }

publicBase(){

System.out.println("base constructor");

    }

}

2.6.3  面试题(继承、静态代码块、构造函数、成员变量)

在一个类中: 静态代码块  > 成员变量 > 构造函数

父 > 子:如父的 静态代码块、成员变量、构造函数   大于子的

package study_static;

/**

*  类似地,我们还是来想一下这段代码的具体执行过程。首

* 1-先加载Test类,因此会执行Test类中的static块。

* 2-接着执行new MyClass(),而MyClass类还没有被加载,因此需要加载MyClass类。在加载MyClass类的时候,

* 发现MyClass类继承自Test类,但是由于Test类已经被加载了,所以只需要加载MyClass类,那么就会执行MyClass类的中的static块。

* 在加载完之后,就通过构造器来生成对象。而在生成对象的时候,

* 3---必须先初始化父类的成员变量,因此会执行Test中的Person person = new Person(),

* 而Person类还没有被加载过,因此会先加载Person类并执行Person类中的static块,接着执行父类的构造器,完成了父类的初始化,

* 然后就来初始化自身了,因此会接着执行MyClass中的Person person = new Person(),最后执行MyClass的构造器。

*/

//todo 静态代码块存在内存中只加载一次

publicclassTest{

Person person =newPerson("---4---Test");

static{

System.out.println("1---test static");

    }

publicTest(){

System.out.println("5----test constructor");

    }

publicstaticvoidmain(String[] args){

newMyClass();

    }

}

classMyClassextendsTest{

Person person =newPerson("----6----MyClass");

static{

System.out.println("2----myclass static");

    }

publicMyClass(){

System.out.println("7----myclass constructor");

    }

}

classPerson{

static{

System.out.println("3----person static");

    }

publicPerson(String str){

System.out.println("person "+ str);

    }

}

2.6.4static代码块多个按照顺序执行

publicclassdemo3{

static{

System.out.println("test static 0");

    }

static{

System.out.println("test static 1");

    }

publicstaticvoidmain(String[] args){

    }

static{

System.out.println("test static 2");

    }

static{

System.out.println("test static 3");

    }

}

参考资料:https://blog.csdn.net/xixiyuguang/article/details/113586859

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

推荐阅读更多精彩内容