构造方法
- 普通方法
- 语法结构
[修饰符列表] 返回值类型 方法名(形式参数列表) {
方法体;
} - 调用
- 修饰符中有
static
类名.方法名(实参列表) - 修饰符中没有
static
先创建对象
引用.方法名(实参列表)
- 修饰符中有
- 语法结构
- 构造方法
- 语法结构
[修饰符列表] 构造方法名(形式参数列表) {
构造方法体;
} - 调用
new
构造方法名 (实参列表)
- 语法结构
注意:
构造方法【返回值类型】不需要指定,并且也不能写void
,只要写上void
,那么这个方法就成为普通方法了
构造方法都有【返回值】,但是return值;
这样的语句不需要写。构造方法执行结束后自动返回构造方法所在类的类型的返回值。
构造方法的【方法名】必须和类名保持一致
无参构造器是在创建对象之后给里面的实例变量赋默认值
有参构造器是在创建对象之后直接就给里面的实例变量赋具体值
public class Test{
public static void main(String[] args){
//调用无参构造
User u1 = new User();
System.out.println(u1.getAge()); //0
//调用有参构造
User u2 = new User(22);
System.out.println(u2.getAge()); //22
}
}
class User{
private int age;
//无参构造器
public User(){
}
//有参构造器
public User(int a){
age = a;
}
//set、get方法
public void setAge(int a){
age = a;
}
public int getAge(){
return age;
}
}
若没有定义任何构造方法,系统默认给一个无参数的构造方法,这个构造方法被称为缺省构造器、无参构造器。若定义了构造方法,系统就不再提供无参构造器。所以无论需不需要,最好都手动添加无参构造器
public class Test{
public static void main(String[] args){
//调用无参构造。报错!!
User u1 = new User();
}
}
class User{
private int age;
//有参构造器
public User(int a){
age = a;
}
}
构造方法的作用:
- 创建对象
- 给对象中的实例变量赋值
- 无参构造器赋默认值
- 有参构造器赋具体值
当有参构造器只给其中一个实例变量赋具体值时,此时会给其他剩余实例变量赋默认值
只要构造方法被调用,就会在堆内存中创建对象。所以以下代码会在堆内存中创建2个对象
public class Test{
public static void main(String[] args){
Person p = new Person();
System.out.println(p.getAge); //0
System.out.println(p.getName); //null
System.out.println(p.getSex); //false
Person p1 = new Person(22);
System.out.println(p.getAge); //22
System.out.println(p.getName); //null
System.out.println(p.getSex); //false
}
}
class Person{
private int age;
private String name;
private boolean sex;
//无参构造器
public Person(){}
//有参构造器
public Person(int a ){
age = a;
}
//set、get方法
public void setAge(int a){
age = a;
}
public int getAge(){
return age;
}
public void setName(String a){
name = a;
}
public int getName(){
return name;
}
public void setSex(boolean a){
sex = a;
}
public int getSex(){
return sex;
}
}
参数传递
试想以下代码的执行结果
public class Tset{
public static void main(String[] args){
//创建对象
User u = new User(22);
add(u);
System.out.println("main中" + u.age); //23
}
public static void add(User u){
u.age ++;
System.out.println("add中" + u.age); //23
}
}
class User{
int age;
public User(){}
public User(int a){
age = a;
}
}
执行结果:
内存图显示如下
结论:
涉及到参数的传递,传递的都是保存的值
int i= 10; int j = i ;传递的是 10 这个字面值
User u = new User(); User p = u ;实际传递的是保存对象的内存地址 0x1234,指向同一个对象