12、构造方法与匿名对象

1、本次的预计讲解的知识

1、构造方法的定义语以及调用时机;

2、匿名的基本使用。

2、具体内容

现在已经清楚了对象的产生格式:

①类名称 ②对象名称 = new④类名称();

· ①类名称:规定了对象的类型,即:对象可以使用哪些属性与那哪些方法,都是类定义的

· ②对象名称:如果想使用对象,需要有一个名字,这是一个唯一的标记;

· ③new:开辟系新的堆内存空间,如果没有此语句,对象无法实例化;

· ④类名称():调用了一个和类名称一样的方法,这就是构造方法。

通过以上的简短分析可以发现,所有的构造方法实际上一直在被调用,但是我们从来没有定义一个构造方法,之所以能够使用时因为整个Java类中,为保证程序的可以正常的执型,那么即使用户没有定义任何的构造方法,在程序编译之后自动的为类里面增加一个没有参数,方法名称与类名称称相同,没有返回值得构造方法。

构造方法的定义原则:方法名称与类名称相同,没有返回值声明。

class Book {

public Book () {} //无参的,无返回值得构造方法

}

如果在我们Book类里面没有写上以上的构造方法,那么也会自动生成一个。

构造方法一直都存在,但是并没有发现构造方法有什么作用。

class Book {

public Book () {//无参的,无返回值得构造方法

System.out.println("**********");

}

}

public class Demo {

public static void main(String[] args) {

Book book = null; //声明对象

book = new Book();//实例化对象

}

}

通过以上的代码可以发现,所有的构造方法都在使用关键字new实例化的时候被默认调用。

构造方法与普通方法的最大区别:

构造方法是在实例化新对象的时候只调用一次。

普通方法是在实例化对象产生之后可以随意调用多次。

 

既然构造方法是在对象实例化的时候调用的,那么请问,这样的做法有什么用处呢?

class Book {

private String title ; //书的名字

private double price ; //书的价格

public void getInfo () { //此方法由对象调用

System.out.println("图书名称:" + title + "价格:" + price);

}

public String getTitle() {

return title;

}

public void setTitle(String t) {

title = t;

}

public double getPrice() {

return price;

}

public void setPrice(double p) {

price = p;

}

}

public class TextDemo {

public static void main(String[] args) {

Book bookA = new Book() ; //使用默认生成的构造方法

bookA.setTitle("Java开发") ;

bookA.setPrice(89.8) ;

bookA.getInfo();

}

}

本程序是先实例化的了Book类对象,而后利用Book类的实例化对象去调用类中setter方法,如果要想设置全部属性的内容,那么一定要调用多次setter方法。

范例:定义一个构造方法

class Book {

private String title ; //书的名字

private double price ; //书的价格

//已经明确定义了一个构造,默认的构造将不再自动生成

public Book (String t,double p) {

title = t;

setPrice(p);//调用类定中的setter方法

}

public void getInfo () { //此方法由对象调用

System.out.println("图书名称:" + title + "价格:" + price);

}

public String getTitle() {

return title;

}

public void setTitle(String t) {

title = t;

}

public double getPrice() {

return price;

}

public void setPrice(double p) {

if (p > 0.0) {

price = p;

}

}

}

public class TextDemo {

public static void main(String[] args) {

//在实例化的同时将所需要的类属性传递到队形方法里

Book bookA = new Book("Java开发",89.8) ; //使用默认生成的构造方法

bookA.getInfo();

}

}

在实际的工作之中,构造方法的核心作用:在类对象实例化的时候设置属性的初始化美容,构造方法是为属性初始化准备的。

如果一个类之中已经明确的定义了一个构造方法的话,那么将不会自动生成默认的构造方法,即:一个类之中至少保留一个构造方法。

另外,既然构造方法与属于方法的行列,可以针对于构造方法进行重载,但是构造方法由于其定义的特殊性,所以在构造方法重载时,要求只注意参数的类型及个数即可(方法名称不可动)。

范例:构造方法重载

class Book {

public Book() {//无参的,无返回值得构造方法

System.out.println("无参构造");

}

public Book(String t) {//无参的,无返回值得构造方法

System.out.println("有一个参数的构造");

}

public Book(String t,double p) {//无参的,无返回值得构造方法

System.out.println("有二个参数的构造");

}

//其他方法省略

}

public class Demo {

public static void main(String[] args) {

Book book = new Book();

}

}

在进行构造方法重载的时候有一点代码编写要求:请按照参数的个数进行升序或降序排列。

遗留问题:在定义一个类的时候乐意为属性直接设置默认值,但是这个默认值只有在构造执行完后才会设置,否则不会设置,而构造方法是属于对象构造过程的最后一步,即:是留给用户处理的步骤。

在对象实例化过程之中,一定会经历类的加载,内存的分配,默认值的设置,构造方法。

class Book {

private String title = "Java开发";

punic Book() {}//title现在的默认值跟构造方法没关系

}

本程序之中,只有在整个构造都完成之后,才会真正将Java开发”这个字符串的内容设置给title,之前在没有构造之前title都是其对应诗句类型的默认值。

那么既然有了构造方法的概念,实际上就可以依照次方式使用匿名对象,之前定义的都属于有名对象,所有的对象都给了一个名字,但是这名字真正使用的时候调用的肯定是堆内存空间,即:真是的对象信息都保存在可堆内存之中,那么没有栈指向的对象就称为匿名对象。

class Book {

private String title ; //书的名字

private double price ; //书的价格

//已经明确定义了一个构造,默认的构造将不再自动生成

public Book (String t,double p) {

title = t;

setPrice(p);//调用类定中的setter方法

}

public void getInfo () { //此方法由对象调用

System.out.println("图书名称:" + title + "价格:" + price);

}

public String getTitle() {

return title;

}

public void setTitle(String t) {

title = t;

}

public double getPrice() {

return price;

}

public void setPrice(double p) {

if (p > 0.0) {

price = p;

}

}

}

public class TextDemo {

public static void main(String[] args) {

new Book("Java开发",89.8).getInfo();

}

}

但是匿名对象由于没有其他对象对其进行引用,所以只能使用一次,一次之后该对象空间将称为垃圾,等待回收。

疑问?什么时候使用有名对象,什么时候使用匿名对象?

如果觉得匿名对象那个麻烦就都用有名的。

3、总结

1、构造方法的定义要求:方法名称与类名称相同无返回值声明;

2、构造方法是在类对象使用关键字new实例化的时候被默认调用的,不管代码如何改变,只要有了关键字new就一定需要构造方法;

3、一个类之中至少保留有一个构造方法,如果没有明确定义构造方法,那么会自动生成一个无参的什么都不做的构造方法;

4、构造方法的核心功能是在类对象实例化的时候为类中的属性初始化;

5、构造方法重载时只要求考虑参数的类型即个数即可;

6、匿名对象只能够使用一次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章