一,面向对象了解
1.1,面向对象有什么好处
先来了解第一个问题,面向对象编程到底有什么好处? 那就不得不谈,Java的祖师爷对这个世界的理解了。Java的祖师爷,詹姆斯高斯林认为,在这个世界中 万物皆对象,任何一个对象都可以包含一些数据,数据属于哪个对象,就由哪个对象来处理。这样的话,只要我们找到了对象,其实就找到了对数据的处理方式。用一句话总结就是:面向对象的开发更符合人类的思维习惯,让编程变得更加简单、更加直观。
1.2,程序中的对象到底是什么
对象实质上是一种特殊的数据结构。这种结构怎么理解呢?你可以把对象理解成一张表格,表当中记录的数据,就是对象拥有的数据。
1.3,那么对象是怎么出来的
刚讲到对象就是一张数据表,那么这个数据表是怎么来的呢 ? 这张表是不会无缘无故存在的,因为Java也不知道你这个对象要处理哪些数据,所以这张表需要我们设计出来。 用什么来设计这张表呢?就是类(class),类可以理解成对象的设计图,或者对象的模板。设计图中规定有哪些数据,对象中就只能有哪些数据。简单理解 :类是对事物的一种描述,对象则为具体存在的事物。
常问面试题:
面向对象和面向过程的思想对比 :
面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的
面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能
二,类的定义
类的组成是由属性和行为两部分组成
-
属性:在类中通过成员变量来体现(类中方法外的变量)
-
行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
类的定义步骤:
① 定义类
② 编写类的成员变量
③ 编写类的成员方法
public class Student {
// 属性 : 姓名, 年龄
// 成员变量: 跟之前定义变量的格式一样, 只不过位置发生了改变, 类中方法外
String name;
int age;
// 行为 : 学习
// 成员方法: 跟之前定义方法的格式一样, 只不过去掉了static关键字.
public void study(){
System.out.println("学习");
}
}
三,对象的创建和使用
-
创建对象的格式:
-
类名 对象名 = new 类名();
-
-
调用成员的格式:
-
对象名.成员变量
-
对象名.成员方法();
-
-
示例代码 :
public class TestStudent {
/*
创建对象的格式:
类名 对象名 = new 类名();
调用成员变量的格式:
对象名.变量名
调用成员方法的格式:
对象名.方法名();
*/
public static void main(String[] args) {
// 类名 对象名 = new 类名();
Student stu = new Student();
// 对象名.变量名
// 默认初始化值
System.out.println(stu.name); // null
System.out.println(stu.age); // 0
stu.name = "在学习的路上";
stu.age = 23;
System.out.println(stu.name); // 在学习的在路上
System.out.println(stu.age); // 23
// 对象名.方法名();
stu.study();
// com.test.Student@bx996sb
// 全类名(包名 + 类名)
System.out.println(stu);
}
}
四,对象的执行原理
学过数组的执行原理的都知道,数组变量记录的其实数数组在堆内存中的地址。其实面向对象的代码执行原理和数组的执行原理是非常类似的。
其实Student s1 = new Student();
这句话中的原理如下
-
Student s1
表示的是在栈内存中,创建了一个Student类型的变量,变量名为s1 -
而
new Student()
会在堆内存中创建一个对象,而对象中包含学生的属性名和属性值同时系统会为这个Student对象分配一个地址值0x4f3f5b24
-
接着把对象的地址赋值给栈内存中的变量s1,通过s1记录的地址就可以找到这个对象
-
当执行
s1.name=“hsy”
时,其实就是通过s1找到对象的地址,再通过对象找到对象的name属性,再给对象的name属性赋值为hsy;
搞明白Student s1 = new Student();
的原理之后,Student s2 = new Student();
原理完全一样,只是在堆内存中重新创建了一个对象,又有一个新的地址。s2.name
是访问另对象的属性。
五,类及对象的注意事项
第一条:一个代码文件中,可以写多个class类,但是只能有一个是public修饰,且public修饰的类必须和文件名相同。
假设文件名为Demo1.java
,这个文件中假设有两个类Demo1类和Student类
,代码如下
//public修饰的类Demo1,和文件名Demo1相同
public class Demo1{
}
class Student{
}
第二条:对象与对象之间的数据不会相互影响,但是多个变量指向同一个对象会相互影响。
如下图所示,s1和s2两个变量分别记录的是两个对象的地址值,各自修改各自属性值,是互不影响的。
第三条:如果某个对象没有一个对象引用它,则该对象无法被操作,会变成垃圾对象。