动手动脑

关于自定义构造方法

package teacher10_6;

public class Test{
	public static void main()
	{
		Foo obj1=new Foo();
	}
}

class Foo{
	int value;
	public Foo(int initValue){
		value=initValue;
	}
}

  编译结果 出错

原因分析:当用户自己写了一个构造方法,系统将不自动生成构造方法

 

静态初始化块的执行顺序

class Root
{
	static
	{
		System.out.println("Root的静态初始化块");
	}
	{
		System.out.println("Root的普通初始化块");
	}
	public Root()
	{
		System.out.println("Root的无参数的构造器");
	}
}
class Mid extends Root
{
	static
	{
		System.out.println("Mid的静态初始化块");
	}
	{
		System.out.println("Mid的普通初始化块");
	}
	public Mid()
	{
		System.out.println("Mid的无参数的构造器");
	}
	public Mid(String msg)
	{
		//通过this调用同一类中重载的构造器
		this();
		System.out.println("Mid的带参数构造器,其参数值:" + msg);
	}
}
class Leaf extends Mid
{
	static
	{
		System.out.println("Leaf的静态初始化块");
	}
	{
		System.out.println("Leaf的普通初始化块");
	}	
	public Leaf()
	{
		//通过super调用父类中有一个字符串参数的构造器
		super("Java初始化顺序演示");
		System.out.println("执行Leaf的构造器");
	}

}

public class TestStaticInitializeBlock
{
	public static void main(String[] args) 
	{
		new Leaf();
	}
}

 执行结果

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:Java初始化顺序演示
Leaf的普通初始化块
执行Leaf的构造器

 

结果分析

静态初始化块只能执行一次

创建子类的对象时,父类的静态初始化块也会执行

 

神奇的代码

public class StrangeIntegerBehavior 
{

    
	public static void main(String[] args)
	{

        
		Integer i1=100;
       
		Integer j1=100;
        
		System.out.println(i1==j1);

        
		Integer i2=129;
        
		Integer j2=129;
        
		System.out.println(i2==j2);
    
	}


}

  运行结果:

true

false

 

结果分析:

https://jingyan.baidu.com/article/20095761c9e042cb0721b41c.html

 

Classfile /C:/Users/linmob/Desktop/study/java/02.ClassAndObjectSourceCode/StrangeIntegerBehavior.class
  Last modified 2020年10月6日; size 694 bytes
  MD5 checksum 974c03c0f2e95fe3fd367fef51c88ad5
  Compiled from "StrangeIntegerBehavior.java"
public class StrangeIntegerBehavior
  minor version: 0
  major version: 56
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #5                          // StrangeIntegerBehavior
  super_class: #6                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:
   #1 = Methodref          #6.#19         // java/lang/Object."<init>":()V
   #2 = Methodref          #15.#20        // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   #3 = Fieldref           #21.#22        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = Methodref          #16.#23        // java/io/PrintStream.println:(Z)V
   #5 = Class              #24            // StrangeIntegerBehavior
   #6 = Class              #25            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               StackMapTable
  #14 = Class              #26            // "[Ljava/lang/String;"
  #15 = Class              #27            // java/lang/Integer
  #16 = Class              #28            // java/io/PrintStream
  #17 = Utf8               SourceFile
  #18 = Utf8               StrangeIntegerBehavior.java
  #19 = NameAndType        #7:#8          // "<init>":()V
  #20 = NameAndType        #29:#30        // valueOf:(I)Ljava/lang/Integer;
  #21 = Class              #31            // java/lang/System
  #22 = NameAndType        #32:#33        // out:Ljava/io/PrintStream;
  #23 = NameAndType        #34:#35        // println:(Z)V
  #24 = Utf8               StrangeIntegerBehavior
  #25 = Utf8               java/lang/Object
  #26 = Utf8               [Ljava/lang/String;
  #27 = Utf8               java/lang/Integer
  #28 = Utf8               java/io/PrintStream
  #29 = Utf8               valueOf
  #30 = Utf8               (I)Ljava/lang/Integer;
  #31 = Utf8               java/lang/System
  #32 = Utf8               out
  #33 = Utf8               Ljava/io/PrintStream;
  #34 = Utf8               println
  #35 = Utf8               (Z)V
{
  public StrangeIntegerBehavior();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=5, args_size=1
         0: bipush        100
         2: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
         5: astore_1
         6: bipush        100
         8: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        11: astore_2
        12: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        15: aload_1
        16: aload_2
        17: if_acmpne     24
        20: iconst_1
        21: goto          25
        24: iconst_0
        25: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
        28: sipush        129
        31: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        34: astore_3
        35: sipush        129
        38: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        41: astore        4
        43: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        46: aload_3
        47: aload         4
        49: if_acmpne     56
        52: iconst_1
        53: goto          57
        56: iconst_0
        57: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
        60: return
      LineNumberTable:
        line 9: 0
        line 11: 6
        line 13: 12
        line 16: 28
        line 18: 35
        line 20: 43
        line 22: 60
      StackMapTable: number_of_entries = 4
        frame_type = 255 /* full_frame */
          offset_delta = 24
          locals = [ class "[Ljava/lang/String;", class java/lang/Integer, class java/lang/Integer ]
          stack = [ class java/io/PrintStream ]
        frame_type = 255 /* full_frame */
          offset_delta = 0
          locals = [ class "[Ljava/lang/String;", class java/lang/Integer, class java/lang/Integer ]
          stack = [ class java/io/PrintStream, int ]
        frame_type = 255 /* full_frame */
          offset_delta = 30
          locals = [ class "[Ljava/lang/String;", class java/lang/Integer, class java/lang/Integer, class java/lang/Integer, class java/lang/Integer ]
          stack = [ class java/io/PrintStream ]
        frame_type = 255 /* full_frame */
          offset_delta = 0
          locals = [ class "[Ljava/lang/String;", class java/lang/Integer, class java/lang/Integer, class java/lang/Integer, class java/lang/Integer ]
          stack = [ class java/io/PrintStream, int ]
}
SourceFile: "StrangeIntegerBehavior.java"
posted @ 2020-10-06 14:19  我试试这个昵称好使不  阅读(34)  评论(0编辑  收藏  举报