匿名对象
创建了三个匿名对象,且当语句执行完毕后,该匿名对象便会成为垃圾。
this可以代表当前调用方法的对象,per1.compareAge(per2),方法中的this.age等价于per1.age;
基本数据类型形参改变不能导致实参改变
引用传递的参数为对象地址,直接修改的堆内存中的对象
封装是面向对象的基本特征之一
构造函数:
构造函数的一些细节
直接在堆中创建对象,没有任何引用,调用方法完成后就会被垃圾回收器回收!
应用场景:当只需要调用类中一次方法时,可以使用匿名对象!
每new一个匿名对象,都会从新创建一个对象!
1
2
3
4
|
new
Person().run();
new
Person().setName(
"小明"
);
new
Person().getName();
|
this关键字
this表示当前对象,this关键字只能在方法内部使用,表示对“调用方法的哪个对象”的引用;
在构造器中调用构造器,可以使用this关键字;
例如调用无参构造器,可以在有参构造器中加入this();
练习:比较两个人的年龄是否相同
1
2
3
|
public
boolean
compareAge(Person person){
return
this
.age==person.age;
}
|
基本数据类型和引用数据类型参数传递过程
基本数据类型形式参数的改变不会影响实际参数,因为形式参数的作用域值局限于方法内部;
应用数据类型参数传递的是对象的地址,当修改对象的内容时,会导致实际引用对象的改变;
1
2
3
4
5
6
7
8
|
public
static
void
main(String[] args) {
int
number=
5
;
modifyParams(number);
System.out.println(number);
//syso.out输出为5,形参改变不能导致实参改变
}
public
static
void
modifyParams(
int
number){
number+=
5
;
}
|
引用数据类型示例
1
2
3
4
5
6
7
8
9
|
public
static
void
main(String[] args) {
Person per1=
new
Person();
per1.setAge(
18
);
modifyParam(per1);
System.out.println(per1.getAge());
//syso.out输出为20,引用传递的参数为对象地址,直接修改的堆内存中的对象
}
public
static
void
modifyParam(Person person){
person.setAge(
20
);
}
|
封装
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
常见的封装体:
函数就是一个封装体
类也是一个封装体
数组也是一个封装体
举例:
机箱
机箱就是对CPU、主板、风扇的封装,它隐藏了CPU、主板、风扇等细节,提供了一个电源作为公共访问方式。
封装的好处:
- 提高代码复用性,可以将重复率高的代码封装到一个方法中,需要用到就直接调用方法即可。
- 隐藏了实现细节,对外提供了公共访问方式,便于调用者的使用。
- 提高了安全性,使用private进行封装,只有本类中成员可以访问!
用private关键字修饰的变量叫做私有化变量,私有是封装的一种体现。
使用private修饰的字段,
必须有setter和getter方法作为公共的访问方式
面向对象有三大基本特征:
封装、继承、多态
使用构造函数初始化对象
一:对象通过new关键字分配内存空间,
默认初始化,并且字段被付默认值;
二:
构造函数初始化,传入到构造函数的实参修改对象中字段的初始化值;使用
this.字段代表当前对象的字段;
1
|
Person person=
new
Person(
"lisi"
);
|
创建对象时,为了使对象描叙更准确,需要对对象初始化。
构造函数可以对对象初始化。
初始化内容语句在方法体当中实现。
当类中不存在构造函数时,
new person()语句会自动调用类中
隐式的person(){};构造方法
当类中存在构造函数
person(int age,String name){};时,便
不存在隐式的person(){};构造方法,需要开发者自己提供person(){};无参构造方法
隐式的无参构造函数时编译器编译java文件为class文件时,编译器发现类中没有构造方法,
会自动添加隐式构造方法;
当类中已经存在了构造方法,编辑器就不会自动添加隐式构造方法;
编译器还会在默认main方法结尾默认添加return语句;
1、一个类中可以有多个构造函数,它们以重载形式体现(重载:方法签名相同,参数不同)
2、构造函数也有return语句,不过是用来结束方法;
3、构造函数能被private修饰,但是被私有后不能在其它程序中创建本类对象。(一般对象工厂会私有化构造函数,将创建对象的方法保存在静态方法中)
1
2
3
|
public
static
Person generatePerson(){
return
new
Person();
}
|
1
|
Person person=Person.generatePerson();
|
在构造方法中可以调用其它构造方法,调用时,构造方法必须放在第一行;
原因是:初始化动作要先执行;
在构造函数中调用其它构造函数,需要使用this()关键字;
1
2
3
4
5
|
public
Person(String name,
int
age) {
this
(name);
//初始化name字段,必须放在第一行
this
.name=name;
//给name字段赋值
this
.age = age;
}
|
构造方法的递归,构造方法不停的压栈,导致栈内存溢出;
1
2
3
4
5
6
7
|
Person(){
this
(
"lisi"
);
//调用Person("lisi"){}
};
Person(String name){
this
();
//调用Person(){}
this
.name=name;
};
|
this关键字小细节
每一个成员方法都包含有this关键字,this关键字所指向的地址就是当前对象的地址;
1
|
person.method();
|
person.method()等价于this.method();