java学习笔记 --- 面向对象2
一、匿名对象
(1)没有名字的对象
(2)应用场景
A:调用方法,仅仅只调用一次的时候。
class Car { //描述属性。颜色,轮胎数。 String color; int number; //描述行为。 void run() { System.out.println(color+":"+number); } } class CarDemo { public static void main(String[] args) { //采用匿名对象调用方法 new Car().run(); new Car().run(); } }
B:可以作为实际参数传递。
class Student { public void show() { System.out.println("我爱学习"); } } class StudentDemo { public void method(Student s) { s.show(); } } class NoNameDemo { public static void main(String[] args) { //带名字的调用 Student s = new Student(); s.show(); s.show(); System.out.println("--------------"); //匿名对象 //new Student(); //匿名对象调用方法 new Student().show(); new Student().show(); //这里其实是重新创建了一个新的对象 System.out.println("--------------"); //匿名对象作为实际参数传递 StudentDemo sd = new StudentDemo(); //Student ss = new Student(); //sd.method(ss); //这里的s是一个实际参数 //匿名对象 sd.method(new Student()); //在来一个 new StudentDemo().method(new Student()); } }
二、基本类型和引用类型作为参数传递的区别
1、基本类型作为参数传递(main方法中值不变)
class Demo { public static void main(String[] args) { int x = 4; show(x); System.out.println("x="+x);//4 } public static void show(int x) { x = 5;
} } |
|
说明:
基本类型作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法show(),当在show()方法中x接受到了复制的值,再在show()方法中对x变量进行操作,这时只会影响到show中的x。当show方法执行完成,弹栈后,程序又回到main方法执行,main方法中的x值还是原来的值。
2、引用参数作为值传递
说明:
当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了show方法的d引用变量。这时会有两个引用同时指向堆中的同一个对象。当执行show方法中的d.x=6时,会根据d所持有的引用找到堆中的对象,并将其x属性的值改为6,show方法弹栈。由于是两个引用指向同一个对象,不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。
三、封装
(1)隐藏实现细节,提供公共的访问方式
(2)好处:
A:隐藏实现细节,提供公共的访问方式
B:提高代码的复用性
C:提高代码的安全性
(3)设计原则
把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式
(4)private是封装的一种体现。
封装:类,方法,private修饰成员变量
(5)使用setXXX(),getXXX()对外提供
四、构造方法
(1)作用:用于对对象的数据进行初始化
(2)格式:
A:方法名和类名相同
B:没有返回值类型,连void都不能有
C:没有返回值
修饰符 构造方法名(参数列表){
}
/* 构造方法: 给对象的数据进行初始化 格式: A:方法名与类名相同 B:没有返回值类型,连void都没有 C:没有具体的返回值 */ class Student { private String name; //null private int age; //0 public Student() { System.out.println("这是构造方法"); } } class ConstructDemo { public static void main(String[] args) { //创建对象 Student s = new Student(); System.out.println(s); //Student@e5bbd6 } }
思考题:构造方法中可不可以有return语句呢?
可以。而是我们写成这个样子就OK了:return;
其实,在任何的void类型的方法的最后你都可以写上:return;
(3)构造方法的注意事项
A:如果我们没写构造方法,系统将提供一个默认的无参构造方法
B:如果我们给出了构造方法,系统将不再提供默认构造方法
如果这个时候,我们要使用无参构造方法,就必须自己给出。
推荐:永远手动自己给出无参构造方法。
C:一个类中可以有多个构造函数,多个构造函数是以重载的形式存在的
D:构造函数中也是有return语句的,用于结束初始化动作。
E:构造函数是可以被private修饰的,作用:其他程序无法创建该类的对象
(4)给成员变量赋值的方式
A:setXxx()
B:带参构造方法
(5)一般方法和构造方法的区别
构造函数在对象创建时就执行了,而且只执行一次。
一般函数是在对象创建后,需要使用时才被对象调用,并可以被多次调用。
思考:
有了构造函数之后可以对对象的属性进行初始化,那么还需要对应的set和get方法吗?
需要相应的set和get方法,因为对象在创建之后需要修改和访问相应的属性值时在,这时只能通过set或者get方法来操作。
五、this关键字
(1)代表当前类的引用对象
记住:哪个对象调用方法,该方法内部的this就代表那个对象
(2)调用其他构造函数的语句必须定义在构造函数的第一行,原因是初始化动作要最先执行。