构造方法是一个比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化。换句话说,构造方法就是用来创建对象,同时给对象的属性赋值
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站建设、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的蚌山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!(PS:当实例变量没有被我们手动去赋值的时候,系统会给实例变量赋默认值)
2、构造方法的语法结构构造方法的语法结构
[修饰符列表] 构造方法名(形式参数列表){
构造方法体;
通常在构造方法体当中给属性赋值,完成属性的初始化
}
注意:
1、修饰符列表统一写:public
2、构造方法名和类名必须一致
3、构造方法不能写返回值的类型
对比普通方法的语法结构
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
怎么调用构造方法
使用new运算符来调用构造方法
语法格式:
new 构造方法名(实际参数列表);
重点(需要记忆):当一个类没有提供任何构造方法,系统会默认提供一个无参数的构造方法(而这个构造方法被称为缺省构造器) 。
public class ConstructorTest01{
public static void main(String[] args){
//创建Student类型的对象
Student s1 = new Student();
//输出“引用”
//只要输出结果不是null,说明这个对象一定是创建完成了
System.out.println(s1);
//调用Student类的无参数构造方法
new Student();//结果:无参数的构造方法执行了!
}
}
class Student{
//学号
int no;
//姓名
String name;
//年龄
int age;
//当Student这个类当中并没有定义任何构造方法
//但是我们创建对象的时候成功了,这里就是系统提供的缺省构造器
//将无参数的构造方法(缺省构造器)写出来
public Student(){
System.out.println("无参数的构造方法执行了!");
}
}
3、构造方法的重载我们都知道普通方法能够重载,那构造方法能够重载吗?
答案:能,并且和普通方法重载一样,可以创建多个构造方法,方法名相同,参数列表不同
具体请参照方法重载:(6条消息) Java方法重写与重载的区别_徐念安的博客-博客_请简述方法重写和方法重载的区别
当一个类当中手动的提供了构造方法,那么系统将不再提供无参数构造方法
(建议:将无参数构造方法手动写出来,这样一定不会出问题)
public class ConstructorTest01{
public static void main(String[] args){
//这里将会报错,因为在Student中我们手动的定义了一个带参数列表的构造方法
//所以缺省构造器已经没了,除非我们在Student当中再去手动的把无参构造方法定义出来
new Student();
}
}
class Student{
//学号
int no;
//姓名
String name;
//年龄
int age;
public Student(int i){
System.out.println("有参数的构造方法执行了!");
}
}
当我们手动的定义了无参构造方法和有参构造方法之后,无参构造方法和有参构造方法都可以调用
public class ConstructorTest01{
public static void main(String[] args){
new Student();//无参数的构造方法执行了!
new Studnet(100);//有参数的构造方法执行了!
new Studnet("zhangsan");//有参数的String构造方法执行了!
}
}
class Student{
//学号
int no;
//姓名
String name;
//年龄
int age;
public Student(){
System.out.println("无参数的构造方法执行了!");
}
public Student(int i){
System.out.println("有参数的构造方法执行了!");
}
public Student(String name){
System.out.println("有参数的String构造方法执行了!");
}
}
实例变量没有手动赋值的时候,实际上系统会默认赋值
那么这个默认赋值操作是在什么时间进行的?
是在类加载的时候给这些实例变量赋值吗?
不是,实例变量是在构造方法执行的过程中完成初始化的,完成赋值的
public class ConstructorTest01{
public static void main(String[] args){
Student student = new Student();
System.out.println(student.no);//输出结果30
System.out.println(student.name);//输出结果zhangsan
System.out.println(student.age);//输出结果10
//由于有参构造方法我们并没有对实例变量进行赋值
//所以在这里的输出依然是系统的默认值
Student student1 = new Student(1);
System.out.println(student1.no);//输出结果0
System.out.println(student1.name);//输出结果null
System.out.println(student1.age);//输出结果0
}
}
class Student{
//学号
int no;//默认值0
//姓名
String name;//默认值null
//年龄
int age;//默认值0
public Student(){
//这里手动赋值,将不再使用系统默认值
no = 30;
name = "zhangsan";
age = 10;
}
public Student(int i){
}
}
除此之外,我们还可以在调用构造方法创建对象的时候对实例变量进行赋值
public class ConstructorTest01{
public static void main(String[] args){
Student student = new Student();
System.out.println(student.no);//输出结果30
System.out.println(student.name);//输出结果zhangsan
System.out.println(student.age);//输出结果10
//由于该构造方法我们设置了参数列表,所以我们可以在创建对象的时候传值
//此处表示no = 20;name = lisi;age = 30;
Student student1 = new Student(20,lisi,30);
System.out.println(student1.no);//输出结果20
System.out.println(student1.name);//输出结果lisi
System.out.println(student1.age);//输出结果30
}
}
class Student{
//学号
int no;//默认值0
//姓名
String name;//默认值null
//年龄
int age;//默认值0
public Student(){
//这里手动赋值,将不再使用系统默认值
no = 30;
name = "zhangsan";
age = 10;
}
//这里使用传参的形式来赋值
public Student(int xueHao,String mingZi,int nianLing){
no = xueHao;
name = mingZi;
nianLing = age;
}
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