构造方法
构造方法
啥是构造? 为什么要有构造方法?
上节课我们写了一辆车. 车的颜色. 排量等信息都是创建完车之后. 再给车设置的. 但是大家想想, 这些车的信息在出厂的时候应该就已经是设置好的了. 不应该在外面进行一个一个的设置. 所以, 在车辆在出厂的时候. 可以给车设置好一些属性信息. 这就是构造. 构造的意义就是可以帮我们在创建对象的时候给对象传递一些信息.
构造方法的语法:
public 类名(参数….){
}
注意: 构造方法的名字必须和类名一致.
public class Car { public Car() { System.out.println("构造方法"); } public static void main(String[] args){ Car p = new Car(); } }
构造能干嘛?
public class Car { String name; String color; int seat; public Car(String name, String color, int seat) { this.name = name; this.color = color; this.seat = seat; System.out.println("构造了一辆车"); } public static void main(String[] args) { Car p = new Car("大黄蜂", "绿色", 5); System.out.println(p.name + p.color + p.seat); } }
总结: 构造方法存在的意义就是在对象在创建的时候给对象设置一些属性.
注意: 每个类都会有构造方法. 如果不写, java会自动赠送一个免费的没有参数的构造方法.
但是, 如果你自己写了构造方法了. 系统就不送了.
构造方法的重载
想这么一个事儿, 我们可以在创建对象的时候给对象传递一些信息, 通常都是在构造方法里设置一些属性. 那如果现在我写一个”大侠”类, 里面会有很多个属性,
public class DaXia{
String name;
String waihao;
int age;
String bangPai;
}
好了, 接下来我们去创建大侠, 比如, 创建一个"岳不群", 那在创建岳不群的时候, 需要给出: 名字, 年龄, 帮派.
外号和口头禅对于岳不群而言都不需要. 那如果是创建一个武松呢? 需要给出: 名字, 年龄, 帮派,外号. 这就会产生一个分歧. 有些大侠有外号, 有些大侠没有外号. 对吧. 并且, 我们知道在创建对象的时候. 我们是默认调用构造方法的. 那就需要我们写两个构造方法来满足两种不同的大侠. 但是构造方法的名字还必须是类名. 也就意味着, 我们要写两个名字相同的方法. 咱们在上一章里学过, 方法的名字相同参数的个数或者类型不同, 叫方法的重载. 没错, 这里需要我们重载构造方法.
public class DaXia { String name; int age; String bangPai; String nickname; public DaXia(String name, int age, String bangPai) { this.name = name; this.age = age; this.bangPai = bangPai; } public DaXia(String name, int age, String bangPai, String nickname) { this.name = name; this.age = age; this.bangPai = bangPai; this.nickname = nickname; } }
聪明的你应该又发现一个问题. 两个构造方法的写法太像了. 能不能简化一下呢? OK. 没问题. 我们还可以使用this来调用当前类中的其他构造方法
public class DaXia { String name; int age; String bangPai; String nickname; public DaXia(String name, int age, String bangPai) { this.name = name; this.age = age; this.bangPai = bangPai; } public DaXia(String name, int age, String bangPai, String nickname) { this(name, age, bangPai); this.nickname = nickname; System.out.println(this.name + this.age + this.bangPai + this.nickname); } public static void main(String[] args) { DaXia p = new DaXia("乔峰", 23, "少林", "乔帮主"); } }
this的两个作用:
表示当前类的对象, 可以访问成员变量和成员方法
可以调用当前类中的其他构造方法
static
static表示静态. 被static修饰的变量会被所有的对象共享, 并且, 在内存里只会保留一份.
public class Person { String name; String address; static String country = "大清"; public Person(String name, String address) { this.name = name; this.address = address; } public static void main(String[] args) { Person p1 = new Person("张麻子", "北京四合院"); Person p2 = new Person("黛西", "北京大裤衩"); Person.country = "民国"; System.out.println(p1.country); System.out.println(p2.country); } }
小总结:
静态变量并不属于对象, 它属于类. 并且在内存中是共享的. 所有对象都可以访问和使用静态变量.
那如果用static来修饰方法呢? 其实是一样的. 我们用类名去访问静态变量, 同样, 我们也使用类名去访问静态方法.
public class Person{ public static void huo(){ System.out.println("是人都想火"); } public static void main(String[] args){ huo(); // 由于是自己类. 可以直接访问静态方法 Person.huo();// 最好呢, 还是用类名去访问. } } 类中内容的加载顺序(简单): public class Person{ { System.out.println("我是通用构造器"); } static { System.out.println("我是静态构造器"); } public Person(){ System.out.println("我是构造方法"); } public static void main(String[] args){ new Person(); } }
在创建对象的时候, 首先加载的是静态的内容, 然后才是非静态内容.
这也就导致一个问题. 静态内容在创建的时候, 还没有对象产生, 所以:
在静态方法里, 不能使用this.
也不能直接调用自己类中的其他成员(方法, 变量). 但是反过来是可以的.
重点: 静态的东西不属于对象, 直接属于类, 优先于对象产生. 使用的时候使用类名去访问.