`
jokermanager
  • 浏览: 143713 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

正确理解java构造函数内非final函数

阅读更多

大家都知道java构造 的使用方法吧,

可能大家都用它来进行对象的初始化。

就像下面这样一个例子。

 

public   class  Test
... {
    
public   static   void  main(String [] args)
    
... {
        Entry e 
=   new  Entry();
        System.out.println(
" the val value return ----> " + e.value());
    }

}

class  Entry
... {
    
public   int  val;
    
public  Entry()
    
... {
        val
= getVal();            // Entry构造函数
    }

    
    
public   int  getVal()
    
... {
        
return   6 ;
    }

    
    
public   int  value()
    
... {
        
return  val;                    // 返回val值
    }

}

 

运行Test,得到的值应该是什么?  对,就是6.

我们可以稍微加点东西,看看下面这个。

 

public   class  Test
...
... {
    
public   static   void  main(String [] args)
    ...
... {
        Entry1 e1 
=   new  Entry1();     // Entry改为 Entry1
        System.out.println( " the val value return ----> " + e1.value());
    }

}

class  Entry
...
... {
    
public   int  val;
    
public  Entry()
    ...
... {
        val
= getVal();            // Entry构造函数
    }

    
    
public   int  getVal()
    ...
... {
        
return   6 ;
    }

    
    
public   int  value()
    ...
... {
        
return  val;                    // 返回val值
    }

}




// 以下是新添加的代码


class  Entry1  extends  Entry                     
// 继承自Entry        
// 没有覆盖父类的构造函数 和 value函数

... {
    
public   int  val = 16 ;

    
public   int  getVal()
    
... {
        
return  val;
    }



}

 

结果是多少?

应该是16吧?

错了,结果是0.

-------------------------------------------------

怪了,怎么会这样呢?

明明这个函数已经有了实现的代码了呀?

事实是,当Entry1的getVal()函数开始被调用时,他的实例变量val初始化工作还未来得及进行!

这个getVal()函数是在父类Entry的构造函数中被调用的。

而父类的构造函数是被Entry1的构造函数自动调用的。

当运行权进入子类Entry1的getVal()时,它的val变量还来不及初始化,在这样的情况下,

所有的这些实例变量都仅仅只会被设置为缺省的处置。

所以此时val的值为0,被传到了调用的函数中。

于是输出结果为:0.

--------------------------

当我们的java程序构造函数调用非final的函数时,

就有可能发生上面的意外。

当然了,以上的错误不是很常见,不过,理解之后,

一旦遇上,就不会半天找不到解决方案了。

分享到:
评论

相关推荐

    深入理解java构造器机理

    “深入理解Java构造器机理” 在 Java 编程语言中,构造器是一种特殊的方法,用于初始化对象的创建。它是 Java 类中最重要的一个概念。下面将深入讨论构造器的机理、执行顺序、作用及与其他概念的区别。 一、构造器...

    Java构造函数与普通函数用法详解

    Java构造函数与普通函数用法详解 Java构造函数和普通函数是Java语言的两个基本组成部分,它们在Java编程中扮演着非常重要的角色。下面我们将详细讲解Java构造函数和普通函数的用法和相关知识点。 一、函数的作用和...

    枚举类型与构造函数.doc

    枚举类型与构造函数 枚举类型是一种特殊的数据类型,它可以在程序中定义一组固定的常量,...枚举类型和构造函数是Java中两种重要的概念,枚举类型可以定义一组固定的常量,而构造函数可以用于初始化对象的实例变量。

    14_构造函数 视频

    这个视频教程"14_构造函数"应该深入讲解了Java中的构造函数及其重要性,特别是对于初学者,理解这一概念至关重要。 构造函数的名称必须与类名完全相同,不包括返回类型,甚至没有void。它们的主要作用是在创建新...

    java函数速查手册常用函数

    这个CHM文件很可能是由一系列的函数解释、示例代码和使用指南组成的电子手册,方便用户快速查找和理解Java中的各种函数。 在Java中,函数(或称为方法)是实现特定功能的代码块,可以被多次调用。以下是一些Java...

    Java中的final关键字

    - `final`修饰的实例变量(非静态)意味着它必须在构造函数中初始化,之后不能更改。如果未在构造函数中初始化,编译器会报错。 2. **final方法** - 当一个方法被声明为`final`时,不允许子类覆盖该方法。这确保...

    Java私有构造函数作用原理解析

    Java私有构造函数作用原理解析 Java中的私有构造函数是一种特殊的构造函数,它可以控制类的实例化,实现单例模式和不可实例化类。下面我们将详细介绍Java私有构造函数的作用原理和应用。 一、强调类的单例模式 ...

    java 函数速查CHM

    Java函数速查CHM是一本面向Java初学者的实用参考资料,旨在帮助读者快速理解和掌握Java编程中的各种函数用法。这本书以清晰、简洁的方式呈现了大量的Java函数,是学习和解决问题的良好辅助工具。"Hssc-rar"标签可能...

    Java 实例 - Enum(枚举)构造函数及方法的使用源代码-详细教程.zip

    本教程将深入探讨Java枚举的构造函数及方法的使用,帮助开发者更好地理解和运用这一特性。 一、枚举的定义 在Java中,枚举类型可以通过`enum`关键字来创建。一个简单的枚举定义如下: ```java public enum Color {...

    使用Springboot注入带参数的构造函数实例

    使用 SpringBoot 注入带参数的构造函数实例 SpringBoot 框架中,使用构造函数实例可以通过 @Bean 注解来实现。下面我们来详细介绍如何使用 SpringBoot 注入带参数的构造函数实例。 使用 @Bean 注解来实现构造函数...

    【独家】【笔面试知识要点】16.OOP与OBP构造函数静态块1

    总的来说,理解这些概念对于Java程序员来说至关重要,无论是面试还是实际开发,都需要对OOP、OBP、构造函数、静态块以及组件有深入的认识。通过掌握这些知识点,可以更好地设计和实现复杂的软件系统,提高代码的...

    【Java编程教程】详解Java final 关键字.pdf

    Java中的`final`关键字是一个非常重要的概念,它用于在编程中实现不可变性。...理解并正确使用`final`关键字对于编写安全、可维护的代码至关重要。通过深入学习和实践,开发者可以更好地利用这一特性来提高代码质量。

    JAVA(static、finalの使用).doc

    如示例代码中的`Bat`类,`final int i`和`final List list`均在构造函数中初始化。通过不同的构造函数重载,可以灵活地为`final`变量提供初始值,增强了代码的灵活性和实用性。 #### 3. `final`参数与方法 将方法...

    java final变量详解

    static 变量在需要的时候才会初始化,并且在这个类的构造函数和所有其他普通变量之前调用,static 之后就不再进行初始化了,static 变量单独划分一块存储空间。 final 方法的高效是因为它会在编译的过程中利用内嵌...

    java中final和static的总结

    在设计类和接口时,明智地使用`final`和`static`可以帮助实现更好的设计模式,例如单例模式(`static`与私有构造函数结合)和不可变对象(`final`类和属性)。在日常编程中,应根据需求合理选择和应用这两个关键字。

    Java编程思想重点笔记(Java开发必看)

    这篇笔记涵盖了多个关键知识点,包括多态性、final方法、静态方法、构造函数以及构造过程中的多态行为。 首先,Java中的多态性是面向对象编程的核心特性之一。与C++不同,Java中几乎所有的非static和非final方法都...

    Java编程思想重点笔记(Java开发必看).pdf

    这篇笔记将聚焦于Java中的多态性,这是面向对象编程的关键概念,同时也涉及到构造函数、静态方法和final关键字的理解。 1. **Java中的多态性**: 多态性在Java中表现为一个对象可以有多种形态,即同一种类型的不同...

    Java中对象的生命周期 ..doc

    - 构造函数不能被声明为`static`、`final`、`synchronized`、`native`或`abstract`。 3. **默认构造函数**: - 如果一个类没有定义任何构造函数,则系统会自动提供一个无参的默认构造函数。 - 如果类中至少定义...

    深入理解 Java 内存模型

    9. **线程启动、中断、死亡的内存语义**:这些操作对其他线程有特殊的内存可见性保证,比如启动新线程时,构造函数的结束对新线程可见。 10. **双重检查锁定(Double-Check Locking)**:这是一种常见的单例模式...

    TareaPOO-构造函数CristianPonce

    8. **final变量与构造函数**:对于final变量,必须在构造函数内或者在变量声明时赋值,之后不能改变。 9. **静态块与实例块**:静态初始化块在类加载时执行,而实例初始化块在创建对象时执行,两者都可以用来初始化...

Global site tag (gtag.js) - Google Analytics