类的属性
1.属性(field),或者叫成员变量
2.属性用于定义该类或该类对象包含的数据或者说静态属性
3.属性的作用范围是整个类体
4.**在定义成员变量时,可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化:
数值:0、0.0
字符:\u0000(Unicode编码中对应的0)
boolean:false
所有引用类型:null**
5.属性定义格式:
[修饰符] 属性类型 属性名 = [默认值];
程序执行过程的内存分析
示例一:
Student.java
package cn.bjsxt.oop;
public class Student {
//静态的数据
String name;
int id; //学号
int age;
String gender;
int weight;
//动态的行为
public void study(){
System.out.println(name+"在学校");
}
public void sayHello(String sname){
System.out.println(name+"向"+sname+"說:你好!");
}
Test1.java
package cn.bjsxt.oop;
public class Test1 {
public static void main(String[] args) {
//通过类加载器Class Loader加载Student类。 加载后,在方法区中就有了Student类的信息!
Student s1 = new Student();
s1.name = "高琪";
s1.study();
s1.sayHello("馬士兵");
Student s2 = new Student();
s2.age = 18;
s2.name="老高";
}
}
内存分析示意图(图中的地址是随意写的,没有根据):
示例二:
Student.java
package cn.bjsxt.oop;
public class Student {
//静态的数据
String name;
int id; //学号
int age;
String gender;
int weight;
Computer computer;
//动态的行为
public void study(){
System.out.println(name+"在学校");
}
public void sayHello(String sname){
System.out.println(name+"向"+sname+"說:你好!");
}
Test2.java
package cn.bjsxt.oop;
public class Test2 {
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "高琪";
s1.age = 18;
Computer c = new Computer();
c.brand = "联想";
c.cpuSpeed = 100;
s1.computer = c;
c.brand = "戴尔";
System.out.println(s1.computer.brand);
}
}
内存分析示意图(图中的地址是随意写的,没有根据):
分析:由此可见,Java中看不见指针,却处处是指针。
首先,创建Student、Computer和Test2类时,将类中的信息、static变量、变量池等放入方法区(堆)中。
进入main函数:
Student s1 = new Student(); 调用构造器,在堆中创建一个对象,属性皆为默认值,方法中的地址指向方法区中的对应的方法。s1在main函数中,是局部变量,所以在栈中产出,并将构造器在方法区创建的对象的引用赋值给s1。
s1.name = “高琪”; 将方法区中常量池中的”高琪”的引用赋值给对象属性name。(常量池有共享机制,即在Comput中使用”高琪”和在Student中使用的是相同的值)
s1.age = 18; 直接将对象中的age属性中的值由0该为18。
后面的语句原理相同,无非是引用间的相互赋值。