Java II
Instance Variables
Visibility Modifiers (public and private)
public class Insect{
//instance variables
private double weight;
private int x;
private int y;
//test method
public static void main(String[] args){
Insect buzz1=new Insect();
Insect buzz2=new Insect();
}
}
the default constructor 默认构造函数
writing constructor:
Note that the constructor name must match the class name, and it cannot have a return type (like void
).
构造方法是一种特殊的方法,具有以下特点。
(1)构造方法的方法名必须与类名相同。
(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
如果类中没有构造函数,编译器会自动创建一个默认构造函数。
java中的构造方法是一种特殊类型的方法,用于初始化对象。Java构造函数在对象创建时被调用。 它构造值,即提供对象的数据,这是为什么它被称为构造函数
//constructor
//create a Main class
public class Main1{
int x; //create a class attribute.
//create a class constructor for the Main class
public Main1(){
x=5; //set the initial value for the class attribute
}
public static void main(String[] args){
Main1 myObj=new Main1();
//the above create an object of class Main(this will call the constructor)
System.out.println(myObj.x);
}
}
Java构造函数有两种:default constructor 和parameterized constructor
没有参数的构造函数称为默认构造函数default constructor.
//创建一个无参数no-args的构造函数
public class Bike1{
Bike1(){ //创建了无参数的构造函数 //记得加上() 构造函数是函数
System.out.println("Bike is created");
}
public static void main(String[] args){
Bike1 b=new Bike1(); //这里创建对象时就会调用构造函数 所以结果打印出了Bike is created
}
}
default constructor默认构造函数:
//如果类中没有构造函数,则编译器会自动创建一个默认构造函数
class Student3{
int id;
String name;
void display(){
System.out.println(id+" "+name);
}
public static void main(String[] args){
Student3 s1=new Student3();
Student3 s2=new Student3();
s1.display();
s2.display();
}
}
//运行结果为0 null 虽然代码没有创建构造函数 但是编译器自动提供了一个默认构造函数。String默认值为null,int默认值为0
解释: 在上面的类中,代码中并没有创建任何构造函数,但编译器自动提供了一个默认构造函数。默认构造函数分别为字段:id
和 name
分别提供了0
和null
值。
//构造一个class 叫做student3
//给student3这个类初始化int id和String name
//student3类中构造一个method 叫做display。display没有返回值,display要打印出id 和name
//调用main函数,给student3这个类创建两个对象 s1和s2
//s1和s2调用display方法,这时候会调用构造函数。虽然代码中没有构造函数,但是编译器自动提供了一个默认构造函数default constructor.由于没有给id和name赋值,输出的结果是int和string的默认值0和null。
class Student3{
int id;
String name;
void display(){
System.out.println(id+" "+name);
}
public static void main(String[] args){
Student3 s1=new Student3();
Student3 s2=new Student3();
s1.display();
s2.display();
}
}
构造函数可以看这个链接 解释得够多了
参数化构造函数
具有参数的构造函数称为参数化构造函数。
问题: 为什么使用参数化构造函数?
回答: 参数化构造函数用于为不同对象提供不同初始化的值。
//有参数的构造函数,叫做参数化构造函数
//为什么要有参数 是为了给不同的对象提供不同的初始化值
//先构造一个Student4的类
//Student4类有变量int id和String name
//新建构造函数Student4,有参数int i和string n。将i和n赋值给id和name
//新建display函数,打印出id和name
//调用main函数,新建两个实例s1和s2,s1和s2带有不同的参数。
//s1和s2调用display函数,那么打印出来的也是不同的id和name
class Student4{
int id;
String name;
Student4(int i,String n){
id=i; //也就是说,后面要将1033赋值给id,Jay赋值给name
name=n;
}
void display(){ //display函数 记得加上()
System.out.println(id+" "+name);
}
public static void main(String[] args){
Student4 s1=new Student4(1033,"Jay");
//这里实例对象带参数了,所以前面需要带参数的构造函数。这样每个实例对象都有不同的初始化变量值
Student4 s2=new Student4(1301,"Peter");
s1.display();
s2.display();
}
}
问题:构造函数有返回值 ?
回答: 是的,构造函数返回当前类的实例(不能指定返回值类型,但它会返回一个值)。
问题2: 可以构造函数执行其他任务而不是初始化?
回答: 是的,比如:对象创建,启动线程,调用方法等。你可以像在方法中执行的任何操作一样,在构造函数中也可以做到这些。
构造函数可以重载overloading,但不能被重写。
带参数的构造函数:
//新建insect class
//instance varible X Y和Weight
//新建构造函数,包含参数initX initY和initWeight
//调用main函数,创建两个不含参数的对象bug1 bug2(会报错),和两个含参数的对象buzz1,buzz2
public class Insect2{
int X;
int Y;
double Weight;
public Insect2(int initX,int initY,double initWeight){
X=initX;
Y=initY;
Weight=ini