前言
本文主要介绍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中的`final`关键字、抽象类和接口是面向对象编程中的核心概念,它们共同构建了类的层次结构和多态性。以下是对这些概念的详细解释: 1. **final关键字** - `final`关键字用于确保变量的值一旦被赋值后就不能...
"java笔记静态成员" java语言中静态成员是指属于类的成员,而不是属于实例的成员。静态成员可以被所有实例共享,在程序中只有一份拷贝。静态成员包括静态变量、静态方法和静态初始化块。 1、静态变量 静态变量是...
这份“JAVA基础笔记以及关键字整理.rar”压缩包包含了全面的Java基础知识和关键字的详细讲解,对于初学者和有一定经验的开发者来说,都是一个极好的学习和复习资源。 首先,Java的基础知识涵盖了许多方面。包括但不...
通过讲解this关键字、继承、static关键字和代码块、final关键字、多态、方法重写、抽象类与接口、封装与隐藏、垃圾回收、类组合、包装类、对象处理、类成员、final修饰符详解等知识点,本文档为Java学习者提供了一套...
总结起来,这些笔记详细阐述了Java中的核心概念,如继承、多态、类型转换、单例模式和final关键字的使用,这些都是Java程序员应该熟练掌握的基础知识。理解并运用这些概念,将有助于提升代码的可读性、可维护性和...
`final` 关键字可以修饰类、方法和变量,表示不可变或最终状态。 - 修饰变量:变量一旦被声明为final,其值就不能改变。 - 修饰方法:方法不能被子类重写。 - 修饰类:类不能被继承。 【abstract关键字】 `...
修饰符:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native 是 Java 语言中的修饰符关键字。这些关键字用于修饰类、方法和变量的访问权限和行为。 ...
- static关键字:静态成员属于类,不依赖于类的实例,常用于创建单例、静态变量和静态方法。 - final关键字:用于声明不可变的变量、类或方法,确保数据安全和代码优化。 4. 继承与多态 - super关键字:用于访问...
### 小码哥-任小龙Java笔记-面向对象的核心知识点 #### 一、面向对象基础概念 ...以上内容覆盖了小码哥-任小龙Java笔记中的面向对象关键知识点,希望能帮助您更好地理解和掌握面向对象编程的核心概念和技术细节。
Java 语言目前定义了 51 个关键字,这些关键字不能作为变量名、类名和方法名来使用。 五、Java 变量的作用域 变量的作用域规定了变量所能使用的范围,只有在作用域范围内变量才能被使用。根据变量声明地点的不同,...
Java是一门广泛使用的高级编程语言,它的应用范围涵盖了从企业级应用到移动应用等多个方面。...总的来说,Java笔记总结涵盖了Java编程语言的核心概念和基础知识点,适合初学者学习和巩固Java的基础知识。
static关键字表示静态属性或方法,它们属于类本身而不依赖于类的任何特定实例。final关键字用于声明属性、方法和类,表示它们不能被修改或继承。 Java中提供了一系列基础类,比如Object类,它是所有Java类的最终...
Java学习笔记更新版深入探讨了Java编程语言的关键概念,其中包括this关键字、继承、static和final关键字的使用。本文将详细阐述这些主题。 首先,我们来了解`this`关键字。`this`是一个非常重要的关键字,它在Java...
5. **模块化与类的设计**:了解如何设计良好的类结构,使用抽象类和接口来构建模块化的系统,以及如何合理地使用final关键字、static关键字以及构造函数。 6. **异常处理**:Java中的异常处理是通过try-catch-...
这份"Java十大基础笔记整理(PDF)"提供了全面的Java基础知识概览,适合初学者进行学习和复习。下面,我们将深入探讨Java的基础知识,涵盖核心概念、语法和编程实践。 1. **Java简介**:Java是由Sun Microsystems...
- **4.4 STATIC关键字** - **实例变量和类变量的区别**:类变量使用static修饰,与类相关联而不是与单个对象相关联。 - **通过类名直接访问类变量**:无需创建对象即可访问。 - **实例方法和类方法的区别**:类...
Java 视频教程目录: ...day08:Java 字符串的基本操作_静态static关键字 day09:Java 类的继承_super和this关键字。 day10:Java 接口。 day11:Java final 关键字_内部类_成员内部类_局部内部类_匿名内部类。
在Java中,`static`和`final`是两个非常重要的修饰符,它们分别用于不同的场景,具有独特的语义。 - **Static**:用于创建类级别的变量或方法,这意味着无论有多少个类的实例存在,静态成员只会有一个副本。`static...