一、面向对象的封装性
封装(encapsulation)又叫隐藏实现(Hiding the implementation)。就是只公开代码单元的对外接口,而隐藏其具体实现。比如手机,手机的键盘,屏幕,听筒等,就是其对外接口。你只需要知道如何按键就可以使用手机,而不需要了解手机内部的电路是如何工作的。封装机制就像手机一样只将对外接口暴露,而不需要用户去了解其内部实现。
开发建议:以后在定义类的时候,所有的属性都要编写private封装,封装之后的属性如果需要被外部操作,则编写setter、getter方法去实现。
二、类中的构造方法
先来看对象的产生格式:
①类名称 ②对象名称 = ③new ④类名称();
①类名称:规定了对象的类型。即:对象可以使用哪些属性和方法都是由类定义的;
②对象名称:如果需要使用对象,需要有一个名称,这是一个唯一的标记;
③new:分配新的堆内存空间;
④类名称():调用了名称和类名称相同的方法,这就是构造方法。
实际上,构造方法一直在被我们调用,但我们并没有去定义它,为什么能够使用呢?这是因为在整个Java开发中,为了保证程序可以正常执行,即便用户没有定义任何构造方法,也会在程序编译后自动为类增加一个没有参数,方法名称与类名称相同,没有返回值的构造方法。
构造方法的定义:方法名称和类名称相同,没有返回值声明。
//无参,无返回值的构造方法
public Book() {
}
如果在Book类中没有定义以上的构造方法,那么也会自动生成一个无参,无返回值的构造方法。
我们再看:
package com.wz.classandobj;
class Book{
//无参,无返回值的构造方法
public Book() {
System.out.println("无参构造方法");
}
}
public class TestDemo {
public static void main(String args[]) {
Book book = null;//声明对象
}
}
// 运行,什么也没有打印。
在主方法中加入实例化对象的代码:
public class TestDemo {
public static void main(String args[]) {
Book book = null;//声明对象
book = new Book();//实例化对象
}
}
运行: 打印 --> 无参构造方法
以上说明,构造方法是在对象使用关键字new实例化的时候被调用。
构造方法与普通方法最大的区别是:
构造方法在实例化对象(new)的时候只调用一次,而普通方法是在实例化对象之后可以随意调用多次。
在实际开发中,构造方法的作用是在类对象实例化的时候设置属性的初始化内容,范例如下:
package com.wz.classandobj;
class Book{
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public void getInfo(){
System.out.println("图书的名称:"+title+" 图书的价格:"+price);
}
}
public class TestDemo {
public static void main(String args[]) {
Book book = new Book("Java开发",89.9);//设置属性的初始化内容
book.getInfo();
}
}
//运行结果: 图书的名称:Java开发 图书的价格:89.9
如果一个类中已经明确定义了一个构造方法,则无参构造方法将不会自动生成。而且,一个类之中至少存在一个构造方法。另外,既然构造方法也属于方法,那么构造方法也可以重载,但是由于构造方法的特殊性,所以在构造方法重载时注意其参数的类型及参数的个数即可。
范例如下:
package com.wz.classandobj;
class Book{
private String title;
private double price;
//如果调用这个构造方法,因为没有对属性设置,所以
//输出值为默认值:title == null price == 0.0
//只要写了构造方法,编译器就不会生成默认构造方法
public Book() {
System.out.println("无参的构造方法");
}
public Book(String title) {
this.title = title;
System.out.println("有一个参数的构造方法");
}
public Book(String title, double price) {
this.title = title;
this.price = price;
System.out.println("有俩个参数的构造方法");
}
public void getInfo(){
System.out.println("图书的名称:"+title+" 图书的价格:"+price);
}
}
public class TestDemo {
public static void main(String args[]) {
Book book1 = new Book();
book1.getInfo();
Book book2 = new Book("Java开发");
book2.getInfo();
Book book3 = new Book("Java开发",89.9);
book3.getInfo();
}
}
运行结果:
无参的构造方法
图书的名称:null 图书的价格:0.0
有一个参数的构造方法
图书的名称:Java开发 图书的价格:0.0
有俩个参数的构造方法
图书的名称:Java开发 图书的价格:89.9
在进行构造方法重载时有一个编写建议:所有重载的构造方法按照参数的个数由多到少,或者是由少到多排列。
三、类中的匿名对象
没名字的对象称为匿名对象,对象的名字按照之前的内存关系来讲,在栈内存之中,而对象的具体内容在堆内存之中保存,这样,没有栈内存指向堆内存空间,就是一个匿名对象。
范例:
package com.wz.classandobj;
class Book{
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
System.out.println("有俩个参数的构造方法");
}
public void getInfo(){
System.out.println("图书的名称:"+title+" 图书的价格:"+price);
}
}
public class TestDemo {
public static void main(String args[]) {
//匿名对象
new Book("Java开发",89.9).getInfo();
}
}
运行结果:
有俩个参数的构造方法
图书的名称:Java开发 图书的价格:89.9
匿名对象由于没有对应的栈内存指向,所以只能使用一次,一次之后就将成为垃圾,并且等待被GC回收释放。