Java第四章小结1

1.对象与对象引用的区别是什么? 请举例说明

我们经常看到:

plane fp=new plane();

在这里,new plane()创建了一个对象,fp被称为该对象的引用。

具体来说,分成如下几个步骤


plane fp; //在栈内存里面开辟了空间给引用变量fp,这时fp=null
fp=new plane();

// new plane()在堆内存里面开辟了空间给plane类的对象,这个对象没有名字
// plane()随即调用了plane类的构造函数
// 把对象的地址在堆内存的地址给引用变量plane

注意:在这里,"="的意思是将对象的地址赋给引用fp。也就是说,fp里保存的,实际上是一个对象地址,通过fp即可操纵该对象。

形象点说,就像遥控器(对象引用)和电视机(对象)的关系

补充:一个对象引用变量均占据4字节空间; 一个对象至少占据16字节,其中包含12字节的对象头信息。除此以外,还有实例数据,对齐填充字节。

2.对象作为参数传递的特点是什么?请举例说明

首先我们明确,基本数据类型作为参数传递是值传递

public class ValuePass {
  private static int a;
  public static void main(String [] args) {
      modify(a); 
      System.out.println(a);
  }
  public static void modify(int a) {
       a++; 
  }
}
//0

对象作为参数传递是引用传递,即传递的是对象地址

class IntClass {
   int value;   
}   
public class RunIntClass {
   public static void modifyValue(IntClass s, int val){ 
        s.value = val; 
   } 
   public static void main(String[] args) { 
        IntClass  a = new IntClass();     
        modifyValue(a,8);
        System.out.println(a.value);  
   }
}
//8
class IntClass {  
   int value;  
}   

public class RunIntClass {  
   public static IntClass getInstance() { 
      //在方法中产生对象
      IntClass s = new IntClass ();
      s.value=8;
      return  s; //返回对象引用
   } 
   public static void main(String [] args) { 
      IntClass a = getInstance();
      System.out.println(a.value);
   }
}
//8

3.对象初始化顺序是怎样的?请举例说明

创建对象时的初始化顺序:

>>系统会对数据成员进行默认初始化

>>执行数据成员定义处的初始化语句

>>调用构造方法为数据成员指定初值

class IntClass{
    int value;//自动初始化 默认值为0
   //int value=5; 在定义时指定初值
}

public IntClass(){}

public IntClass(){
    value=val;
}

public class IntClassConstructor{
    public static IntClass getinstance(){
            IntClass s=new IntClass(8);
            return s;
        }
    public static void main(String args[]){
        IntClass a=new IntClass();
        System.out.println(a.value);
        a=getinstance();
        System.out.println(a.value);
    }

}//0 8

4.类的static字段与非static字段的区别是什么?什么场景应该使用static修饰符?请举例说明

>>用static修饰符修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员。

>>它被保存在类的内存区的公共存储单元中,而不是保存在某个对象的内存区中。因此,一个类的任何对象访问它时,存取到的都是相同的数值。

>>访问方式为通过类名加点操作符来访问,也可通过对象引用来访问。

>>静态数据成员仅在类加载时进行初始化,且只执行一次初始化

>>static方法内部的代码,只能访问类中的static属性或方法,不能直接访问类中的非static属性或方法(因为那是对象方法),但非static方法(对象方法)可以访问static数据成员。

>>main方法是特殊的静态方法,是Application程序入口点,必须写成public static void main(String [] args)的形式。

 

输出 5 2

静态代码块

一个类中可以使用不包含在任何方法体中的静态代码块,当 类被装载时,静态代码块被执行,且只被执行一次,静态代 码块经常用来对类中定义的属性进行初始化。  

class Test {    
static int value ;  
  static {            
           value = 3;     
           System.out.println("value="+value); 
   }  
  public static void main(String[] args){   } 
} 
//程序输出结果为value=3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值