Java基础----构造方法与匿名对象
构造方法
构造方法是在类中定义的一种特殊的方法,其主要的功能是为类对象中的属性进行初始化操作使用的,对于不包含构造方法的代码使用如下的流程进行初始化处理:
·实例化某个类对象;
·通过实例化对象调用setter方法为类中的属性说初始化;
当有了构造方法之后,可以在对象实例化的同时将所需要的属性传递到对象之中,自动实现属性初始化。
public Ball(String classify,double price){
this.classify = classify;
this.price = price;
}
Ball ball = new Ball("篮球",20);
构造的方法的特殊性:
1.构造方法的名字必须与定义他的类名完全相同,没有返回类型。
2.主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。
3.类中必定有构造方法,若不写,系统自动添加无参构造方法。接口不允许被实例化,所以接口中没有构造方法。
4.不能被static、final、synchronized、abstract和native修饰。
5.构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应。完成构造函数的调用。
6.构造方法分为两种:无参构造方法 有参构造方法;构造方法可以被重载。没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。
7.构造代码块和构造函数的区别:
构造代码块是给所有不同对象的共性进行统一初始化,构造函数是给对应的对象进行初始化
8.子类继承父类,子类的实例化过程:
构造方法不能被子类继承,子类创建对象时,会先去创建父类的对象。默认是去调用父类的无参构造方法。子类构造方法中,第一行默认是super();为什么子类中第一行会默认有super()因为他继承父类的成员使用,使用前这些成员必须初始化,而他们是父类的成员,所以,必须通过父类进行初始化。所以,会先创建一个父类的对象。
9.当父类没有无参构造方法时
必须使用this或者super调用其他的构造方法。
10.自定义类中,如果不写构造方法,java系统会默认添加一个无参的构造方法。如果写了一个有参的构造方法,此时不会添加无参构造方法,如果需要使用无参构造方法,必须手动添加。
对象实例化
对象实例化的过程:类名称 对象名称 = new 类名称();
当前格式的组成分析:
·类名称:定义要使用的数据类型,确定了对象可以调用的方法或属性范围;
·对象名称:栈内存的唯一标识,利用其找对应的堆内存地址;
·new:开辟新的堆内存关键字;
·类名称():有()的都称为方法,调用的就是类中的构造方法。
子类对象实例化
当存在有继承关系后,对于类的结构就有两种形式:父类和子类,子类对象在进行对象实例化的时候都要默认去调用父类中的无参构造方法。
通过代码执行后发现父类的无参构造方法会优先于子类的无参构造进行调用,之所以会这样调用原因很好理解,构造方法的主要目的是进行类中的属性初始化,子类会继承父类的内容,所以必须保证相应的父类属性应该进行初始化处理。严格来讲,此时的子类构造方法首行会默认隐含一个“super()”的语法形式。
如果父类没有无参构造,编译时会出错,此时只能为父类追加无参构造,或者子类手工调用有参构造。
调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)。
匿名对象
有了构造方法之后最大的方便在于避免了重复的setter调用,实际上有些时候就可以利用匿名对象来进行操作,匿名对象指的是只开辟堆内存空间,但是没有任何栈内存指向的对象内容。
new Ball("篮球",20).play();