-
对象:对象是对客观事物的抽象(是一个类的实例 ),就好比如一台电视机
-
对象的引用: 当对象的声明被赋予特定的对象后,声明就被称为了引用
public class FighterPlane {
……
public static void main(String[] args) {
FighterPlane fp;//声明对象,但此时并不创建对象
fp = new FighterPlane();//创建对象,此时fp被成为对象的引用,new FighterPlane 用于创建对象
//上面两句可以合二为一 FighterPlane fp = new FighterPlane();
}
}
attention: 一个对象引用变量均占据4字节空间;一个对象至少占据16字节,其中包含12字节的对象头信息。除此以外,还有实例数据,对齐填充字节。
2.对象作为参数传递的特点是什么?请举例说明方法中的参数可以为基本数据类型,也可以是对象,他们有不同的特点。
- 基本数据类型作为参数在方法中的传递是值传递
public class ValuePass {
public static void modify(int a) {
a++;
}
private static int a;
public static void main(String [] args) {
modify(a);
System.out.println(a);
}
}
//结果 为0
//在modify方法中的语句虽然是a 进行了自增,但是此时的a并非和main函数中传递过去的a为同一个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
// 当对象作为实参时,会把对象的地址传递给方法中对的形参,此时实参和形参指向了同一块内存,当在方法中利用形参修改内存中的值后,方法一旦结束,形参就会被释放,但是实参指向的内存中的已经被修改,不会因为形参的释放而变回去。
3.对象初始化顺序是怎样的?请举例说明
创建对象时的初始化顺序:
- 系统会对数据成员进行默认初始化
- 执行数据成员定义处的初始化语句
- 调用构造方法为数据成员指定初值
class IntClass{
int value;//自动初始化 默认值为0
//int value=5; 在定义时指定初值
}
public IntClass(){}
public IntClass(){
value=val;
}
public class IntClassConstructor{
//调用构造方法,从而省略了s.value代码
public static IntClass getinstance(){
IntClass s=new IntClass(8);
// s.value = 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属性或方法(因为那是对象方法),但非static方法(对象方法)可以访问static数据成员
- main方法是特殊的静态方法,是Application程序入口点
- 无static修饰的数据成员(方法)为一个类特有的数据成员(方法),对于任何一个类的实例,其值一般都是不同 的。
class Intclass {
static int num = 1; //静态数据成员初始化
int value = 5;//在定义时指定初值
public Intclass(int val) {
value = val;
}
//静态方法
static int countNum() {
return num;
}
public class IntClassContructor {
public static IntClass getInstance() {
IntClass s = new IntClass(8);
return s;
}
public static void main(String[] args) {
System.out.println(IntClass.countNum());
IntClass a = new IntClass();// value 被初始化为5
System.out.println(a.value);
IntClass.num++;
a = getInstance();
a.num++;
System.out.println(a.num);
}
}
}
//输出结果:
// 1
// 5
// 3
5.Java中final修饰符都有什么作用?请举例说明
- final修饰属性,则属性为常量
final int NUM = 20; NUM = 30; // 编译错误
- 如果修饰方法,则该方法在子类当中不能被覆盖(见多态一节),可防止任何继承类修改此方法,保证了程序的安全性和正确性
class Parent {
public final void method1(){}//这个方法不能被子类覆盖
}
class Child extends Parent {
public final void method1(){…}//编译错误
}
- final修饰类,则该类不能被继承
class Parent {}
final class Person extends Parent{
} //可以继承Parent类
class Child extends Person{
} //编译报错,不能继承Person类
6.Java中float[10] arr; 语句正确么?为什么?
不正确
Java中的数组可以看作是一个对象,可以称为数组对象。 既然是对象,那么创建的时候就要用的 new 关键字。
- 一维数组
-
声明:类型标识符,数组名[] 或 类型标识符[],数组名
- 例如:int [] abc ; String[] ex;MyClass[] mc; (也可以写成:int abc[]; String ex[];MyClass mc[]. 不过这种写法不常用。
-
定义:类型标识符[],数组名 = new 类型标识符[数组长度] 或类型标识符,数组名[] = new 类型标识符[数组长度]
-例如:int[] abc = new int[10]; (或者 int abc [] = new int[10]) -
初始化:
- 直接在声明的时候进行初始化
- 例如:String [] s = {“ab”,“bc”,“cd”}; int[] a = {3,4,5,6};
也可以采用以下方式定义及初始化
float f4[] = new float[] {1.0f,2.0f,3.0f};
-
- 二维数组
- 声明: 类型说明符 数组名[ ][ ]; 或 类型说明符[ ][ ] 数组名;
- 例如: int arr[ ][ ] 或 int [ ][ ] arr;
- 初始化:
- 使用关键字new
数组名=new 类型说明符[数组长度][ ];
数组名=new 类型说明符[数组长度][ 数组长度]
例如: int arra[][]; arra=new int[3][4] - 是用指定的初值对数组初始化
例如: int[][] arr1={{3,-9,6},{8,0,1},{11,9,8}}
- 使用关键字new
- 基本数据类型: 数组元素的值直接存储在对应的数组元素中,因此,初始化数组时,先为该数组分配内存空间,然后讲数组元素的值存入对应数组元素中。
例如:
int [] a = {1,2,3,,4,5}'
- 引用数据类型: 每个数组元素里存放的还是引用,他指向另一块内存,这块内存里存储了想用的数据;
例如:
MyClass[] mc = new MyClass[10]; // 未初始化之前全是 null



