第二章:深入分析类与对象
第七课:成员属性封装
由于Java需要满足封装性,当在定义一个类的成员属性时,要使用关键字private,即类的成员属性对类的外部完全不可见;要使用或者设置类的成员属性可以通过getter/setter方法获取。
代码示例:
public class Main {public static void main(String[] args) {Person person=new Person();person.setAge(20);person.setName("张三");System.out.println(person.getAge()+" "+person.getName());}
}//定义一个类
class Person{private String name;//类的成员属性姓名private int age;//类的成员属性年龄public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {if(age<0){System.out.println("年龄应该大于0岁");}this.age = age;}
}
第八课:构造方法与匿名对象
1.构造方法的定义
构造方法是用于实现实例化对象中属性的初始化处理,每一个类都至少有一个构造方法,如果在类建立后没有人为的写一个构造方法,那么编译器会在编译的时候添加一个无参数的构造方法,一个类可以有多个参数不同的构造方法,构造方法结构如下:
(1).方法名称和类名称相同
(2).没有返回值关键字
(3).只在实例化对象时能调用
代码实例:
public class Main {public static void main(String[] args) {Person person=new Person("张三",20);//修改实例化对象person的年龄person.setAge(22);System.out.println(person.getAge()+" "+person.getName());}
}
//定义一个类
class Person{private String name;//类的成员属性姓名private int age;//类的成员属性年龄
//构造方法public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {if(age<0){System.out.println("年龄应该大于0岁");}this.age = age;}
}
2.构造方法为什么不能有返回值关键字?
若构造方法有了返回值关键字,就不能和类的普通方法作出区分,为了在结构上保持独立,所以构造方法不加返回值关键字用于与普通方法作出区分。
3.用构造方法初始化化对象与set方法初始化对象的区别
使用构造方法只能在对象实例化时对对象进行初始化,如果需要修改实例化对象属性的值,构造方法则做不到,只能使用set方法进行值的修改,所以一个类中构造方法和set方法都是不可或缺的一部分。
4.什么是匿名对象
所谓的匿名对象就是没有名字的实例化对象,例如:
new Person("张三",20);
5.内存分析
实例代码:
public class Main {public static void main(String[] args) {Message message=new Message("Hello World");Person person=new Person(message,20);message= person.getMsg();System.out.println(message.getMsg());}
}
class Message{private String msg;public Message(String m){msg=m;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}
//定义一个类
class Person{private String name;//类的成员属性姓名private int age;//类的成员属性年龄
//构造方法public Person(Message message, int age) {this.name = message.getMsg();this.age = age;}public Message getMsg() {return new Message( name +":"+age);}public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {if(age<0){System.out.println("年龄应该大于0岁");}this.age = age;}
}
代码内存分析:代码“ Message message=new Message("Hello World");”建立了一个类Message的实例化对象message,并利用构造方法给message的属性进行了赋值,即开辟了一个堆内存,message在栈内存中指向该堆内存;代码“ Person person=new Person(message,20);”,建立了一个类Person的实例化对象person,并利用构造方法给person的属性进行了赋值,即又开辟了一个堆内存,person在栈内存中指向改堆内存;代码“message= person.getMsg();”表示把原本指向成员属性值为“Hello World”的实例化对象message重新指向另一块堆内存空间,原堆内存空间就变成垃圾空间,会被GC回收。