一、面向对象基本概念
1.面向对象与面向过程两种编程思维的区别
面向过程:以步骤为单位,一步一步完成某个具体事情;
面向对象:以对象为单位,通过调度组合不同的对象来完成某一个事情。
2.建立面向对象的思维方式
(1)先整体,再局部
(2)先抽象,再具体
(3)能做什么,再做什么
tips:Java是纯面向对象的语言
二、类与对象
1.基本定义
类:分类、类别;类是一组具有相同特性(属性)与行为(方法)的事物集合。
对象:特征,是一种个性的产物,对象包含在类里边。例如,女星属于一个类,Selena Gomez属于一个对象。
2.格式定义
在java中可以使用以下语句定义一个类:
class 类名称{
属性名称;
返回值类型 方法名称(){
}
}
在Java中对象声明有两种含义
声明对象:Horse horse = null;
//表示声明了一个对象,但是此对象无法使用,horse没有具体的内存指向
实例化对象:horse = new Horse();
//表示实例化了对象,可以使用了
/*
new 关键字表示创建一个对象
new 关键字也表示实例化对象
new 关键字还表示申请内存空间
注意:如果使用未申请内存空间的对象,会报空指针异常:java.lang.NullPointerException
*/
//通过对象调用方法:
horse.eat();
horse = null; //利用 null 把对象释放掉,这样后该对象就不存在了
//匿名对象调用方法:只使用一次,用完后,该对象就会被释放
new Horse().eat();
3.案例
public class Main {
public static void main(String []args) {
Horse h = null; /*声明一个类的变量(除了八种基本数据类型以外,都是引用数据类型,包括数组)*/
//创建一个Horse类型的对象,实例对象
h = new Horse();
// 有了对象之后,就可以调用对象的属性和方法
h.name = "小白马";
h.age = 5;
h.run(); //调用对象的方法,且方法会被执行
}
}
// 自定义一个类(类型)
class Horse{
// 在类中定义属性(特征)
String name;
int age;
//在类中定义方法
public void run(){
System.out.println("我是"+ name +",我"+ age +"岁了,"+"日行千里不在话下");
}
}
三、类与对象的内存分析
1.对象内存分析
栈内存存的某个对象所指向的地址,堆内存存的是数据(实际上是数据所指向的内存地址,但这里可以抽象的理解成就是存放的数据)。
horse1与house2指向了同一个对象的话,其中一个修改内容,另一个也会相应的发生改变。例如这里horse1与house2的name最终都变成了“小黑”。
tips:对象之间,必须是相同类型才能赋值。
如果 horse1与house2最开始都分别指向不同的内存空间,之后又让house2指向 horse1的内存空间,那么之前house2所指向的内容就变成了垃圾,没有得到释放。
四、面向对象的封装性
1.封装性的概念
封装性是面向对象思想的三大特征之一:封装性、继承性、多态性
封装性就是隐藏实现细节,仅对外提供访问接口。
封装有:属性的封装、方法的封装、类的封装、组件的封装、模块化封装、系统级封装...
2.封装的好处
- 模块化
- 信息隐蔽
- 代码重用
- 插件化易于调试
- 具有安全性
tips:缺点是会影响执行效率
3.封装前后对比
封装之前:未封装时,外部可以随意修改对象属性,不安全
class person{
String name;
int age;
}
封装之后:对属性而言,加上private权限后,就表示封装了,外部无法直接修改本类的属性。想要访问只能通过public权限的方法去间接获取,如例子的 setName() 和 getName()方法。
class person{
// 属性是成员变量
private String name;
private int age;
// 参数及方法内定义的变量是局部变量
// 对外提供一个为name属性设值的方法
public void setName(String name){
this.name;} // this 指的是当前对象的name
// 对外提供一个获取name属性的方法
public String getName(){
return name;}
}