面向对象
三大特征:封装,继承,多态
面向对象的开发方式?
面向对象就是将现实世界分割成不同的单元,然后每一个单元都实现成对象,然后给一个环境驱动一下,让各个对象之间协作起来形成一个系统。
面向对象术语
OOA 面向对象分析
OOD 面向对象设计
OOP 面向对象编程
实现一个软件的过程:分析(A) --> 设计(D) --> 编程(P)
类和对象
-
什么是类
类实际上在现实世界当中是不存在的,是一个抽象的概念。是一个模板。是我们人类大脑进行“思考、总结、抽象”的一个结果。(主要是因为人类的大脑不一般才有了类的概念。) 类本质上是现实世界当中某些事物具有共同特征,将这些共同特征提取出来形成的概念就是一个“类”,“类”就是一个模板。
-
什么是对象
对象是实际存在的个体。(真实存在的个体)
在java语言中,要想得到“对象”,必须先定义“类”,“对象”是通过“类”这个模板创造出来的。
类就是一个模板:类中描述的是所有对象的“共同特征信息”
对象就是通过类创建出的个体。重点
类:不存在的,人类大脑思考总结一个模板(这个模板当中描述了共同特征。) 对象:实际存在的个体。 实例:对象还有另一个名字叫做实例。 实例化:通过类这个模板创建对象的过程,叫做:实例化。 抽象:多个对象具有共同特征,进行思考总结抽取共同特征的过程。 类 --【实例化】--> 对象(实例) 对象 --【抽象】--> 类 类 = 属性 + 方法 属性来源于:状态 方法来源于:动作
-
类的定义
//语法格式 [修饰符列表] class 类名 { //类体 = 属性 + 方法 // 属性在代码上以“变量”的形式存在(描述状态) // 方法描述动作/行为 }
-
对象的创建
类名 变量名 = new 类名();
-
什么是实例变量?
对象又被称为实例。 实例变量实际上就是:对象级别的变量。
-
对象和引用的区别?
对象是通过new出来的,在堆内存中储存. 引用是:但凡是变量,并且该变量中保存了内存地址指向了堆内存当中的对象的
构造方法
-
当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法.这个无参数的构造方法叫做缺省构造器
-
当一个类中手动的提供了构造方法,那么系统将不再默认提供无参数构造方法,
-
无参数构造方法和有参数的苟傲方法都可以调用
Student x = new Student(); Student y = new Student(123);
-
构造方法支持方法重载吗?
构造方法是支持方法重载的. 在一个类中构造方法可以有多个 并且所有的构造方法名字都是一样的 方法重载特点: 在同一个类中,方法名相同,参数列表不同
封装
-
封装的作用
保证内部结构的安全 屏蔽复杂,暴露简单
-
如何封装
1. 属性私有化(使用private关键字进行修饰) 2. 对外提供简单的操作入口(set,get方法) 通过set方法修改,通过get方法读取
set和get方法写的时候有严格的规范要求:
set方法:
public void set+属性名首字母大写(1个参数){
xxx = 1个参数;
}
get方法:
public 返回值类型 get+属性名首字母大写(无参){
return xxx;
}
继承extends
-
什么是继承?
单继承是指一个子类最多只能有一个父类。 多继承是一个子类可以有二个以上的父类。 由于多继承会带来二义性,Java语言中的类只支持单继承,而接口支持多继承。 Java中多继承的功能是通过接口(interface)来间接实现的 JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。
-
继承的作用
基本作用:子类继承父类,代码可以得到复用 主要作用:因为有了继承关系,才有了后期的方法覆盖和多态机制
-
继承的相关特性
①B类继承A类,则A类称为超类(superclass),父类,基类, B类则称为子类(subclass),派生类,扩展类 ②java中的继承只支持单继承,不支持多继承 ③java中不支持多继承,但有的时候会产生间接继承的效果 ④java中规定,子类继承父类,除构造方法不能继承之外,剩下都可以继承.但是私有属性无法直接在子类中访问,(父类中private修饰的不能再子类中直接访问.可以通过间接的手段来访问) ⑤java中的类没有显示继承任何类,则默认继承Object类,Object类是java语言提供的根类
-
方法覆盖
4.1. 什么时候考虑方法覆盖父类中的方法无法满足子类的业务需求,子类有必要对继承过来的方法进行覆盖
4.2. 什么条件满足的时候构成方法覆盖
①有继承关系的两个类 ②具有相同的方法名,返回值类型,形式参数列表 ③访问权限不能更低 ④抛出异常不能更多
4.3.关于Object类中toString()方法的覆盖?
toString()方法存在的作用就是:将java对象转换成字符串形式。 大多数的java类toString()方法都是需要覆盖的。因为Object类中提供的toString() 方法输出的是一个java对象的内存地址。
-
方法重载和方法覆盖有什么区别?
方法重载发生在同一个类当中 方法覆盖是发生在具有继承关系的父子类之间 方法重载是一个类中,方法名相同,参数列表不同 方法覆盖是具有继承关系的父子类,并且重写之后的方法必须和之前的方法名一致
多态
-
向上转型和向下转型的概念。
向上转型:子--->父 (upcasting) 又被称为自动类型转换:Animal a = new Cat(); 向下转型:父--->子 (downcasting) 又被称为强制类型转换:Cat c = (Cat)a; 需要添加强制类型转换符。
-
多态的概念
多种形态,多种状态,编译和运行有两个不同的状态。 编译期叫做静态绑定。 运行期叫做动态绑定。
-
什么时候必须进行向下转型?
调用子类对象上特有的方法时
-
多态的作用
降低程序的耦合度,提高程序的扩展力。 ``` public class Master{ public void feed(Dog d){} public void feed(Cat c){} } ``` 以上的代码中表示:Master和Dog以及Cat的关系很紧密(耦合度高)。导致扩展力很差。 ``` public class Master{ public void feed(Pet pet){ pet.eat(); } } ``` 以上的代表中表示:Master和Dog以及Cat的关系就脱离了,Master关注的是Pet类。 这样Master和Dog以及Cat的耦合度就降低了,提高了软件的扩展性。
软件开发原则
七大原则最基本的原则:OCP(对扩展开放,对修改关闭)
目的是:降低程序耦合度,提高程序扩展力。
面向抽象编程,不建议面向具体编程。
问题简答
私有方法无法覆盖。
方法覆盖只是针对于“实例方法”,“静态方法覆盖”没有意义。(这是因为方法覆盖通常和多态联合起来)
总结两句话:
私有不能覆盖。
静态不谈覆盖。
在方法覆盖中,关于方法的返回值类型。
什么条件满足之后,会构成方法的覆盖呢?
1、发生具有继承关系的两个类之间。
2、父类中的方法和子类重写之后的方法:
具有相同的方法名、相同的形式参数列表、相同的返回值类型。
学习了多态机制之后:
“相同的返回值类型”可以修改一下吗?
对于返回值类型是基本数据类型来说,必须一致。
对于返回值类型是引用数据类型来说,重写之后返回值类型可以变的更小(但意义不大,实际开发中没人这样写。)。