今天带着自己的兴趣看了java-对象和内存控制有关的资料,对以前习以为常的代码写法如:
public class Entity1 { private String fieldx ; public Entity1() { super(); } public Entity1(String fieldx) { super(); this.fieldx = fieldx; } public String getFieldx() { return fieldx; } public void setFieldx(String fieldx) { this.fieldx = fieldx; } }
对带参数的构造函数的理解知之甚少,总感觉大家这样写都是真理完全没有必要推敲其中的原因,今天有幸带着自己的灵感看了关于java对象的内存控制,感觉豁然开朗。
原来使用构造函数创建对象实例的过程中也对实例变量做了初始化的操作。对实例变量可以指定初始值的情况有三处分别是:定义实例变量时指定初始值、非静态初始化块指定初始值、构造函数指定初始值。
关键点就在“构造函数指定初始值”。定义实例变量时赋值、非静态初始化块赋值最终都会合并到构造函数中。因此我以前的疑惑来了,为何在构造函数中使用 this.field1 = field1 ;就能为实例变量赋值了。还要注意的是:上述两种为实例变量赋值的语句总是位于构造器的所有语句之前、两种为变量赋值的语句出现顺序为在其源代码中出现的顺序。
类变量的初始化过程和内存分配:
类变量的初始化过程和实例变量相同不同的是对类变量的初始化只能有两种情况:
1、在定义初始化变量的时候为其赋值。
2、在静态初始化块中为其赋值。两种赋值也是按照顺序的。
理解一下语句:在同一个JVM内每一个类只对应一个Class对象,但每一个类可创建多个java对象。
好了为了更加深入的理解类变量的初始化改编一道别人的面试题如下:
public class Question { public final static Question INITQ = new Question(100); public static int initValue = 100 ; public int currentValue ; public Question(int value) { super(); this.currentValue = initValue - value; } public static void main(String[] args) { System.out.println( Question.INITQ.currentValue ); // 猜猜此处输出值为? Question q = new Question(100); System.out.println( q.currentValue ); // 再猜猜此处输出值为? } }
如果你能果断直接的回答出答案说明你java基础还是可以的最起码比本人强多了。
国庆后来上班又看了看此道面试题顿时懵了,又找不到问题的答案了,仔细读了自己的笔记后还是没有发现端倪可见本人技术多菜没办法只有果断运行了。
运行后发现结果和自己想的有出入仔细分析和查看后发现:对实例变量or类变量赋值顺序是非常重要的,果断将上述代码对类变量定义的顺序调换:
public class Question { public static int initValue = 100 ; //调换后代码 public final static Question INITQ = new Question(100); // public static int initValue = 100 ; 调换前代码 public int currentValue ; public Question(int value) { super(); this.currentValue = initValue - value; } public static void main(String[] args) { System.out.println( Question.INITQ.currentValue ); // 猜猜此处输出值为? Question q = new Question(100); System.out.println( q.currentValue ); // 再猜猜此处输出值为? } }
再次运行!!!哈哈
相关推荐
在这个 Java 程序中,我们设计了一个 Person 类,该类有两个私有成员变量 name 和 age,使用接口器函数 getXXX 和 setXXX 来访问这些成员变量。该类还具有一个构造函数,用于初始化 name 和 age 成员变量。该类还...
通过这次作业,学生不仅可以熟悉NetBeans的使用,还能深入理解Java类的构建、成员变量的封装、以及如何通过setter和getter方法来实现对象间的交互。同时,这也是一次提升代码质量,遵循良好编程实践的机会。
通过以上的练习题,我们可以更深入地理解Java面向对象编程的基本概念和技术,包括类的定义、成员变量的使用、方法的实现、构造方法及其重载等。这些知识点对于学习和掌握Java面向对象编程至关重要。
Java 是一种广泛使用的编程语言,尤其适合面向对象的软件开发。...在后续的学习中,还需要深入理解类的构造函数、异常处理、集合框架、IO流、多线程等高级主题,以及更现代的特性如Lambda表达式和模块化系统。
- **访问方法**:通常使用`setXXX`和`getXXX`方法来设置和获取对象的属性值。 #### 继承 继承是面向对象编程的一个关键特性,允许一个类(子类)继承另一个类(父类)的属性和方法。 - **继承语法**:`class 子类名...
3.2.4 实例变量 只能用 对象名.变量名调用 4.方法重载 overload 一个类中的几个方法名相同,参数列表不同 的情况 (部分内容还要和overwrite 对照讲解) 4.1 方法名相同,参数列表不同 4.2 与访问修饰符和返回值无关...
- **实例变量**:每个对象都有一份副本,如`Number`类中的`num`。 - **类变量(静态变量)**:所有对象共享同一份副本,如`Number`类中的`countnumbers`。 3. **构造函数(Constructor)**: - **构造函数**:...
### Java面向对象基础知识点 #### 一、面向对象概述 1. **面向对象概念**:面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用...掌握这些基础知识对于理解和编写面向对象的Java程序至关重要。
- 例如,一个`getXxx()`方法用于获取变量,一个`setXxx(data)`方法用于设置变量。 3. **关键字`private`**: - `private`关键字用于限制对成员变量或方法的访问,只允许在同一个类内部访问。 4. **JavaBean标准...
- **getter和setter方法**:实现`getXXX()`和`setXXX()`方法以获取和设置私有成员变量的值。 - **数据安全性**:通过封装私有成员变量来确保数据的安全性。 ### 7. 构造方法与重载 这个题目涉及到了**类的设计**、*...
这种能力使得Java程序能够在运行时根据需要加载和使用类,从而增强了程序的灵活性和可扩展性。Java反射机制主要包括以下几个关键部分: - **`Class`类**:表示任何已加载的Java类或接口。 - **`Field`类**:表示类...
我创建了一个 Number 类,并创建了两个对象 number1 和 number2,该类有一个类成员函数 static int numberofsum(int a, int b) 来求和,一个类成员变量 countnumber 来记录对象的个数,尚有实例成员变量 num,通过两...
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问private成员变量,提供对应的getXxx()/setXxx()方法 public class Student { //封装 public int age; ...
对于类中的私有属性,要对其给出一对方法(getXXX,setXXX())访问私有属性,保证对私有属性的操作和安全性。方法的封装,该公开的公开,该隐藏的隐藏。 继承 继承是指通过继承实现代码复用。Java中所有的类都是...
需要注意的是,这里假设JavaBean具有公共的getXXX()和setXXX()方法。 #### 五、总结 Java反射机制是Java语言的一项强大特性,它使开发者能够编写更加灵活和动态的应用程序。通过使用反射,可以实现在运行时动态...
- `setXXX`和`getXXX`方法:用于设置和获取文件的信息。 #### 2. `SocketFileClient`类 - **继承自**:`Thread`类,实现了多线程上传。 - **成员变量**: - `vFile`:存储待上传文件的绝对路径。 - `vFileName`...
定义 getXXX()和 setXXX() 方法,如 setName(String name) 和 getName()。 五、构造方法与重载: * WuMingFen 类:定义一个类,包含三个属性:面码(theMa)、粉的分量(quantity)和是否带汤(likeSoup)。写一个构造...
- **final 变量**:一旦初始化后不可更改,分为实例变量、方法参数和常量(final static)。 **抽象类**是不包含完整实现的类,它们通常用来定义接口或者作为基类供其他类继承: - **抽象方法**:只有签名,没有...
1. **提供对实例以及类变量的访问控制**:通过使用getters和setters来保护类的成员变量。 2. **引用类变量和类方法**:合理利用静态方法和变量,但避免过度使用。 3. **常量**:使用final修饰符声明不可变常量。 4. ...