/*
构造方法的特点:
A:方法名和类名相同。
B:没有返回值类型。连void也不行。
C:没有返回值。
格式:
修饰符 类名(形式参数...) {
}
注意事项:
A:如果一个类没有提供构造方法,那么系统将会自动给出一个无参构造方法。
public Person() {}
B:如果自己给定了构造方法,系统将不再给出构造方法。
那么,如果在这种情况下,我要使用无参构造方法,怎么办?
只能自己写一个无参构造方法。
推荐:建议无参构造方法永远自己给出。
给成员变量赋值的第二种方式:通过构造方法。
*/
class Person {
//姓名
private String name;
//年龄
private int age;
public Person(){
System.out.println("自己给定了构造方法");
}
//带参构造方法
public Person(String n) {
//System.out.println(n);
name = n;
}
//带两个参数的构造
public Person(String n,int a) {
name = n;
age = a;
}
//如果一个方法是类名,但是却有返回值类型,不管是否是void类型。都不再是一个构造方法。
public void Person(int a) {
System.out.println(a);
}
public void show() {
System.out.println(name+"***"+age);
}
}
class PersonTest2 {
public static void main(String[] args) {
//创建对象
Person p = new Person();
p.show();
//通过带参构造方法创建对象
Person p2 = new Person("降低房价");
p2.show();
//通过两个带参构造方法创建对象
Person p3 = new Person("找个对象",20);
p3.show();
//通过带一个int类型的变量来造一个对象
//Person p4 = new Person(30);
//p4.show();
}
}
//附上特殊用法示例:
/*
子父间的构造方法关系:
在执行子类的构造方法前,会先执行父类的构造方法。
注意:
A:在子类的构造方法中,默认第一条语句是super()。
B:在构造方法中,this()和super()这种用法只会有一个存在。
并且都应该是在第一条语句。
super():放第一,是因为子类要访问父类的数据,所以父亲必须先被初始化。
this():放第一,是因为如果this()可以放后面,那么,我们对父亲的初始化就执行了多次。
面试题:
继承有没有把构造方法给继承过来?
构造方法是不被继承的。
在执行子类的构造方法的时候,有没有创建父类的对象?
没有。调用父类构造仅仅是对父亲进行了数据的初始化。
创建对象,一般都是通过new去申请空间的。
记住:任何类都直接或者间接的继承自Object类。
*/
class FatherTest {
public static void main(String[] args) {
Son son = new Son();
son.show();
}
}
class Father { // extends Object {
int num = 10;
public Father() {
super();
System.out.println("over father() method");
}
}
class Son extends Father {
//说明此处不是构造方法了
public Son(int a) {
System.out.println(a + " " + "Son(int a)");
}
public Son() {
// super();
this(10); // this就相当于Son 在谁的内部调用就是谁
this.show(); //"主动调用show方法",自己内部的方法当然自己可以调用
// super();
System.out.println(num);// 此处的num是来自于父类
System.out.println("son()");
}
public void show() {
System.out.println("chulai");
}
}