2. 【重要】关于方法参数传递的总结:对于Java中的方法参数传递,无论传递的是原生数据类型还是引用类型,统一是传值(pass by value)。
public class ParamTest
{
public static void main(String[] args)
{
Person person = new Person();
person.change(person);
int age = person.age;
System.out.println(age);
System.out.println("--------------------------");
int i = 10;
person.change2(i);
System.out.println(i);
}
}
class Person
{
int age = 20;
public void change(Person person)
{
person = new Person();
person.age = 30;
}
public void change2(int age)
{
age = 40;
}
}
输出结果:
D:\src>java ParamTest
20
--------------------------
10
【原因如下】:int i = 10;然后调用change2方法,此时将i = 10实际参数传给形式参数age,因为是原生数据类型传递,所以传递的是值,当把i = 10赋值给age之后,i还是i,i = 10没有变化,即赋完值之后你是你的,我是我的,两者之间没有存在关系。然后方法change2中对age把值改为40,此时对i也是没有任何影响,这与引用不同的是,引用传递的是值的地址,引用是对象地址的表示形式,可以说引用当中存放的是对象的地址,当进行person.change(person);时候,是把person传给change中去了,引用的值一样,说明他们指向同一个地址,所以修改其地址内容都会放映到其他引用的对象中去了。
3. 什么类型的引用就能指向什么类型的对象,比如People类型的引用就能指向People类型的对象,但不能指向Student类型的对象。比如:
People people = new People(); // 正确
People people = new Student(); //错误
4. 构造方法(Constructor):构造方法用于完成对象属性的初始化工作,构造方法的特点:
a) 构造方法的名字必须与类名完全一致(包含大小写)
b) 构造方法没有返回值,连void也不能出现。
c) 如果在定义一个类的时候,没有为类声明构造方法,那么Java编译器会自动为类添加一个没有参数且方法体为空的构造方法(默认的构造方法)
d) 如果在定义一个类的时候,为类声明了构造方法,那么Java编译器就不会再为类添加构造方法了。
e) 不能显式调用类的构造方法,构造方法通常是通过new关键字隐式调用。(还有可能是通过反射的方式调用的)
5. new关键字在生成对象时完成了三件事情(而且是按顺序来的):
a) 为对象开辟内存空间。
b) 调用类的构造方法。
c) 将生成的对象的地址返回。(返回给生成这个对象的引用,这样这个引用就指向这个对象了)如:Person person = new Person();
6. 默认的构造方法:构造方法没有参数且方法体为空。
7. 使用new来生成对象的时候,后面的小括号()表示构造方法的参数列表,如果构造方法不接收参数,那么小括号中的内容为空;如果构造方法接收参数,那么小括号中的实际参数就需要与构造方法定义中的形式参数保持一致(参数数量一致、参数类型一致、按照顺序逐一赋值)。
public class PersonTest
{
public static void main(String[] args)
{
Person person = new Person();
System.out.println(person.age);
}
}
class Person
{
int age;
public Person(int i)
{
age = i;
}
}
执行结果出现错误:
D:\src>javac PersonTest.java
PersonTest.java:5: 错误: 无法将类 Person中的构造器 Person应用到给定类型;
Person person = new Person();
^
需要: int
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
1 个错误
【原因如下】:根据上诉第五个知识点,new关键字生成对象时完成的事件顺序,可知程序在执行Person person = new Person();时,由于程序中已经定义了一个带整型参数的构造函数,所以系统将不再生成构造函数,但是程序new Person()没有带参数,此时产生矛盾,故程序运行提示错误,修改程序将Person person = new Person();改为带整型参数的Person person = new Person(50);写法时候,则程序通过编译。
修改程序如下:
public class PersonTest
{
public static void main(String[] args)
{
Person person = new Person(50);
System.out.println(person.age);
}
}
class Person
{
int age;
public Person(int i)
{
age = i;
}
}
执行结果:
D:\src>java PersonTest
50