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 B4.(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 = 125.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异常*/