Java中静态关键字的使用方法介绍四

1         静态代码块

下面介绍一种不是很常见的静态修饰符的使用方法。当我们需要一个类,这个类的构造函数是私有的,那么这个类之外其他程序就不能够创建这个类的对象。那么如何初始化这个类呢?

为了解决这个问题,我们可以使用前文中的静态成员变量或者静态方法来初始化类。在类的加载过程中,静态成员变量和静态方法同时也就加载完成了。除了上面的两种方法还有一种更加简单的方法,就是在类中使用静态代码块。静态代码块不是一个方法,它的写法很简单,如下:

public class Car {
         privateCar() {
                  
         }
         static{
                   Stringcolor="green";
System.out.println("汽车的颜色是:"+color);
                   System.out.println("汽车停下来了");
}
         publicstatic void main(String[] args) {
         }
}

运行结果如下:

汽车的颜色是:green

汽车停下来了。

这说明在类加载过程中就同时加载了静态代码块中的程序。那么静态代码块中能够写那些内容呢?我们以下面代码为例说明:

public class Car {
         privateCar() {
                  
         }
         Stringcolor="green";
         staticString myNewColor="black";
         static{
                   StringmyColor="white";
                   newCar().show();
                   stop();
                   System.out.println("我的车的颜色是:"+myColor);
                   System.out.println("我的车的新颜色是:"+myNewColor);
         }
         staticvoid stop(){
                   System.out.println("汽车停下来了");
         }
         voidshow()
         {
                   System.out.println("汽车的颜色是:"+this.color);
         }
public staticvoid main(String[] args) {    
         }
}

运行结果如下:

汽车的颜色是:green

汽车停下来了。

我的车颜色是:white

我的车的新颜色是:black

从代码中可以得出以下结论:

1、只能直接调用静态方法,而不能直接调用非静态方法;

2、如果需要调用非静态方法同样需要构建对象后才能调用非静态方法;

3、在代码块中声明的变量是局部变量,所以只能声明一般变量而不能声明静态成员变量。

4、代码块中可以直接访问静态成员变量。

通过上述代码,我们发现静态代码块还是功能强大的,能够在不构建对象的情况下,初始化类,解决我们上面提到的需求。

2         静态内部类

如果在一个类中再定义一个类,就将在类中再定义的那个类称为内部类。虽然类不能使用静态修饰符,但是内部类却是可以使用静态修饰符的一个特例。

2.1      定义静态内部类

当我们在定义一个内部类的时候,在内部类的前面增加了静态修饰符static,那么这个类就称为静态内部类。如下代码所示,CarWindow类就是静态内部类,CarDoor类就是非静态内部类。

public class Car {
         publicstatic class CarWindow{
                   Public void show(){
                   System.out.println("车玻璃的颜色是黑色。");
}
         }
         Publicclass CarDoor{
         Public void show(){
                   System.out.println("车门的颜色是白色。");
}
}
         publicstatic void main(String[] args) {    
                   Car.CarDoorcarDoor=new Car().new CarDoor();
                   carDoor.show();
         }
}

要访问非静态类中的show()方法,需要定义对象,然后再通过对象调用show()方法。由于存在外部类和内部类两个类,所以在创建对象的时候,先要创建外部类对象,然后通过外部类对象创建内部类对象。在main()方法中,通过“Car.CarDoor carDoor=new Car().new CarDoor();”语句创建了carDoor对象,然后通过carDoor对象调用show()方法。

运行结果为:

车门的颜色是白色的。

要访问静态内部类与访问非静态内部类略有不同,主要包括访问静态内部类中的非静态成员和静态内部类中的静态成员。下面将分开介绍。

2.2      访问静态内部类中的非静态成员

在静态内部类CarWindow中定义个一个非静态方法show(),如果需要访问这个方法,我们先需要访问外部类Car。不过与访问非静态内部类不同的是,访问静态内部类时,由于静态内部类的加载与外部类的加载同时,所以不需要创建外部类对象,而是直接创建内部类对象,在使用内部类对象访问非静态方法show()。

要访问CarWindow中定义的非静态方法show(),需要修改main()方法如下:

