跟康师傅学Java-面向对象(基础)
学习面向对象内容的三条主线(非官方)
①Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类
②面向对象的特征:封装、继承、多态、(抽象)
③其他关键字的使用:this、super、package、import、static、final、interface、abstract等
1. 面向对象编程概述
1.1 程序设计的思路
面向对象是软件开发中的一类编程风格、开发范式。除了面向对象,还有面向过程、指令式编程和函数式编程。
1.面向过程(pop)
关注过程
,过程就是数据的步骤。如果某个过程的实现代码重复出现就可以把这个过程抽象为一个函数。
代码结构:以函数
为组织单位。
是一种执行者思维,适合解决简单问题。扩展能力差、后期维护难度较大。
2.面向对象(oop)
关注类
:在程序设计过程中,参照现实中事物,将事物的属性特征,行为特征抽象出来,用类来表示。
代码结构:以类
为组织单位。每种事物都具备自己的属性
和行为/功能
。
是一种设计者思维,适合解决复杂问题。代码可扩展性强、可维护性高。
面向对象可以帮助我们从宏观上把握,从整体上分析整个系统,但是具体到部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。
随着需求和功能的增多,把这些步骤和功能进行封装,封装时根据不同的功能进行不同的封装,功能类似的封装在一起。
2. 类和对象
2.1 类和对象概述
类:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。 --> 抽象的
对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)。 --> 具体的
2.2 类的成员概述
面向对象程序设计的重点是类的设计,然而类的设计其实是类的成员设计。
类是一组相关属性
和行为
的集合,这也是类最基本的两个成员。
属性:该类事物的状态信息,对应类中的成员变量。
成员变量 <=> 属性 <=> Field
行为:该类事物要做什么操作,或者基于事物的状态能做什么,对应类中的成员方法。
(成员)方法 <=> 函数 <=> Method
2.3 面向对象完成功能的三步骤(*重要)
步骤1:类的定义,格式如下
[修饰符] class 类名{
属性声明;
方法声明;
}
步骤2:对象的创建 new
语法:
// 方式1:给创建的对象命名
// 把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象
类名 对象名 = new 类名();
// 方式2:
new 类名() // 也称为匿名对象
步骤3:对象调用属性或方法
对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。
使用"对象名.属性"
或"对象名.方法"
的方式访问对象成员(包括属性和方法)
2.4 匿名对象(anonymous object)
不使用对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。如 : new Person().shout();
使用情况:
如果一个对象只需进行一次方法调用,那么就可以使用匿名对象。
经常将匿名对象作为一个实参传递给一个方法调用。
3. 对象的内存解析
3.1 JVM内存结构划分
HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时的数据区部分(Runtime Data Area)
堆(Heap) :此内存区域存在的唯一目的就是存放对象实例,所有的对象实例以及数组都要在堆上分配。
栈(Stack):是指虚拟机栈,用于存储局部变量等。局部变量表存放了编译器可知长度的各种基本数据类型,对象引用(reference类型,它不等同于对象本身,是对象在堆内存中的首地址),方法执行完,自动释放。
方法区(Method Area):用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
面试题:对象名中存储的是什么?
答:对象的地址。
直接打印对象名和数组名都是显示"类型@对象的hashcode值",所以说类、数组都是引用数据类型,引用数据类型的变量存储的是对象的地址或者说是指向堆中对象的首地址
3.2 对象内存解析
class Person {
//类:人
String name;
int age;
boolean isMale;
}
public class PersonTest {
//测试类
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "赵同学";
p1.age = 20;
p1.isMale = true;
Person p2 = new Person();
p2.age = 10;
Person p3 = p1