Java SE 第二十四讲----static与final使用陷阱关键字

1.对于final类型成员变量,一般来说有两种赋值方式;

a)在声明final类型的成员变量时就附上初值

package com.cl.staticandfinal;

public class FinalTest4 {

    final int a=7;
    public FinalTest4(){

    }
}

b)在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值

package com.cl.staticandfinal;

public class FinalTest4 {

    final int a;
    public FinalTest4(){
        a = 0;
    }
}

2.static代码块:静态代码块。静态代码块的作用也是完成一些初始化工作。首先执行静态代码块。然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行,要想调用某个类来生成对象,首先需要将类加载到java虚拟机上(JVM),然后由JVM加载这个类来生成对象。

package com.cl.staticandfinal;

public class StaticTest4 {

	public static void main(String[] args) {
		P p = new P();
		P p1 = new P();
	}
}
class P
{
	static
	{
		System.out.println("static block");
	}
	public P(){
		System.out.println("p");
	}
}

输出结果:

static block
p
p

解析:静态代码块在类加载到jvm就执行了,且静态代码块加载一次就行

3.类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块也只会被执行一次;而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,所以new一次就会调用构造方法一次。

4.如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层的静态代码块,然后再去执行最顶层类的构造方法,一直执行到最底层的构造方法。注意:静态代码块只执行一次。

package com.cl.staticandfinal;

public class StaticTest4 {

    public static void main(String[] args) {
         new S();
         new S();
    }
}
class P
{
    static
    {
        System.out.println("P static block");
    }
    public P(){
        System.out.println("P constructor ");
    }
}
class Q extends P{
    static
    {
        System.out.println("Q static block");
    }
    public Q(){
        System.out.println("Q constructor");
    }
}
class S extends Q{

    static{
        System.out.println("S static block");
    }
    public S(){
        System.out.println("S constructor");
    }
}输出结果:

P static block
Q static block
S static block
P constructor
Q constructor
S constructor
P constructor
Q constructor
S constructor

 

5.

时间: 2024-08-06 21:35:22

Java SE 第二十四讲----static与final使用陷阱关键字的相关文章

Java SE 第二十三讲----static关键字

1.static关键字 [在二十二讲视频中30分钟开始讲授] 2.static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化.如果一个成员变量是static的,那么我们可以通过类名.成员变量的方式来使用它(java推荐使用这种方式). package com.cl.abstracttest; public class StaticTest { public static void

JAVA学习第二十四课(多线程(三))- 线程的同步

继续以卖票为例 一.线程安全问题的解决 同步的第一种表现形式:同步代码块 思路: 将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程是不允许参与运算的,必须要当期线程把代码执行完毕后,其他线程才可以参与运算 在java中用同步代码块解决这个问题 同步代码块格式: synchronized(对象) { 需要被同步的代码部分 } class Ticket implements Runnable { private int num = 100; Object god = ne

第二十四讲:用户界面View之Gallery

生活就像海洋,只有意志坚强的人,才能到达彼岸. -- 马克思 本讲内容:Gallery 画廊 Gallery是一个内部元素可以水平滚动,并且可以把当前选择的子元素定位在它中心的布局组件. 我们通过一个例子感受一下,代码的讲解都写在注释里了 下面是res/layout/activity_main.xml 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools

Java SE 第十六讲----面向对象特征之继承

1.继承(inheritance):Java是单继承的,意味着一个类只能从另一个类继承(被继承的类叫做父类也叫[基类 baseclass]),继承的类叫做子类,java中的继承使用extends关键字. public class Child extends Parent{ public Child(){ System.out.println("child"); } public static void main(String[] args){ Child child = new Chi

Java基础--第二十四天

day24:多线程   [等待唤醒机制] 等待唤醒机制[Object] wait():让线程处于等待状态 notify():唤醒等待线程 实现或者重写父类方法,出现父类中没有的异常时,子类只能try catch. wait():是Object类的方法,可以不用传参:释放锁对象 sleep():是Thread类的静态方法,需要传递参数:不释放锁对象 线程优先级 getProirity():获取优先级,默认设置为5,范围是[1,10] setProirity():设置优先级 注意:优先级在一定程度上

Java SE 第十六讲----方法重载

1.方法重载(Overload):表示两个或多个方法名字相同,但方法参数不同 不同:1)参数个数不同: 2)参数类型不同: 注意:方法的返回值对重载没有任何影响 2.构造方法重载,只需看参数即可.如果想在一个构造方法中调用另外一个构造方法,那么可以使用this()的方式调用this()括号中的参数表示目标构造方法的参数.this()必须要作为构造方法的第一条语句,换句话说,this()之前不能有任何可执行的代码 public class ConstructorOverload { public

Java基础第二十四天总结——集合

目录: 一.Map接口 二.Collection工具类 /*---------------分割线---------------------*/ 一.Map接口 Map中的key用Set来存放,不可重复.作为一个Map对象所对应的类,需重写hashCode和equals方法. HashMap是Map接口使用频率最高的实现类. 添加.删除.修改操作: Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中 void putAl

Java学习第二十四天

1:多线程(理解) (1)JDK5以后的针对线程的锁定操作和释放操作 Lock锁 (2)死锁问题的描述和代码体现 (3)生产者和消费者多线程体现(线程间通信问题) 以学生作为资源来实现的 资源类:Student 设置数据类:SetThread(生产者) 获取数据类:GetThread(消费者) 测试类:StudentDemo 代码: A:最基本的版本,只有一个数据. B:改进版本,给出了不同的数据,并加入了同步机制 C:等待唤醒机制改进该程序,让数据能够实现依次的出现 wait() notify

第二十四讲:状态模式

改变对象的内部状态hour,然后判断内部状态而改变对象的行为.但是这样的设计是非常不合理的.