目录
目录
一、类和对象
1. 类和对象是什么?
类:共同特征的描述(类比为手机的设计,属性有:品牌、价格等;功能:打电话、发短信等)
对象:具体的实例(类比为具体的产品,如华为)
二、封装
1. 面向对象三大特征
封装、继承、多态。(该小节主要讲解封装)
2. 如何理解封装
对象代表什么,就得封装对应的数据,并提供数据对应的行为。
什么意思呢?这里需要小伙伴们推翻原来的思维,重新思考,以便更加深入的理解封装的定义。这里举两个例子:
eg1:人画圆。思考一下,是人画的圆,还是圆自己把自己画出来的呢?
按照原来的思维,不用想,那肯定是人画的啊!然而,封装与之相反。
可以这样想,画圆需要什么呢?需要圆的半径,而在人中找不到圆的半径这个属性。画圆是依靠圆的属性——半径,而画出的圆。所以画圆这个方法应该放在圆的类中。
eg2:人开门。是人开的门,还是门自己打开的呢?
可以这样想,人只是给了门一个推力,门是自己关上的。“开门”和“关门”这两个动作是门的状态,故应该将其封装在门的类中。
ps:理解封装的概念非常重要,大家一定要理解透彻再进入下一步的学习。
3. private
若类中的成员变量不加任何修饰符,那么它会被外界赋值,此时会有个风险:传递的是非法参数,为了避免这个风险,java提供了private修饰词,保证了成员变量的安全性。
使用了private的变量,不能被外界访问到。
如果需要对成员变量赋值,那么在同样的类中写set 和 get 方法,并在set方法中,对传入的参数进行过滤。
加入set()和get()方法:
三、就近原则和this关键字
1.成员变量和局部变量
成员变量:在类下的变量。
局部变量:在方法下的变量。
2. 就近原则
内容:谁离我近,我就选谁。
该例中,sout(age)中age离method()方法中的age更近,所以输出age=10。
3. this关键字
应用:当成员变量和局部变量同名时,将它们区分开来。
此时sout(age),age用this关键字修饰,所以此时age指的是成员变量的age,输出结果age=0。
四、构造方法
1.构造方法的格式
public class Student{
修饰符 类名(参数){
方法体;
}
}
例:
public class Student{
public Student(){
方法体;
}
}
特点:①方法名和类名相同,大小写也要一致。
②没有返回值类型,void也不行。
③没有具体的返回值(不能由return带回数据)
2.执行时机
1)创建对象的时候由虚拟机调用,不能手动调用构造方法。
2)每创建一次对象,就会调用一次构造方法。
3.类型
1)无参构造
public class Student {
int sno;
String sname;
//无参构造
public Student(){
}
}
2)带参构造
public class Student {
int sno;
String sname;
//有参构造
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
4.构造方法注意事项
①构造方法的定义
a.如果没有定义构造方法,系统将会给出一个默认的无参数构造方法。
b.如果定义了构造方法,系统将不再提供默认的构造方法。
②构造方法的重载
a.带参构造方法和无参构造方法,两者方法名相同,但参数不同,这叫做构造方法的重载。
③推荐的使用方式
a.无论是否使用,都手动书写无参构造方法,和带全部参数的构造方法。
五.三种情况的对象内存图
1. 一个对象的内存图
2. 两个对象的内存图
3. 两个引用指向同一个对象
六、基本数据类型和引用数据类型
从内存的角度去解释:
1. 基本数据类型:数据值存储在自己的空间中。
特点:赋值给其他变量,赋的是自己的真实值。
内存图:
【注】a在内存栈中的值是10,将a赋值给b,b的值也是10。
2. 引用数据类型:数据值存储在其他空间中,自己空间存储的是地址值。
内存图:
七、this的内存原理
【注】
1.main方法进栈;
2.Student s1:栈中写入 s1,类型为Student;
3.new Student():堆中开辟一个空间,里面有name和age两个属性,该空间的地址值为001;
4.=:将空间的地址值001赋值给变量s1,s1可以通过该地址找到空间;
5.s1.setName("竹小玲"):方法setName进栈,参数为name,内容是竹小玲;
调用者:s1,内容001;
this:s1,内容001。
this.name=name 可看成是:001.name=name,故堆中的name值改成 竹小玲。
6.赋值完毕,setName方法执行完毕,出栈;
7.main方法出栈。
好了,今天的分享就到此结束啦
希望对你有帮助 (๑•̀ㅂ•́)و✧