面向对象总结

一、熟悉面向对象

我们在现实生活中,思考问题、发现问题、处理问题,往往都会用“表格”作为工具。实际上,“表格思维”就是一种典型的面向对象思维。在面向对象编程中,类对应着表的结构。
1.表结构对应:类结构
2.一行数据对应:一个对象
3.表中所有数据对应:这个类的所有对象

二、面向过程和面向对象思想

1.面向对象和面向过程

(1).两者都是解决问题的思维方式,都是代码组织的方式。
(2).面向对象离不开面向过程。

2.面向对象是“设计者思维”

面向对象是一种“设计者思维”。设计时,先从问题中找名词,然后确立这些名词哪些可以作为类,再根据问题需求确定的类的属性和方法,确定类之间的关系。

3.面向对象分析:写诗

“面向对象思维”不止适合工科、理科,也适合文科。比如:我要写一首诗,就是一种设计的过程,怎么样用简单的、有意境的词汇来描述一个场景。

4.面向对象分析:写小说

简单分析“面向对象设计方式写小说”的过程:
(1).明确小说主要内容和目标
(2).人物设计分析
(3).整体时间设计

三、对象和类的详解

1. 类和对象的概念

(1)类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
(2)类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性、方法。
一个典型类的定义和UML图
在这里插入图片描述

2. 类的定义

类一般有三种常见的成员:属性field、方法method、构造器constructor。
(1).属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
(2).方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。
在这里插入图片描述
(3).构造方法(构造器 constructor)
构造器4个要点:
构造器通过new关键字调用!!
构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在 构造器里使用return返回某个值。
如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加!
构造器的方法名必须和类名一致!

四、面向对象的内存分析

1.Java虚拟机的内存可以简单的分为三个区域:

虚拟机栈stack
(1).栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
(2).JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
(3).栈属于线程私有,不能实现线程间的共享!
(4).栈的存储特性是“先进后出,后进先出”
(5).栈是由系统自动分配,速度快!栈是一个连续的内存空间!
堆heap
(1).堆用于存储创建好的对象和数组(数组也是对象)
(2).JVM只有一个堆,被所有线程共享
(3).堆是一个不连续的内存空间,分配灵活,速度慢!
方法区method area
(1).方法区是JAVA虚拟机规范,可以有不同的实现。
i.JD7以前是“永久代”
ii.JDK7部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中
iii.JDK8是“元数据空间”和堆结合起来。
(2).JVM只有一个方法区,被所有线程共享!
(3).方法区实际也是堆,只是用于存储类、常量相关的信息!
(4).用来存放程序中永远是不变或唯一的内容。(类信息【Class对象,反射机制中会重点讲授】、静态变量、字符串常量等)

2.参数传值机制

基本数据类型参数的传值 传递的是值的副本。 副本改变不会影响原件。
引用类型参数的传值 传递的是值的副本。但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值,也意味着原参数指向对象的值也发生了改变”。

五、垃圾回收机制

1.垃圾回收原理和算法:

内存管理 垃圾回收过程 垃圾回收相关算法(引用计数法和根搜索算法)

2.通用的分代垃圾回收机制

将对象分为三种状态:年轻代、年老代、持久代。同时,将处于不同状态的对象放到堆中不同的区域。 JVM将堆内存划分为 Eden、Survivor 和 Tenured/Old 空间。

3.JVM调优和Full GC

在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:
(1).年老代(Tenured)被写满
(2).持久代(Perm)被写满
(3).System.gc()被显示调用
(4).上一次GC之后Heap的各域分配策略动态变化

4.开发中容易造成内存泄露的操作

程序员可以调用System.gc(),该方法只是通知JVM,并不是运行垃圾回收器。尽量少用,会申请启动Full GC,成本高,影响系统性能。

六、this、static关键字

1.this关键字

this最常的用法:
(1).在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
(2).使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
(3).this不能用于static方法中。

2.static关键字

它的特点:(1).为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
(2).对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!
(3).一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。
(4).在static方法中不可直接访问非static的成员。

七、 包机制(package、import)

1.package

我们通过package实现对类的管理,package的使用有两个要点:
(1).通常是类的第一句非注释性语句。
(2).包名:域名倒着写即可,再加上模块名,便于内部管理类。
package注意事项:
(1)写项目时都要加包,不要使用默认包。
(2)com.gao和com.gao.car,这两个包没有包含关系,是两个完全独立的包。只是逻辑上看起来后者是前者的一部分。

2.导入类import

如果我们要使用其他包的类,需要使用import导入,从而可以在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。import后,便于编写代码,提高可维护性。

八、继承

1.继承的作用:

(1)方便对事务建模
(2)代码复用,更加容易实现类的扩展

2.instanceof 运算符

instanceof是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。

3.继承使用要点:

(1).父类也称作超类、基类、派生类等。
(2).Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
(3).Java中类没有多继承,接口有多继承。
(4).子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和 方法)。
(5).如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。

4.方法的重写override

方法的重写需要符合下面的三个要点:
(1).“= =”: 方法名、形参列表相同。
(2).“≤”:返回值类型和声明异常类型,子类小于等于父类。
(3).“≥”: 访问权限,子类大于等于父类。

九、Object类基本特性

Object类是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。

1.toString方法

在这里插入图片描述

2.双等号和equals方法

“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。
Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true 否则返回 false。

3.super关键字

super可以看做是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
若是构造方法的第一行代码没有显式的调用super(…)或者this(…);那么Java默认都会调用super(),含义是调用父类的无参 数构造方法。这里的super()可以省略。

4.继承树追溯

构造方法调用顺序:构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。

十、封装(encapsulation)

1.编程中封装的具体优点:

(1)提高代码的安全性。
(2)提高代码的复用性。
(3)“高内聚”:封装细节,便于修改内部代码,提高可维护性。
(4)“低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。

2.封装的实现—使用访问控制符

在这里插入图片描述

3.类的属性的处理

一般使用private访问权限。
提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。
一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

十一、多态(polymorphism)

多态的要点:

(1)多态是方法的多态,不是属性的多态(多态与属性无关)。
(2)多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
(3)父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

对象的转型(casting):

父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。
向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型!

十二、抽象类和接口

1.抽象方法和抽象类

抽象方法:使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。
抽象类:包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
抽象类使用要点:
(1). 有抽象方法的类只能定义成抽象类
(2). 抽象类不能实例化,即不能用new来实例化抽象类。
(3). 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
(4). 抽象类只能用来被继承。
(5). 抽象方法必须被子类实现。

2.接口interface

普通类:具体实现
抽象类:具体实现,规范(抽象方法)
接口:规范!
在这里插入图片描述
定义接口的详细说明:
访问修饰符:只能是public或默认。
接口名:和类名采用相同命名机制。
extends:接口可以多继承。
常量:接口中的属性只能是常量,总是:public static final 修饰。不写也是。
方法:接口中的方法只能是:public abstract。 省略的话,也是public abstract。

3.接口的多继承

接口完全支持多继承。和类的继承类似,子接口扩展某个父接口,将会获得父接口中所定义的一切。

十三、字符串String类详解

1.String基础

(1)String类又称作不可变字符序列。
(2)String位于java.lang包中,Java程序默认导入java.lang包下的所有类。
(3)Java字符串就是Unicode字符序列,例如字符串“Java”就是4个Unicode字符’J’、’a’、’v’、’a’组成的。
(4)Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例。

2.String类和常量池

全局字符串常量池(String Pool),class文件常量池(Class Constant Pool)和运行时常量池(Runtime Constant Pool)。

3.String类常用的方法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值