首先,看Person p = new Person("zhangsan",20); 这个语句都做了什么事情?
1、因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中;
2、执行该类中的static代码块,如果有的话,给Person.class类进行初始化;
3、在堆内存中开辟空间,分配内存地址;
4、在堆内存中建立对象的特有属性,并进行默认初始化;
5、对属性进行显示初始化;
6、对对象进行构造代码块初始化;
7、对对象进行对应的构造函数初始化;
8、将内存地址付给栈内存中的p变量。
看内存中的执行情况:
对象初始化:
对象调用方法过程:
代码描述:
- class Person {
- private String name = "michael";
- private int age;
- private static String country = "cn";// 静态成员变量
- // 自定义构造方法
- Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
- // 构造代码块,对所有的对象进行初始化
- {
- System.out.println(name + ".." + age);
- }
- public void setName(String name) {
- this.name = name;
- }
- // 非静态方法可以使用this关键字,同一个类中,this可以省略
- public void speak() {
- System.out.println(name + "..." + age);
- }
- // 静态方法不可以使用this、super关键字,可以直接使用类名调用其他方法,在同一个类中,类名可以省略
- public static void showCountry() {
- System.out.println("country=" + Person.country);
- Person.method();// 静态方法可以调用其他静态方法,此处的Person.method()等价于method()
- }
- public static void method() {
- System.out.println("method run");
- }
- }
- public class PersonDemo {
- public static void main(String[] args) {
- Person p = new Person("zhangsan", 20);
- p.setName("lisi");
- p.speak();
- Person.showCountry();
- }
- }
复制代码 输出结果:
- michael..0
- lisi...20
- country=cn
- method run
复制代码
|
|