一、学习面向对象的三条主线
- Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类
- 面向对象的特征:封装、继承、多态、(抽象)
- 其他关键字的使用:this、super、package、import、static、final、interface、abstract等
二、叙述面向对象的编程思想
1.程序设计的思路
面向对象,是软件开发中的一类编程风格、开发范式。除了 面向对象 ,还有 面向过程 、 指令式编程 和 函数式编程 。在所有的编程范式中,我们接触最多的还是面向过程和面向对象两种。
类比:史书类型
|
早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显,出现 了面向对象思想并成为目前主流的方式。
2.面向过程的程序设计思想(Process-Oriented Programming),简称 POP
- 关注的焦点是过程 :过程就是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以 把这个过程抽取为一个 函数 。这样就可以大大简化冗余代码,便于维护。
- 典型的语言:C语言
- 代码结构:以 函数 为组织单位。
3.面向对象的程序设计思想( Object Oriented Programming),简称 OOP
- 关注的焦点是 类 :在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽 象出来,用类来表示。
- 典型的语言:Java、C#、C++、Python、Ruby和PHP等
- 代码结构:以类为组织单位。每种事物都具备自己的 属性 和 行为/功能 。
- 是一种“ 设计者思维 ”,适合解决复杂问题。代码扩展性强、可维护性高。
4. 类比举例
a)面向过程
1.打开冰箱 2.把大象装进冰箱 3.把冰箱门关住 |
b)面向对象
人{ 打开(冰箱){ 冰箱.开门(); } 操作(大象){ 大象.进入(冰箱); } 关闭(冰箱){ 冰箱.关门(); } } 冰箱{ 开门(){ } 关门(){ } } 大象{ 进入(冰箱){ } } |
三、Java语言的基本元素:类和对象
1.引入
大千世界,其实任何事物都可以认为是对象,这也就是“万物皆对象”。用一个例子说明这种情况。
小茗同学今年13岁,初一三班学生,性别男。生活比较单调,除了读书睡觉和吃,其他技能尚未发现。和他同班同学的小智、小青、小龙都是如此,真是“臭味相投”成了好朋友。
上面这段话中,小铭同学就是一个对象。其中年龄、性别、班级这些称之为属性,读书睡觉和吃称之为方法或函数。对象都是类实例化的结果,那么上述的例子中讲这些学生抽象化,就是一个“学生类”。
2.类的成员概述
|
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的 细胞 构成的。同理,Java代码世界是 由诸多个不同功能的 类 构成的。
现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、…
Java中用类class来描述事物也是如此。类,是一组相关属性和行为的集合,这也是类最基本的两 个成员。
- 属性:该类事物的状态信息。对应类中的成员变量(别名: 属性 Field)
- 行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法(方法 函数 Method)
3.总结
类(Class) 和 对象(Object) 是面向对象的核心概念。
a)类:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。
b)对象:实际存在的该类事物的每个个体 ,是具体的,因而也称为实例(instance) 。
c)类 => 抽象概念的人 ; 对象 => 实实在在的某个人
四、使用类并创建对象的三个步骤
1.步骤一:类的定义
类的定义使用关键字:class。格式如下:
[修饰符] class 类名{ 属性声明; 方法声明; } |
举例:
public class Dog{ //声明属性 String type; //种类 String nickName; //昵称 String hostName; //主人名称 //声明方法 public void eat(){ //吃东西 System.out.println("狗狗进食"); } } |
2.步骤二:对象的创建(类的实例化)
创建对象,使用关键字:new
创建对象语法:
//方式1:给创建的对象命名 //把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象了 类名 对象名 = new 类名(); //方式2: new 类名()//也称为匿名对象 |
举例:
class DogTest{ public static void main(String[] args){ //创建Dog类的对象 Dog dog = new Dog(); } } |
3.步骤三:对象调用属性或方法
- 对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。
- 使用" 对象名.属性 " 或 " 对象名.方法 "的方式访问对象成员(包括属性和方法)
举例:
class DogTest{ public static void main(String[] args){ //创建Dog类的对象 Dog dog = new Dog(); dog.type="泰迪"; dog.nickName="小小"; dog.hostName="小铭"; dog.eat(); } } |
4.匿名对象
|
五、对象的内存解析
1.JVM内存结构划分
HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime Data Area)。
其中:
堆(Heap):此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一 点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
栈(Stack) :是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。
方法区(Method Area) :用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2.对象内存解析
a)举例:
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; p3.name = "郭同学"; } } |
b)内存解析图
c)说明
|
d)一道面试题
面试题:对象名中存储的是什么呢?
答:对象地址
public class StudentTest{ public static void main(String[] args){ System.out.println(new Student());//Student@7852e922
Student stu = new Student(); System.out.println(stu);//Student@4e25154f
int[] arr = new int[5]; System.out.println(arr);//[I@70dea4e } } |
直接打印对象名和数组名都是显示“类型@对象的hashCode值",所以说类、数组都是引用数据类型,引用数据类型的变量中存储的是对象的地址,或者说指向堆中对象的首地址。