踩雷构造方法
构造方法的作用是给类中的变量进行初始化赋值,不是用来创建对象的
有有参情况下去使用无参去创建对象的时候就会报错
写有参数的构造方法时候就最好加上无参构造
构造方法里面局部变量名字与实例变量一样情况下要写this防止Java就近原则
这是详细代码,不想看详细的直接跳到最后
public class Student {
int age;
String name;
public static void main(String[] args) {
//调用构造方法,对类进行初始化
Student s=new Student(666, "张三");
/*
new一个对象的时候要用到构造函数,
有两种方式:
第一种无参构造:Student s=new Student();这里使用的是Student的无参数构造方法,
第二种无参构造:Student s=new Student(666, "张三");这个是使用Student有参数构造方法,
判断无参有参就是看小括号内有没有传入实际参数
java规定在不写构造方法情况下,默认使用一个无参数的构造方法,
有有参就使用有参,没有就使用默认的无参
注意:
在有有参情况下去使用无参去创建对象的时候就会报错
综上所述:写有参数的构造方法时候就最好加上无参构造
*/
System.out.println(s);
}
public Student(int a,String n){//构造方法,构造方法与类同名
age=a;
name=n;
/*
或者age=a;与name=n;写为this.age=a; this.name=n
只要构造方法里面形参名字与上面实例变量名字不一样就可以不写this
如果名字一样就必须写this,因为this就是来区分是成员变量还是局部变量
Java有就近原则,如果名字一样,不写this就会传递给较近的变量
比如局部变量名字与实例变量一样却不写this,
public Student(int age,String name){//这里局部变量age与name
age=age;
name=name;
//右边的变量age与name就是上面局部传递过来的
//本来正常情况下局部传递过来的变量赋值给左边的age与name,左边的age与name再传递给最上面的实例变量age与name
//但是因为Java就近原则,此时上面局部传递过来的变量age与name赋值给了左边的age与name,左边的age与name又传递给上面局部的age与name
//所以在局部变量名字与实例变量一样情况下要写this防止Java就近原则
*/
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
}
/*
注意:构造方法不是用来创建对象的
实际上,在构造方法执行之前,类的内存空间已经开辟完成了,意思就是说对象已经创建了,
这步是由new关键字来完成的,
而构造方法的作用是给类中的变量进行初始化赋值
假设,假设构造方法是用来创建对象用的,就无法解释抽象类中为什么允许构造方法的存在,
抽象类无法实例化,不能被创建,但是抽象类中允许构造方法的存在
所以:构造方法是给类中的变量进行初始化赋值
*/
注意:不重写toString那打印输出的是内存地址
重写toString或者直接生成toString
这里采用eclipse自动生成
运行结果
踩雷代码
public class Student {
int age;
String name;
public static void main(String[] args) {
Student s=new Student(666, "张三");
System.out.println(s);
}
public Student(int a,String n){
age=a;
name=n;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
}