`

java 简单理解实例变量类变量并理解setXXX和getXxx

 
阅读更多

今天带着自己的兴趣看了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创建上衣类上衣类继承服装类,并满足以下要求

    2、增加相应的getXxx()和setXxx()方法,增加相应的构造方法。 3、重写父类的输出方法,输出的服装信息要增加风格的说明。 4、增加新的无参方法,根据服装的风格输出:通勤风:适用于日常上下班穿着;学院风:适用于在校...

    Java面向对象程序设计方案练习题(1).doc

    【练习题】06.get方法和set方法 定义一个类 该类有一个私有成员变量 通过构造方法将其进行赋初值 并提供该成员的g etXXX()和setXXX()方法 提示 假设有private String name。则有 public void setName(String name){...

    抽象和封装PPT

    5.1 属性私有,通过getXXX()或 setXXX()方法来取值或赋值,在setXXX()方法中添加 代码进行控制 5.2 6.this 表示对象本身(部分内容还要和后面的super对照讲解) 7.八种原生数据类型 作为属性变量的时候 系统会...

    java面向对象程序设计实验报告.doc

    我创立了一个Number类,并创立了两个对象number1和number2,该 类有一个类成员函数static int numberofsum(int a, int b)来求和,一个类成员变量countnumber来统计对象的个数,还有实例成员变量num,通 过两个对象...

    记录所有有关java的学习笔记.rar

    将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问private成员变量,提供对应的getXxx()/setXxx()方法 public class Student { //封装 public int age; ...

    等差等比求和

    Javabean模型Example6_1_Bean.java中的getXxx和setXxx方法不涉及对数据的具体处理细节,以便增强模型的通用性。比如,setSum(double s)仅仅将参数s的值赋给属性sum,因此,模型即可以存储等差数列的和也可以存储等比...

    理解javascript封装

    使用this.XXX来声明一个变量,然后再声明getXXX、setXXX等取值、赋值的方法。 使用this._XXX来声明一个变量,然后再声明getXXX、setXXX等取值、赋值的方法。 利用“函数作用域”这一个概念来做。 1. 门户大开型 ...

    Elevenyxy.zip

    尽可能隐藏所有变量,再通过GetXXX()和SetXXX()方法对各变量进行读写; 至少定义两个构造方法(一个无参的构造方法,一个有参的构造方法,有参的构造方法需要显示调用无参的构造方法); Role类中要体现出...

    Java面向对象程序设计方案练习题.doc

    【练习题】06.get方法和set方法 定义一个类 该类有一个私有成员变量 通过构造方法将其进行赋初值 并提供该成员的g etXXX()和setXXX()方法 提示 假设有private String name;则有 public void setName(String name){ ...

    Java做的简单的投票系统

    1.要求用面向对象的方法,编写学生类Student,将候选人的姓名、代号和票数保存到类Student中,并实现相应的getXXX和setXXX方法。 2.输入之前显示候选人的姓名、代号、票数。 3.循环执行接受键盘输入的候选人的代号。 4....

    Yii框架核心组件类实例详解

    通过定义两个成员函数(getXXX/setXXX)来定义一个成员变量,比如: public function getText() {…} public function setText {…} 这样就相当于定义了一个$text成员变量,可以这样调用 $a=new CComponent; $a=$...

    上课日记学习java

    (1)但是Action不是单例的,每当有请求到来都会创建一个Action实例,说明Action是轻量级的,请求结束,Action对象会被销毁 (2)Action中可以定义普通的属性变量,用于保存当前这个请求的数据----Servlet不可以; (3)拦截...

    java面试800题

    (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式; (4)调用本身构造函数。" Q0053 "Public class Servlet extends HttpServlet{ int i; doget(){ i++; out.print(i); } } 每次访问时i是否变化?...

    beanutils-1.9.3-bin

    对于JavaBean,简单的来说,就是要有一个空参的构造器和对属性的getXXX方法和setXXX方法。 在由JDK提供的默认的API中,有java.beans包,里面有诸如Introspector,BeanInfo,PropertyDescriptor等用来操作JavaBean的...

    18天的JAVA笔记

    面向对象的三大特征:封装、继承、多态。 Java Bean 一种组件规范 --> 所有属性私有,访问方法按照命名规范setXxx(),getXxx()方法

    commons-beanutils-1.9.2包含全部jar包源码及API文档

    It is natural to then access these methods directly, using calls to the corresponding getXxx and setXxx methods. However, there are some occasions where dynamic access to Java object properties ...

    java实验报告:实验六.doc

    输入参数(IN):Java.sql.PrepareStatement接口提供了一系列setXXX方法向SQL语句 传递输入参数,实现动态的SQL语句。在传递参数时,必须满足数据类型一致的要求. 6.输出参数(OUT):在调用一个存储过程时,可用setXXX...

    mybatis-plus-generator.rar

    2. 集成Lombok,无需生成setXXX和getXXX方法; 3. 集成API文档接口工具Swagger2,只需根据实际情况修改@ApiModel注解的Value和description内容即可; ##开发环境 - Springboot 2.2.2.RELEASE - mybatis-plus-...

    Java试题-6:JavaBean的应用

    问题描述:存在一个JavaBean,它包含以下几种可能的属性: 1.boolean/Boolean 2.int/Integer 3.String 4.double/Double ...只需要设置带有getXxx/isXxx/setXxx方法的属性, 非JavaBean属性不设置, 请用代码实现.

    黑马入学试题及答案

    1.方法中的内部类能不能访问方法中的局部变量,为什么? 2.分析运行结果,说明原理。(没有分析结果不得分) import java.util.ArrayList; class Data { int val; } public class Test { public static ...

Global site tag (gtag.js) - Google Analytics