Java笔记十七.java中的static和final用法

在上几篇博文中我们知道,当我们编写一个类时,实际上就是在描述该类对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。但有时候,我们希望无论是否产生了对象或无论产生了多少个对象的情况下,某些特定的数据在内存空间里只有一份,那么此时static关键字就派上用场了。

一、static关键字

1.静态成员变量/方法

在类成员(变量/方法)前加上一个static关键字,那么这个成员就称为了静态成员变量/方法。静态变量在某种程度上与其他语言的全局变量相类似,如果该静态成员变量不是私有的就可以在类的外部进行访问,此时不需要产生类的实例对象,只需要类名(类名.静态成员)就可以引用。

2.static关键字的用法

用static标识符修饰的变量,它们在类被载入时创建,只要类存在,static变量就存在。由于静态成员变量能被各实例对象所共享,所以我们可以用他来实现一些特殊效果。

(1)静态代码块

形式:static{.......}

一个类中可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行依次,所以静态块常用来进行类属性的初始化。

源码:TestStatic.java

<span style="font-size:18px;">class staticCode {
 static String school;
 static{
  school="大学城大学";	 //静态成员变量赋值
  System.out.println("I am staticCode");
 }
}
public class TestStatic {
 static
 {
  System.out.println("TestStatic is loading...");
 }
 public static void main(String[] args)
 {
  System.out.println("In the main thread");
  new staticCode();
  new staticCode();
 }
}</span>

打印信息:

分析:观察程序打印的信息,我们可以得出以下几点结论。

a.类staticCode中的静态代码块被自动执行,尽管产生了类的staticCode的两个实例对象,但其中的静态代码块只被执行一次并且只有在类被使用时才会执行类中的的静态代码块;

b.类在第一个被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。

(2)单态类设计

首先我们了解下类的单态设计模式,即采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

//单态类

class TestSingle

{

private TestSingle(){} //私有构造方法

private final static TestSingle single = new TestSingle(); //构造TestSingle一个私有实例对象

public static TestSingle getSingleInstance() //返回该私有对象

{

return single;

}

}

然后,我们在主线程中就可以通过TestSingle.getSingleInstance()方法来获取该单态类唯一的对象。

源码:staticDemo.java

<span style="font-size:18px;"><span style="font-size:18px;">//单态类
class TestSingle {
 private TestSingle(){}	//私有构造方法
 private final static TestSingle single = new TestSingle();	 //构造TestSingle一个私有实例对象
 public static TestSingle getSingleInstance()	//返回该私有对象
 {
  return single;
 }
 public void print()
 {
  System.out.println("I am TestSingle class");
 }
}
//主类
public class staticDemo
{
 public static void main(String[] args)
 {
  System.out.println("In main thread ");
  TestSingle single=TestSingle.getSingleInstance();	 //创建单态类对象
  single.print();	//调用单态类中的公共方法
 }
}</span></span>

打印信息:

分析:如果要让类在一个虚拟机中智能产生一个对象,我们可以使用static去设计一个单态类

a.首先必须将类的构造方法的访问权限设置为private,这样的话就能能用new操作符在类的外部产生类的对象了,当然我们在类的内部仍然可以产生该类的对象。

b.在单态类中使用new操作符产生一个实例对象,且该实例对象为静态私有的,只能被本类的静态方法使用

c.由于我们无法在类的外部还无法得到该单态类的对象,所有我们在单态类中实现一个静态方法用以返回该内部创建的对象。需要注意的是:静态方法只能访问类中的静态成员变量哦。

3.使用static关键字注意事项

(1)在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。因为对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。

(2)静态方法不能以任何方法引用this和super关键字。因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时this所引用的对象根本就没有产生。

(3)main()方法是静态的,隐藏JVM在执行main方法时不创建main方法所在的类的实例对象。因而在main()方法中,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。

二、final关键字

我们在编写Java代码时,时常看到在Java中声明类、属性和方法时,使用关键字final来修饰。下面我们就来学习下final关键字到底有些什么作用?

1.final标记的类是不能被继承的;

2.final标记的方法不能被子类重写;

3.final标记的变量,无论是成员变量还是局部变量,即成为常量,只能被赋值一次。另外,final标记的成员变量必须在声明的同时或在该类的构造方法中显示赋值后才能使用。

class Test

{

final int x=3;

}

或者:

class Test

{

final int x;

Test()

{

x=3;

}

}

注意:

(1)final标记的变量(成员变量或局部变量)即成为常量,只能对其赋值依次,但这个"常量"也只能在这个类的内部使用,不能在类的外部直接使用。

(2)在Java中定义常量,通常使用public static final来标记这个常量,然后这个常量就成了全局的常量。但是,这样定义的常量只能在定义时赋值,即使在构造函数里面也不能对其进行赋值。

时间: 2024-07-31 14:16:23

Java笔记十七.java中的static和final用法的相关文章

Java中static、final用法小结(转)

一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中.这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值. 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的

Java中static、final用法小结

一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中.这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值. 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的

9.5-全栈Java笔记:Map接口中的实现类HashMap

上节聊到「Map接口和实现类」,今天我们深入探讨其实现类中的HashMap如何进行底层实现. Hashmap基本结构讲解 哈希表的基本结构就是"数组+链表".我们打开HashMap源码,发现有如下两个核心内容: public class   HashMap<K,V> extends   AbstractMap<K,V> implements   Map<K,V>, Cloneable, Serializable { /** * The default

Java中static、final用法

一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中.这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值. 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的

Java中 static、final 用法小结

final final变量(在将关键字final加在定义的变量之前,即表明此变量一旦被初始化便不可改变.) 不可改变的具体意思是指: 基本类型 其值不可改变 对象变量 其引用不可改变 其初始化可以在两个地方进行(两者只能选其一): 变量的定义处(也就是说在final变量定义时直接给其赋值) 在构造函数中 当函数参数为final类型时,可以读取使用该参数,但是无法改变该参数的值. 在方法里面定义的内部类若是需要使用方法的参数时,此参数也必须声明为final才可使用 final方法(如果一个类不允许

5.4-全栈Java笔记:面向对象进阶之对象的转型 | FINAL关键字 |抽象方法和抽象类

对象的转型(casting) 引用变量只能调用它编译类型的方法,不能调用它运行类型的方法.这时,我们就需要进行类型的强制转换! [示例1]对象的转型 public class   TestCasting { public static void   main(String[] args) { Object obj = new   String("北京");  //向上可以自动转型 //obj.charAt(0)      //无法调用.编译器认为obj是Object类型而不是Strin

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型. 事件模型简介及常见事件模型 对于采用了图形用户界面的程序来说,事件控制是非常重要的. 一个源(事件源)产生一个事件并把它(事件对象)送到一个或多个监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件. 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知. 每种类型的事件都有其自己的注册方法,一般形式为: v

Java笔记:Java 流(Stream)、文件(File)和IO

更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. 输入输出流 简介 一个流被定义为一个数据序列.输入流用于从源读取数据,输出流用于向目标写数据. 下图是一个描述输入流和输出流的类层次图: 在java.io包中操作文件内容的主要有两大类:字节流.字符流,两类都分为输入和输出操作. 在字节流中输出数据主要是使用

Android中static和final用法小结

Java关键字static.final使用小结 static  1. static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的).对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变