`
Tech-Dragon
  • 浏览: 1861 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java初始化之我的理解

阅读更多
看了张老师写的《一个让98%的Java程序员犯难的偏门问题!》让我产生了很多个联想
所以我也来总结一下我对初始化的理解

(1)非静态的初始化
 现在我把题目改了一下大家看一下:

   各位先想打印的结果是多少呢?为什么呢?

  

public class Parent 
...
    
public void test() 
    
...{
    }

    
public Parent() 
    
...{
        test();
    }

    
public static void main(String[] args) 
    
...{
        
new Child();
    }

}
 
class Child extends Parent 
...{  
    
public  Child()
   
...{
    test();
   }

    
private int instanceValue = 20;
    
public void test() 
    
...{
        System.
out.println("the Chind instance value is: " + instanceValue);
    }

}

 

   答案是:the Chind instance value is: 0
        the Chind instance value is: 20

这个相信大家很多人知道
  我也说说我的理解:
    new Child();
 1. 开始分配分配成员变量的存储空间并进行默认的初始化.就是执行new 关键字。
 2. 显示显式或隐式追溯调用父类的构造方法(一直到Object类为止);
 3. 进行成员变量的显式初始化操作,也就是执行在定义成员变量时就对其进行赋值的语句.
 4  调用child() 这个构造函数
    所以可以认为初始化有三次。
 这里还有个例子
    

class TestInit...{
    
    
public static void main(String[] args)
    
...{
        
new TestInit();
        
    }

    
public TestInit()
    
...{
        System.
out.println("the value of aFloat :"+aFloat);
        System.
out.println("the value of aInt :"+aInt);
    }

    
double aFloat=MakeFloat();
    
public int MakeFloat()
    
...{
        
return aInt*3;
        
    }

    
int aInt=3;
    
    }

  结果是:
      the value of aFloat :0.0

      the value of aInt :3
也不难理解初始化根顺序有关 在aFloat进行第二次初始化时 aInt只是第一次结束故 aInt=0

 我在把题目改一下

class TestInit...{
    
    
public static void main(String[] args)
    
...{
        
new TestInit();
        
    }

    
public TestInit()
    
...{
        System.
out.println("the value of aFloat :"+aFloat);
        System.
out.println("the value of aInt :"+aInt);
    }

    
double aFloat=MakeFloat(aInt);
    
public int MakeFloat(int var)
    
...{
        
return var*3;
        
    }

    
int aInt=3;
    
    }


    出现了编译错误 :在字段被定义之前不能被引用-- 这里我就不知道是什么机制引起
  希望那位大侠 给我解释一下

(2)静态块的加载
 下面给个例子  ---yyfhz的代码 我cope
  

class Writer_Object ...
    
public Writer_Object(String str)...
    System.
out.println(str); 
    }
 
    }
 
class Parent ...
    
public void getData() ...
    System.
out.println(" --------------------------"); 
    System.
out.println(" 进入父对象getData方法"); 
    System.
out.print(" 父对象-普通int(0表示没有赋值):"); 
    System.
out.println(parent_normal_int); 
    System.
out.print(" 父对象-static int(0表示没有赋值):"); 
    System.
out.println(parent_static_int); 
    System.
out.println(" 离开父对象getData方法"); 
    System.
out.println(" --------------------------"); 
    }
 

    
public Parent() ...
    System.
out.println("----------------------"); 
    System.
out.println("进入父对象构造方法"); 
    System.
out.println("调用getData方法"); 
    getData(); 
    System.
out.println("离开父对象构造方法"); 
    System.
out.println("----------------------"); 
    }
 
    
private Writer_Object parent_normal_obj1 = new Writer_Object("父对象-普通声明对象1创建"); 
    
private static Writer_Object parent_static_obj1 = new Writer_Object("父对象-Static声明对象1创建"); 
    
private Writer_Object parent_normal_obj2 = new Writer_Object("父对象-普通声明对象2创建"); 
    
private static Writer_Object parent_static_obj2 = new Writer_Object("父对象-Static声明对象2创建"); 
    
private int parent_normal_int = 10
    
private static int parent_static_int = 11
    
public static void main(String[] a)
    
...{
        
        
new Child();
        
    }

    }
 
 
class Child  extends Parent
 
...{
     
     
public void getData() ...
         System.
out.println(" --------------------------"); 
         System.
out.println(" 进入子对象getData方法"); 
         System.
out.print(" 子对象-普通int(0表示没有赋值):"); 
         System.
out.println(child_normal_int); 
         System.
out.print(" 子对象-static int(0表示没有赋值):"); 
         System.
out.println(child_static_int); 
         System.
out.println(" 离开子对象getData方法"); 
         System.
out.println(" --------------------------"); 
         }
 

         
public Child() ...
         System.
out.println("----------------------"); 
         System.
out.println("进入子对象构造方法"); 
         System.
out.println("调用getData方法"); 
         getData(); 
         System.
out.println("离开子对象构造方法"); 
         System.
out.println("----------------------"); 
         }
 
         
private Writer_Object child_normal_obj1 = new Writer_Object("子对象-普通声明对象1创建"); 
         
private static Writer_Object child_static_obj1 = new Writer_Object("子对象-Static声明对象1创建
分享到:
评论

相关推荐

    java 初始化与方法

    总结来说,Java初始化与方法是编程基础,深入理解这两个概念对于任何Java开发者都至关重要。通过阅读源码、运用开发工具和不断实践,我们可以不断提高自己的编程水平,从而在实际工作中游刃有余。

    java代码的初始化顺序demo

    在Java编程语言中,类和对象的初始化是一个关键的概念,对于理解和编写健壮的程序至关重要。这个"java代码的初始化顺序demo"显然旨在演示这一过程。让我们深入探讨Java中的初始化顺序及其背后的机制。 1. **类加载...

    Java静态初始化块和对象初始化块

    总之,理解并有效地使用静态和对象初始化块是Java开发中的关键技能,它们可以帮助我们更好地控制类和对象的初始化过程,确保代码的高效性和正确性。在实际编程中,我们应该根据需求谨慎选择合适的初始化策略,以优化...

    Java初始化块Java初始化块.doc

    总结起来,Java初始化块是Java中用于对象和类初始化的重要工具,它们在不同场景下提供了一种灵活的方式来控制对象和类的状态。理解初始化块的工作原理对于编写高效且无错误的Java代码至关重要。在编写代码时,应谨慎...

    java语法\Java数组声明、创建、初始化

    Java数组声明、创建、初始化 Java数组是指在Java语言中可以存储多个相同类型元素的数据结构。数组是一种引用类型,它的元素可以是基本类型,也可以是对象类型。Java数组的声明、创建和初始化是Java编程中非常重要的...

    java面试题-类的初始化顺序.doc

    在面试中,面试官可能会通过这种类型的题目来评估应聘者对Java内存模型的理解,以及他们在编写代码时是否能考虑到这些初始化规则,从而避免潜在的陷阱。因此,掌握类的初始化顺序是每个Java开发者必备的知识点。

    6种方法初始化JAVA中的list集合

    本文将详细介绍6种初始化Java List集合的方法,并通过代码示例帮助理解每种方法的使用和特点。 1. 常规方式 这是最常见的初始化List的方式,通过创建ArrayList实例并逐个添加元素。自JDK 7以后,可以省略泛型类型的...

    Java变量初始化

    Java 变量初始化是 Java 语言的基础知识点之一,但也往往被学习者所忽略。 Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 在 Java 语言中,每个...

    java初级视频教程系列之-java初始化

    "Java初级视频教程系列之-java初始化"是一套专为初学者设计的教育内容,由经验丰富的IT专家精心录制,旨在帮助学习者掌握Java编程的基础,特别是关于对象初始化的重要概念。 在Java中,初始化是一个关键的步骤,它...

    java中类的初始化顺序

    本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础知识 1. **静态成员变量(Static Fields)**:在类加载时初始化。 2. **实例成员变量(Instance Fields)**...

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    Java多线程之延迟初始化1

    Java多线程中的延迟初始化是一种优化策略,旨在推迟对象的创建直到它们真正被需要时,以减少不必要的资源消耗。在多线程环境下,确保延迟初始化的线程安全性至关重要,否则可能导致数据不一致或运行时异常。 非线程...

    java初始化和清理

    Java初始化和清理是Java语言中非常重要的两个过程,它们确保了Java程序的正确运行和资源的有效管理。Java的初始化包括类的加载、连接和初始化三个过程,而清理则主要指垃圾回收机制。 首先,Java初始化的主要特性...

    深入Java初始化.pdf

    `<clinit>`和`<init>`方法的存在揭示了Java初始化的底层机制,它们确保了类和对象的正确初始化,同时也提供了异常处理的能力,使得在初始化过程中出现的问题能够被准确捕获和定位。 总结: Java初始化涉及类的静态...

    java中对象创建、初始化、引用

    ### Java中对象创建、初始化与引用详解 #### 一、Java对象、引用及创建过程 在Java中,对象是程序的基本单位,它包含了属性(成员变量)和行为(方法)。对象是由类创建出来的实例,而类则是一组具有相同属性和...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块、非静态块以及构造函数时,明确它们的初始化顺序有助于避免潜在的编程错误。 ...

    详解Java的初始化与清理

    本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即内存的自动清理。 首先,让我们详细了解一下Java中的构造器初始化。构造器是Java中用于初始...

    C++和Java初始化顺序的比较代码

    理解这两种语言中初始化顺序的差异对于编写健壮和可维护的代码至关重要。在编写多线程或依赖特定初始化顺序的程序时,了解这些规则尤为重要。在实际开发中,我们应该尽量避免依赖这种顺序,以减少潜在的错误和难以...

Global site tag (gtag.js) - Google Analytics