public staticvoid main(String[] args) {    
                   Car.CarDoorcarDoor=new Car().new CarDoor();
                   carDoor.show();
                   Car.CarWindowcarWindow=new Car.CarWindow();
                   window.show();
         }

运行结果为:

车门的颜色是白色的。

车玻璃的颜色是黑色的。

2.3      访问静态内部类中的静态成员

当在静态内部类中存在静态成员,例如静态成员变量或静态方法,这时访问静态内部类的静态成员就更加简单。因为静态内部类随着外部类的加载而加载,而内部类中的静态成员随着内部类加载而加载。

也就是说当外部类加载完成后,静态内部类以及静态成员也就同时完成了加载。所以不需要对象就可以实现静态内部类中的静态成员的访问,直接使用类名就可以完成访问。

将上面代码中静态内部类CarWindow的show()方法改为静态方法,那么在main()方法中做如下修改:

public staticvoid main(String[] args) {    
                   Car.CarWindow.showCarWindow();
         }

运行结果为:

车玻璃的颜色是黑色的。

虽然访问静态内部类的静态方法用起来很简单,但是当定义为静态时,就存在了局限性。在前文中提到过静态方法只能访问静态成员,所以不是什么情况都适合使用静态修饰符的。

时间: 2024-12-14 18:45:21

Java中静态关键字的使用方法介绍四的相关文章

Java中静态关键字的使用方法介绍三

1.1      静态方法main()的解析 1.1.1   静态方法main()的语句组成 在我们使用java语言进行编程中,常常用到要一个main()函数,这是一个程序的入口,是整个程序中最为重要的部分之一.通常,main函数按照以下格式进行书写. public static void main(String[] args) { } 我们发现main()函数前面存在静态修饰符Static那说明main函数就是一个静态方法.那么这个main函数语句到底由什么组成呢?下面我们就来分析一下main

Java中静态关键字的使用方法介绍二

1         静态方法 前面我们了解了静态成员变量的一些使用的方式,现在我们接着探讨一下静态方法的相关内容,并了解一下静态方法的使用情况. 1.1      静态方法和一般方法的定义方法 在类中我们可以定义类的方法,如果当一个方法的前面加了关键字Static,也当方法使用静态修饰符时,我们则称这个方法为静态方法,没有这个关键字,则不是静态方法.还是以Car类为例,定义一个静态方法stop(),和一个非静态方法show(),具体看下面代码所示. public class Car { publ

Java中静态关键字的使用方法介绍一

1           静态成员变量 在类中定义的变量通常称之为成员变量,如果当一个成员变量的前面增加了修饰符Static,那么我们就称这个成员变量为静态成员变量. 1.1           成员变量和静态成员变量的定义方法 创建一个Car类,在其中定义了两个成员变量,一个是普通成员变量color,一个是静态成员变量myColor. public class Car {          public String color;//普通成员变量          public static S

java中new关键字和newInstance()方法有什么区别?

1.new可以调用带参数的构造函数,newInstance不可以. 2.new 是 java 的关键字,用来构造一个类的实例.而 newInstance 是 Class 的一个方法,不过两个写法的效果一样. 3.newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何public构造. 4.new是关键字,用来生产对象,可以调用类的公开任何构造方法而newInstance是反射时用的,只能调用无参数的构造方法,如果想调用有参数的构造方法,可以用Const

java中new关键字和newInstance()方法的区别

1> new是一个关键字,可以说是一个指令: newInstance()是一个方法,Class对象的一个方法. 2> new主要作用是在内存中生成一个实例,而这个类可以没有提前加载到内从中: newInstance()主要作用是在内存中生成一个实例,而这个方法在使用前必须得保证:①这个类被加载到内存中,②这个类已经被连接,而完成以上两个过程的是Class.forName()方法. 3> new关键字的使用一般比较呆板的写入到程序中: newInstance()方法一般用于框架中,工厂模式

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

Java中各种(类、方法、属性)访问修饰符与修饰符的说明

类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所有类访问(使用),其他项目若想使用本项目中的类,必须将本项目打包为jar包,然后加入到classpath中 public类必须定义在和类名相同的同名文件中 (default) 只能被同一个包中的类访问(使用) 默认的访问权限,可以省略此关键字,可以定义在和public类的同一个文件中 修饰符 名称

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是