`
929118967
  • 浏览: 20168 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
博客专栏
Fcebf22e-9505-38db-b3f2-65fdcc3fd6a5
java开发的深入浅出
浏览量:6892
文章分类
社区版块
存档分类
最新评论

java笔记之final和static关键字

 
阅读更多

前言

本文主要介绍final和static关键字。在介绍前先来聊聊类的加载顺序。

类的加载顺序

(1)初始化变量。对于静态变量肯定要首先进行初始化,因为后面的方法可能会使用这个变量,或者构造函数中也可能用到。而对于非静态变量而言,由于匿名块内、非静态方法和构造函数都可以进行操作(不仅仅是初始化),所以要提前进行加载和赋默认值。
(2)初始化静态代码块,多个静态代码块按顺序加载,这里需要注意:在这个顺序是类内书写的顺序,也是类加载的顺序.由于静态代码块可能会负责变量的初始化,或者是对象等的初始化,这样在构造函数或者方法中就变得可用了。
(3)匿名代码块,这个要后初始化于静态代码块,因为其依然属于实例对象,而不属于类。在这里可以对非静态成员变量进行初始化工作。
(4)构造函数 这里需要解释一下,为什么初始化子类必先初始化父类,由于子类可能会继承父类的属性或方法,所以肯定要先初始化父类了,而初始化父类则必须要调用父类的构造函数。
至于方法不用考虑,因为方法不用初始化.

正文

final

1)修饰类

该类不能被继承(在实际开发过程中尽量少使用final修饰类,因为系统要具备可扩展性和可维护性

2)使用final修饰方法,方法不能被重写

3)final 修饰属性:

被final修饰的属性必须初始化,初始化之后值不能改变(属性为简单类型时是值不变;属性为引用类型时是地址不变,其指向的对象的属性可以改变)

4)final修饰变量:

修饰方法的形参,该参数只能读不能写

修饰局部变量,一般在内部类使用(可以先定义,再赋值一次)

5)final定义常量:

public static final 类型 变量名 =值

static关键字

1)static 修饰属性

被static修饰的属性,是属于类级别的属性。他被该类所产生的对象所共有

1))静态属性的访问方式

在类的外部访问静态属性:类名。属性名

在类的内部访问静态属性:属性名即可,等价于类名。属性名

注:静态属性可以被非静态的方法和静态的方法中直接访问

2)static修饰方法:

被static修饰的方法,是属于类级别的方法。他是该类所产生的所有的对象所共享的方法

1))静态方法的访问方式:

1)))类名.方法名(参数),适用于类的内部和类的外部

2)))方法名(参数),适用于类的内部

2))注:

a.静态方法调用属性

只能直接调用静态属性,非静态的属性只能通过对象引用才能调用

b.静态方法调用方法

只能直接调用静态方法,非静态的方法只能通过对象引用才能调用

c.在静态方法中,不能使用this,super调用属性和方法(构造器不能使用static修饰)

原因是静态的方法先于非静态的属性和非静态的方法加载;具体参考下面的代码分析。

d.非静态的方法可直接调用静态的方法和静态的属性

3)static静态块:

语法:

在类体中:

static {

代码

}

注:static块只能在类体中定义,不能在方法中定义

1))执行方式:

static 块是在类加载时,该语句就会被执行;

且此语句只能被执行一次

(因为:类采用的懒加载的方式,也就是说,如果内存中的方法区已存在该类的代码,那么就不会加载第二次;

注:

a.java命令找到带有mian方法的类,通过类加载器该类加载到方法区

b.静态域:存放静态属性、静态方法和静态块。

2))静态块的应用场景:

加载配置文件,也可使用于只需加载一次的资源(如:读取文件,加载数据库驱动)

4)static修饰类(内部类)

语法:

static class 类名{

类体

}

1))特性:

1)))在静态内部类中访问外部类的成员

该成员必须是static的;可以使用外部类的对象引用来访问外部类的非静态成员

2)))静态内部类的实例化方式:

外部类类名。内部类类名 变量名 =new 外部类类名。内部类类名(参数列表);

3)))静态内部类可被四大访问控制修饰符所修饰

4)))静态内部类可直接调用外部类的静态方法;调用非静态的方法只能使用外部类的引用

5)))外部类访问静态内部类的静态方法:

外部类类名.方法名

外部类访问内部类的非静态方法:

内部类引用.方法名;

5)代码示例分析:(重点)

Joo.run(参数类表);

分析:

1))检查Joo是否存在代码区

2))若存在代码区,就不加载Joo代码。若不存在,就将Joo的代码加载到方法区中。

将被static修饰的属性、方法和静态块放置到静态域中,将普通方法放置在普通方法区中。

3))当Joo的代码加载完毕之后,立即执行static块;

4))通过Joo的地址在静态域中找到run方法,并且执行run方法。

Joo J=new Joo(参数类表);

1))检查J00在代码区是否存在

2))若存在,就直接在堆区中开辟空间,并将非静态的属性以及非静态的方法引用存在堆区中。

3))在栈区开辟空间,记录堆区对象地址。

Joo.print(参数类表);

1))通过栈区引用的地址,找到堆区中的方法的地址,然后再在方法区找到方法,并执行。


总结

创建一个不可变类

(不可变类是指当创建了这个类的实例后,就不允许修改它的属性值)需要如下条件:

1. 对于一般成员都是private;使用public static final 来定义一个全局的常量。
2. 不提供对成员的修改方法;例如:setXXX()
3. 确保所有的方法不会被重载。
手段有两种:使用final Class(强不可变类);
或者将所有的类方法加上final关键字(弱不可变类)。
4. 如果某一个类成员不是原始变量(primitive)或者不可变类,
必须通过在成员初始化或者get方法时通过深度clone方法,来确保类的不可变。


分享到:
评论

相关推荐

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    好啊好啊 抽象类与接口是Java中最重要部分之一,这里用较大的篇幅来做下这部分的笔记. 1. final关键字 在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记...

    Javaw基础课程笔记.zip

    Java 视频教程目录: ...day08:Java 字符串的基本操作_静态static关键字 day09:Java 类的继承_super和this关键字。 day10:Java 接口。 day11:Java final 关键字_内部类_成员内部类_局部内部类_匿名内部类。

    Java 基础学习笔记:数据类型,常见运算,final & static,Java 常见类,异常 & 反射

    Java 基础学习笔记,主要包括: 10_Java常见对象.md 10_Java常见对象_2.md 1_数据类型.md 3_运算.md 4_Object通用方法.md 5_关键字.md 6_反射.md 8_泛型.md JDK8新特性.md 正则表达式.md Java是一种面向对象的编程...

    Java开发详解.zip

    020510_【第5章:面向对象基础】_static关键字笔记.pdf 020511_【第5章:面向对象基础】_理解main方法笔记.pdf 020512_【第5章:面向对象基础】_代码块笔记.pdf 020513_【第5章:面向对象基础】_构造方法私有化笔记....

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    6.2.4 再看final关键字 180 6.2.5 java.lang.object 181 6.2.6 关于垃圾收集 186 6.2.7 再看抽象类 189 6.3 重点复习 191 6.4 课后练习 192 chapter7 接口与多态 199 7.1 何谓接口 200 7.1.1 接口...

    java学习笔记

    匿名对象4.Random类5.ArrayList集合5.String类6.static关键字7.Arrays数组工具类8.Math数学工具类继承与多态1.继承2.抽象类3.接口4.多态5.final关键字6.权限修饰符7.内部类常用API第二部分1.Date类2.Calender类3.Sys

    AUST大二暑假Java实训第二天上课笔记

    实训第二天老师发的上课笔记 比较基础比较流水账 主要有关于继承中对象构造的过程 抽象类 接口 以及关键字static final

    整理后java开发全套达内学习笔记(含练习)

    assert (关键字) 断言 [ә'sә:t] ' (java 1.4 之后成为关键字) associate n.关联(同伴,伙伴) [ә'sәuʃieit] attribute n.属性(品质,特征) [ә'tribju:t] boolean (关键字) 逻辑的, 布尔型 call n.v.调用; 呼叫...

    JavaSE笔记.rar

    学习JavaSE做的一些笔记,包括Java基础知识(关键字,语句,常量,变量,运算符,数组,方法),Java面向对象(static,final,封装,继承,多态,内部类等)以及JavaAPI(String,正则,集合,映射,IO,Socket,反射,线程等技术)

    99乘法表java源码-biji:课堂笔记

    99乘法表java源码 ls 查看目录下文件 ...catch final long static try char fianlly native strictfp void class float new super volatile continue for null switch while default if package enum synchroniz

    net学习笔记及其他代码应用

    接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象...

    Java版水果管理系统源码-BAT-Java:Java课堂笔记、代码、java核心知识点梳理、java笔试面试资料

    关键字 void byte int long char short float double String StringBuffer StringBuilder Array Collection Collections List ArrayList LinkedList Vector Set HashMap TreeMap LinkedHashMap ConcerrentHashMap ...

Global site tag (gtag.js) - Google Analytics