Java第四章

本文详细阐述了Java中的对象与对象引用的区别,包括它们的内存分配和生命周期。此外,讨论了对象作为参数传递时的引用传递特性,并通过示例解释了对象初始化的顺序。同时,深入探讨了静态字段与非静态字段的差异,以及静态方法的使用场景。最后,介绍了final修饰符的作用,以及浮点数数组声明的常见错误。文章还对比了基本数据类型和引用类型数组的初始化差异。
摘要由CSDN通过智能技术生成

1.对象和对象引用的区别

①对象分配在堆上,对象引用分配在栈上。
如:

FighterPlane fp;
fp=new FighterPlane("1");
fp=new FighterPlane("2");
/*fp先指向“1”,后来又指向“2”,即FighterPlane fp只是声明了一个FighterPlane类的引用,它可以指向任何FighterPlane类的实例*/

②一个对象在同一时刻可以被多个对象引用指向,但一个对象引用在同一时刻只能指向一个对象。

③声明语句不同。创建对象:new FighterPlane(); 声明对象引用:FighterPlane fp;

2.对象是引用传递,当对象作为参数传递时,传递的是对象的地址。

class IntClass {

    int value;

}

public class RunIntClass {

    public static void modifyValue (IntClass s, int val){

    s.value = val;   
/*该方法中a地址传给s,a和s指向同一个对象,通过s对对象进行赋值,调用完毕后s与val释放,对象属性已经改变*/

}
    public static void main(String args[]) {

    IntClass a = new IntClass( );

    modifyVaLue(a,8);

System.out.println(a.value);
  }
}

3.对象初始化的顺序

父类静态变量->父类静态代码块->子类静态变量->子类静态代码块 (静态部分只在类加载时初始化一次)->父类非静态变量->父类非静态代码块->父类构造方法->子类非静态变量->子类非静态代码块->子类构造方法

class A {
    public A() {
        System.out.println("class A");
    }
    { System.out.println("I'm A class"); } 
    static { System.out.println("class A static"); }
}
public class B extends A {
    public B() {
        System.out.println("class B");
    }
    { System.out.println("I'm B class"); }
    static { System.out.println("class B static"); }
     
    public static void main(String[] args) { 
 new B(); 
 }
}

输出结果为:

class A static        
class B static           
I'm A class             
class A               
I'm B class 
class B

4.(1)类的static字段与非static字段的区别

①static 方法是类方法,但可以被所有对象所访问。调用这个方法时,可采用“对象引用.方法名”,也可采用“类名.方法名”。static方法内部的代码,只能访问类中的static 属性或方法,不能访问类中的非static属性或方法(因为它们属于对象);但非static方法(对象方法)可以访问static属性或方法。

②静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。非静态方法属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。

③静态方法和静态变量创建后始终使用同一块内存,是连续的。非静态方法会存在于内存的多个地方,是离散的。

④静态方法的使用效率比非静态方法的效率高。

(2)当一个方法或者变量需要初始化加载,或者是经常被调用的时候可以加上static。

class UseStatic {
    static int a = 3;
    static int b;
    static void meth(int x) {
    System.out.println("x = " + x);
    System.out.println("a = " + a);
    System.out.println("b = " + b);
}
    static {
        System.out.println("Static block initialized.");
        b = a * 4;
}
public static void main(String args[]) {
    meth(42);
    }
}

输出结果为:

Static block initialized.
x = 42
a = 3
b = 12

5.final修饰符的作用

以final修饰类属性,则该属性为常量;如果修饰方法,则方法称为最终方法,在子类当中不能被覆盖。利用这一点可防止子类修改此方法,保证了程序的安全性和正确性。

 public class Test {
 
      public static void main(String[] args) {
  
          final String country = "China";
          
          final String name = "best";
          
          String user = country + name;  //编译后此处直接是Chinabest
  
     }
 }

6.float[10] arr语句错误。

因为float中的[]不应该给出具体数字。

7.Java数组元素为基本数据类型和引用类型的区别

Java数组元素为基本数据类型时,数组中的所有元素都是基本数据类型;Java数组元素为引用类型时,数组中的所有元素都是对象。

①数组元素为基本数据类型

int[] arr = new int[10]; 
/*此时分配了数组空间,每个单元初始化为默认值0。产生了一个有10个单元,类型为int的数组对象,所有单元的初值为0*/

②数组元素为引用类型

String[] example = new String[10];
/*产生一个具有10个单元的数组对象,每个单元存放的是1个String对象的引用,所有单元的初值为null,此时并未创建具体的String对象,为数组对象引用赋值后,才能使用数组元素,否则抛出NullPointerException异常*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值