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、匿名对象只能够使用一次。