0%

Java笔记——类与对象(三)

简单记录一下Java的部分构造方法(〃′o`)。

构造方法的特点

Java中的构造方法,也被称作构造函数,可分为无参构造方法和有参构造方法,一般用来初始化成员属性和成员方法。当对象被实例化后,构造方法就给对象初始化,且一个对象被实例化后,构造方法只被调用一次,而一般的方法可被该对象多次调用。

  • 构造方法名与类名相同;
  • 构造方法不需要定义返回值类型,也不能包含有return语句;
  • 一般方法不能调用构造方法,只有构造方法才能调用构造方法;
  • 类中必有构造方法,若源文件中没有指定任何构造函数,Java编译器提供一个无参构造方法;
  • 构造方法不能被staticfinalsynchronizedabstractnative修饰;
  • 构造方法可以被重载;
  • 构造方法在初始化对象时自动执行,一般不能直接调用;
  • 当同一个类中存在多种构造方法时,编译器自动根据参数列表一一对应来调用构造方法。

举个栗子

类中只定义一个无参构造方法;构造方法总伴随着对象的实例化一起被调用。

class Person
{
Person() //定义无参构造方法
{
System.out.println("Hello,world!");
}
}
public class Person0
{
public static void main(String[] args)
{
Person P=new Person(); //实例化对象时,就会调用对应的构造方法Person()并执行其中的语句
}
}
Hello,world!

有参构造方法,在实例化对象时,将实参传递给成员变量。

class Person
{
String name;
int age;
Person(String x,int y) //定义有参构造方法,给成员变量传递参数值,然后直接输出
{
name=x;
age=y;
System.out.println("name: "+name);
System.out.println("age: "+age);
}
}
public class Person1
{
public static void main(String[] args)
{
Person P=new Person("NIMITIZ",18); //实例化对象时,直接调用有参构造方法并传递实参,同时执行其中的语句
}
}
name: NIMITIZ
age: 18

一个对象建立后,构造方法只被调用一次;如果需要给对象再赋新值,就需要使用setget方法。

class Person
{
String name;
int age;
Person(String x,int y)
{
name=x;
age=y;
System.out.println("name: "+name);
System.out.println("age: "+age);
}
public void setName(String m) //set方法,用于再次给name赋值
{
name=m;
}
public String getName() //get方法,用于获取name的赋值
{
return name;
}
}
public class Person2
{
public static void main(String[] args)
{
Person P=new Person("NIMITIZ",18);
P.setName("NIMITIZ_FBH"); //调用set方法
System.out.println(P.getName()); //调用get方法并输出赋值
P.setName("FBH_NIMITIZ"); //可多次调用
System.out.println(P.getName()); //可多次调用
}
}
name: NIMITIZ
age: 18
NIMITIZ_FBH
FBH_NIMITIZ

构造方法也是方法的一种,也具备方法的重载特性。

class Person
{
String name;
int age;
Person()
{
System.out.println("A: name: "+name);
System.out.println(" age: "+age);
}
Person(String name,int age)
{
System.out.println("B: name: "+name);
System.out.println(" age: "+age);
}
Person(int age,String name)
{
System.out.println("C: age: "+age);
System.out.println(" name: "+name);
}
}
public class Person3
{
public static void main(String[] args) //不能都实例化为同一对象
{
Person P1=new Person();
Person P2=new Person("NIMITIZ",18);
Person P3=new Person(18,"NIMITIZ");
}
}
A:  name: null
age: 0
B: name: NIMITIZ
age: 18
C: age: 18
name: NIMITIZ

子类不会继承父类的构造方法,只是必须显式或隐式地调用。

//隐式调用
class Person0
{
Person0()
{
System.out.println("NIMITIZ");
}
Person0(int age)
{
System.out.println(age);
}
}
class Person1 extends Person0
{
public Person1()
{}
public Person1(int x) //①
{
//super(); 执行 System.out.println(18); 时优先调用父类的无参构造方法super()
System.out.println(18);
}
}
public class Person4
{
public static void main(String[] args)
{
Person1 P1=new Person1(19); //调用①
}
}
NIMITIZ
18
//显式调用
class Person0
{
Person0()
{
System.out.println("NIMITIZ");
}
Person0(int age)
{
System.out.println(age);
}
}
class Person1 extends Person0
{
public Person1()
{}
public Person1(int x)
{
super(19); //显式调用父类的有参构造方法后,不再默认调用无参构造方法
System.out.println(18);
}
}
public class Person4
{
public static void main(String[] args)
{
Person1 P1=new Person1(19);
}
}
19
18
  • 如果父类没有无参构造方法,创建子类时必须在子类有参构造方法的第一行显式调用父类的有参构造方法;
  • 如果父类没有有参构造方法,那么在创建子类时可以不显式调用父类的构造方法,这时会默认调用父类的无参构造方法super()

Java构造方法与一般方法的区别

构造方法 一般方法
构造方法用于初始化对象的成员属性和成员方法 一般方法用于表示对象的行为
构造方法不能拥有返回类型 一般方法一般拥有返回类型
构造方法隐式调用 一般方法显式调用
如果没有指定任何构造方法,Java编译器提供一个无参构造方法 在任何情况下Java编译器都不提供默认的一般方法调用
构造方法名必须与类名相同 一般方法名可以不与类名相同

整理自

JAVA构造函数(方法)

Java中的构造方法

java学习—构造器(构造方法)

java中继承,子类是否继承父类的构造函数