对象和对象引用的区别? 首先在这里先建立一个类,名为:FighterPlane
public class FighterPlane{ String name; int missileNum; void fire() }后进行实例化:
FighterPlane fp;//第一行 fp = new FighterPlane();// 第二行 第一行代码仅仅产生了一个FighterPlane 类的对象引用,保存在系统的栈内存中,并无任何对象产生(在java程序中,可以只存在对象的引用而没有真正的对象存在)。而第二行代码中,通过 new 关键字,系统在堆内存中开辟了一块新的地址,并且通过默认的构造方法,将类的属性和方法复制过来,产生了一个新的对象。“=” 这个操作符使得fp 这个对象引用保存了新产生对象的地址,因此fp作为引用能操控对象。
一个引用可以指向0/1个对象,可以指向不同的对象
FighterPlane fp ; //0个对象 FighterPlane fp = new FighterPlane();// 1个对象当然,一个对象也可以被1到多个引用所指向。
FighterPlane f1,f2,f3,f4; f1 = new FighterPlane(); f2 = new FighterPlane(); f3=f2; f4=f3;上述代码中,引用 f1 单独指向一个对象,f2,f3,f4 共同指向另一个对象。
对象作为参数传递时,传递的是对象的引用,而非对象本身; 举例如下:
class Person { String name; int age; public void tell(){ System.out.println("姓名: "+name+", 年龄: "+age); } } public class javaDemo { public static void main(String args[]){ Person per = new Person(); per.name = '张三'; per.age = 18; change(per); per.tell(); } public static void change(Person temp){ temp.age = 80 ; } } //程序运行结果: 姓名: 张三, 年龄: 80此程序内存图分析如下:
Person per = new Person(); per.name = "张三" ; per.age = 18; change(per) public static void change(Person temp) {....} temp.age = 80;方法执行完毕后,temp断开连接。
对象的初始化顺序: 1)首先初始化的是类变量,即为 static 修饰的成员变量,且只进行一次初始化。 2)执行静态代码块和类变量赋值; 3)初始化实例变量(没有被static修饰的成员变量),但是这一过程并未赋值。 4)执行构造方法以及对实例化变量进行赋值。 举例代码如下:
class Person { static int number; String name; int age; static { number=100; System.out.println(number); } Person(){ number++; } Person(int age,String name){ this.age = age; this .name = name ; number++; } public void tell(){ System.out.println("姓名: "+name+", 年龄: "+age); } } public class javaDemo { public static void main(String args[]){ Person per = new Person(); per.name = "张三"; per.age = 18; change(per); per.tell(); Person per2 = new Person(18,"李四"); } public static void change(Person temp){ temp.age = 80 ; } }程序执行顺序就是,首先初始化静态变量number,然后执行静态代码块,对number进行赋值,同时输出此时number的值:100;然后进入主函数,执行构造函数,对对象的属性进行赋值。
类的static字段不属于任何一个对象,仅仅属于这个类,在类加载时会进行初始化,并且只执行一次,它在内存中只有一个拷贝。而非static字段会在进行对象实例化的时候进行赋值,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响; static定义的字段保存在公共数据区,而非static定义的字段保存在堆区;static定义的字段可以由类名称直接进行调用(在java开发标准中强制使用类名进行调用)。static一般用于 对象之间共享值,方便访问变量,以及统计对象数量。 示例代码如下:
public class CountObject { static int i = 0; CountObject(){ i++; System.out.println("现在的对象个数为:"+i); } public int GetI(){ return i; } public static void main(String args[]){ CountObject t1 = new CountObject(); System.out.println(t1.GetI()); CountObject t2 = new CountObject(); System.out.println(t2.GetI()); } }在这个程序中;静态变量充当了类对象计数器的作用,同时,i 在t1,t2两个对象共享,二者都可以使用。
java中final修饰符的作用:定义常量,定义不能够被覆写的方法,定义不能够被继承的类。 (1)final 修饰符修饰变量,则该变量为常量。无法改变 java public class javatest1 { public static void main(String args[]) { final int num = 0; num = 30; System.out.println(num); } } 此段代码运行报错: (2)final 修饰方法,则方法为最终方法,在子类当中不能被覆盖。利用这一点可防止子类修改此方法,保证了程序的安全性和正确性。
class Parent { int i = 1; public final void method1(){ System.out.println(i); } } class children extends Parent{ public void method1(){ } }此段代码运行报错: (3)使用final定义的类不能够有子类。例如:String 类。
Java中float[10] arr; 语句不正确;原因:系统无法识别该语句给arr数组分配内存空间。 正确方法:
float [] arr = new float [10];或者分步完成也可:
float [] arr =null; arr = new float [10];Java数组元素类型为基本数据类型和引用类型时,初始化系统的操作不同。 当java数组元素类型为基本数据类型时,
int [] arr = new int [10];此时产生了一个有10个单元,类型为 int 的数组对象,所有单元的初值为0 ; 当java数组元素为引用类型时,
String [] example = new String [10];这时产生的是一个具有10个单元的数组对象,每个单元存放的是1个String 对象的引用,所有单元的初值为null。此时并未创建具体的String对象。不能使用数组元素,否则会报错:NullPointerException。
example[0] = new String(“ab”);这时,创建了一个String对象,并且赋值给example[0], 此时example的第一个元素指向String对象,从而可以操纵String对象 。