Java(14)构造方法
构造方法 (构造器constructor)
功能:初始化实例
1、使用方法
-
构造方法的名称就是类名,且修饰符跟类一致
-
构造方法的参数没有限制,在方法内部,可以编写任意语句
-
和普通方法相比,构造方法没有返回值,也没有void关键字
-
调用构造方法,必须使用new操作符
public class HelloG { public static void main(String[] args) { Person a=new Person("Jimmy",21); //静态方法不能访问非静态内部类 System.out.println(a.name); System.out.println(a.age); } public static class Person{ //这里一定要加static非访问修饰符 private String name; private int age; public Person(String name,int age){ this.name=name; this.age=age; } } } //=========================将Person类改为外部类================================== public class HelloG { public static void main(String[] args) { Person a = new Person("Jimmy", 21); System.out.println(a.GetName()); System.out.println(a.GetAge()); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String GetName(){ return this.name; } public int GetAge(){ return this.age; } }
2、默认构造方法
默认构造方法没有参数,也没有执行语句, 如果一个类没有定义构造方法,编译器会自动为我们生成一个默认构造方法。
默认构造方法如下:
public class HelloA {
public HelloA(){}
}
如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法
public class HelloG {
public static void main(String[] args) {
Person a=new Person(); //会编译错误
System.out.println(a.name);
System.out.println(a.age);
}
}
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
}
如果既要能使用带参数的构造方法,又想保留不带参数的构造方法,那么只能把两个构造方法都定义出来:
public class HelloG {
public static void main(String[] args) {
Person a=new Person(); //不会编译错误
System.out.println(a.name);
System.out.println(a.age);
}
}
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public Person() {
}
}
3、未初始化字段默认值
没有在构造方法中初始化字段时,引用类型的字段默认是null
,数值类型的字段用默认值(可回看八大基本类型),int
类型默认值是0
,布尔类型默认值是false
:
public class HelloG {
public static void main(String[] args) {
Person a=new Person(); //会编译错误
System.out.println(a.GetName());
System.out.println(a.GetAge());
System.out.println(a.GetSex());
}
}
class Person{ //这里一定要加static非访问修饰符
private String name;
private int age;
private boolean Sex;
public Person() {
}
public String GetName(){
return this.name;
}
public int GetAge(){
return this.age;
}
public boolean GetSex(){
return this.Sex;
}
}
/*结果为:
null
0
false
*/
4、字段初始化顺序
如果创建字段的时候就初始化了,而且构造方法再初始化一遍,所以最终的值由构造方法的代码确定
public class HelloB {
public static void main(String[] args) {
PersonB b=new PersonB(21,"Krystal");
System.out.println(b.GetName());
System.out.println(b.GetAge());
}
}
class PersonB{
private int age=21;
private String name="Jimmy";
public PersonB(int age,String name){
this.age=age;
this.name=name;
}
public int GetAge(){
return this.age;
}
public String GetName(){
return this.name;
}
}
5、多个构造方法(构造器的重载)
构造方法既然是个方法,则表明可以进行重载,编译器通过参数数量、位置和类型自动区分构造方法
public class HelloB {
public static void main(String[] args) {
PersonB b=new PersonB(18);
System.out.println(b.GetName());
System.out.println(b.GetAge());
}
}
class PersonB{
private int age=21;
private String name="Jimmy";
//构造方法1
public PersonB(int age,String name){
this.age=age;
this.name=name;
}
//构造方法2
public PersonB(int age){
this.age=age;
this.name="Jimmy";
}
//构造方法3
public PersonB(){
}
public int GetAge(){
return this.age;
}
public String GetName(){
return this.name;
}
}
/*
输出结果为:
Jimmy
18
*/
6、构造方法调用构造方法
一个构造方法可以调用其他构造方法,这样 做的目的是便于代码复用。调用其他构造方法的语法是this(…)
:
package test;
public class TestOne {
private String name;
private int sizeA;
public TestOne(String name, int sizeA) {
this.name = name;
this.sizeA = sizeA;
}
public TestOne(String name) {
this(name, 18);
}
public TestOne() {
this("krystal", 18);
}
public String getName(){
return this.name;
}
public int getSizeA(){
return this.sizeA;
}
}
class TestA {
public static void main(String[] args) {
TestOne a=new TestOne();
System.out.println(a.getName()+" "+a.getSizeA());
}
}
//运行结果为:krystal 18