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异常*/