26_构造方法
构造方法的概念和使用
-
Person p = new Person(); // 声明Person类型的引用指向Person类型的对象。
-
p.show(); // 拿着引用变量 p 去调用名字为show的成员方法。
-
// 构造方法没有返回值类型,方法名与类名相同 class 类名 { 类名(形参列表) { 构造方法体; } } class Person { Person() { - Person 类的构造方法 } }
-
构造方法名与类名完全相同并且没有返回值类型,连void都不许有。
-
/* 编程实现Person类定义 */ public class Person { String name; // 用于描述姓名的成员变量 int age; // 用于描述年龄的成员变量 // 自定义构造方法 确实会调用 Person() { System.out.println("我就是自定义的构造方法!"); } // 自定义成员方法实现所有特征的打印 void show() { System.out.println("我是" + name +",今年" + age + "岁了!"); } public static void main(String[] args) { // 1、声明一个Person类型的引用指向Person类型的对象 // 当类中没有提供构造方法时,则下面调用默认构造方法,若类中提供构造方法后,则下面调用类中提供的版本 Person p1 = new Person(); // 并打印特征 p1.show(); // null 0 } } // 运行结果--------------------------------- 我就是自定义的构造方法! 我是null,今年0岁了!
默认构造方法
- 当一个类中没有定义任何构造方法时,编译器会自动添加一个无参空构造构造方法,叫做默认构造方法,如:Person(){}。无参是小括号中没有参数列表,空构造是指构造器里的方法体内没有方法体。
- 若类中出现了构造方法,则编译器不再提供任何形式的构造方法。
- 我们使用编译器提供的默认构造方法构造出来的对象,这个对象的成员变量只能是默认值。如果我们在构造对象的同时给这个对象指定值,这个时候编译器提供的默认方法就不足以满足我们的需求了,这时候就得我们自己去写默认方法了。
构造方法的作用
-
使用new关键字创建对象时,会自动调用构造方法实现成员变量初始化工作。
-
如果类中自定义了一个带参的构造方法,而没有自定义一个无参构造方法时,代码中有:Person p3 = new Person(); ==此时会编译报错,因为当类中自定义了构造方法后,编译器就不再提供任何构造方法。==意味着无参构造方法编译器就不提供了,类中没有,代码中需要无参构造,而类中没有,所以就出错了。 错误:无法将类 Person中的构造器 Person应用到给定类型; 解决方案:再自定义一个无参构造方法即可。Person(){}
-
注意:我们写了,编译器就不再提供构造方法了,如果我们需要,就自定义多个构造方法
-
/* 编程实现Person类定义 */ public class Person { String name; // 用于描述姓名的成员变量 int age; // 用于描述年龄的成员变量 // 自定义构造方法 确实会调用 Person() { // 这样写的时候,创建出来的所有Person对象就是同一个人了 // System.out.println("我就是自定义的构造方法!"); name = "张飞"; age = 30; } // 相当于 String s = "张飞" int i = 30 // String s = "马超" int i = 45 Person(String s, int i) { name = s; age = i; } // 自定义成员方法实现所有特征的打印 void show() { System.out.println("我是" + name +",今年" + age + "岁了!"); } public static void main(String[] args) { // 1、声明一个Person类型的引用指向Person类型的对象 // 当类中没有提供构造方法时,则下面调用默认构造方法,若类中提供构造方法后,则下面调用类中提供的版本 Person p1 = new Person(); // 并打印特征 p1.show(); // null 0 张飞 30 Person p2 = new Person("张飞", 30); // 实参就是为了给形参初始化的 实参传的是什么,形参的值就是什么 p2.show(); // 张飞 30 Person p3 = new Person("马超", 45); p3.show(); // 马超 45 } }
案例:Point 类的自定义
-
编程实现Point 类的定义并向 Point类添加构造方法
- Point() 默认创建原点对象
- Point(int i, int j) 根据参数创建点对象
/* 编程实现Point类的定义并向Point类添加构造方法 */ public class Point { int x; // 用于描述横轴坐标的成员变量 int y; // 用于描述纵轴坐标的成员变量 // 自定义无参构造方法 Point() { // System.out.println("这是一个原点对象"); } // 自定义一个有参构造方法 Point(int i, int j) { x = i; y = j; } // 自定义成员方法实现特征的打印 void show() { System.out.println("横坐标是:" + x + ",纵坐标是:" + y); } public static void main(String[] args) { // 1、实现无参方式构造对象并打印特征 Point p1 = new Point(); p1.show(); // 0 0 // 2、实现有参方式构造对象并打印特征 Point p2 = new Point(3, 5); p2.show(); // 3 5 } } // 执行结果--------------------------- 横坐标是:0,纵坐标是:0 横坐标是:3,纵坐标是:5