面向对象
对象在计算机中的执行原理:
D:\code\黑马\code\oop-app\src\com\itheima\quickstart
声明对象阶段:
- Student s1将Student类加载到方法区并将s1加载到main方法即栈内存中
- s1 = new Student()会在堆内存中开辟空间,内容有属性和对应的地址
- 属性为类中的字段,均进行初始化
- 地址为对应的类的地址,用于寻找方法区中的类,来执行方法
- s1中存储的为堆内存中该对象对应的地址
使用对象阶段
-
以下三条代码会给堆内存中对应的s1的地址的属性赋值
- s1.name = “播妞”;
- s1.chinese = 100;
- s1.math = 100;
-
s1.printTotalScore();
- 当调用该对象的方法时,栈内存中的对象通过地址找到堆内存中对应的存储空间中的方法区的类的地址,从而调用类中的方法
对象与类的注意事项
-
类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car…
-
类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)。
-
成员变量本身存在默认值,定义成员变量时一般来说不需要赋初始值。
-
一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须是代码的文件名。
-
对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了。
Student s1 = new Student(); s1.name = "张三"; // 把s1变量中存储的学生对象的地址赋值给了s2变量 Student s2 = s1; s2.name = "李四"; System.out.println(s1.name); //此时结果是输出李四
-
如果某个对象没有一个变量引用它,即没有变量保存该对象在堆内存中的地址,则该对象无法被操作了,该对象会成为所谓的垃圾对象。而java虚拟机有自动垃圾回收机制,会定期自动清理垃圾对象。
This关键字
D:\code\黑马\code\oop-app\src\com\itheima\thisdemo
this的执行原理:
-
this是一个变量,可以用在对象的方法中,表示当前对象的地址,也就可以使用对应的属性。
-
在对象的方法中输出this会将对应的对象的地址赋值给this并输出结果
Student s1 = new Student();
System.out.println(s1);
s1.test();
System.out.println("----------------------------");
Student s2 = new Student();
System.out.println(s2);
s2.test();
result:
com.itheima.thisdemo.Student@1b6d3586
com.itheima.thisdemo.Student@1b6d3586
----------------------------
com.itheima.thisdemo.Student@4554617c
com.itheima.thisdemo.Student@4554617c
- this主要用于解决对象的方法中的形参与属性重名时的冲突问题
public class Student {
String name;
double score;
public void printPass(double score){//防止形参的score与属性score冲突
if(this.score >= score){
System.out.println("恭喜您,您成功考入了哈佛大学~~");
}else {
System.out.println("很遗憾,您没有考过~~");
}
}
}
构造器
D:\code\黑马\code\oop-app\src\com\itheima\constructor
特点
- 创建对象时,对象会根据参数列表自动调用构造器
应用场景
- 创建对象时,完成对对象的属性的初始化赋值
public class Student {
String name;
double score;
// 无参数构造器
public Student(){
System.out.println("无参数构造器被触发执行了~");
}
// 有参数构造器
public Student(String name, double score){
System.out.println("有参数构造器被触发执行了~~");
this.name = name;
this.score = score;
}
test:
Student s2 = new Student("小黑", 59);
System.out.println(s2.name);
System.out.println(s2.score);
result:
有参数构造器被触发执行了~~
小黑
59.0
注意事项:
- 在设计类时,如果不写构造器,java会为类自动生成一个无参构造器
- 如果自己定义了有参构造,java就不会再自动生成无参构造,需要再手写一个无参构造
封装
D:\code\黑马\code\oop-app\src\com\itheima\encapsulation
设计原则
合理隐藏,合理暴露
实体类Javabean
D:\code\黑马\code\oop-app\src\com\itheima\javabean
什么是实体类?
- 类中的成员变量必须私有,并且要对外提供相应的set和get方法
- 类中必须要有一个无参构造器
- 该类仅用于通过创建对象来保存数据,没有逻辑处理的方法
应用场景
- 实体类只负责数据的存储,而对数据的处理要交给其他类完成,以此来实现数据与业务处理的分离
- 详见代码,需要看一看
test
Student s1 = new Student("播妞",99);//Student为一个实体类
StudentOperator operator = new StudentOperator(s1);
operator.printPass();
OperatorClass
private Student student;
public StudentOperator(Student student){
this.student = student;
}
public void printPass(){
if(student.getScore() >= 60){
System.out.println(student.getName() + "学生成绩及格");
}else {
System.out.println(student.getName() + "学生成绩不及格");
}
}
局部变量与成员变量的区别
D:\code\黑马\code\oop-app\src\com\itheima\variable
案例
D:\code\黑马\code\oop-app\src\com\itheima\demo