java中的面向对象
首先需要了解什么时面向对象呢?
面向:
基本义:面对,朝向
引申义:注重, 关注
对象:
世间一切的事物(万物皆对象)
面向对象思想:
面向对象思想就是把一个关注点放在一件事或一个活动中涉及到的人或事物(也就是对象)上的思想(或思维方式)。面向对象关键字:事物,对象
栗子:
比如有一堆袜子,而现在你只需要找你的女朋友这个对象来帮你洗这个袜子,至于她是用手洗,还是洗衣机洗,这个就不需要你来操心了,只需要找她来帮你
洗就行了,当然也可以找干洗店帮你洗,面向对象思想主要就是让非常复杂的事情变得简单了,只需要找对象来做就可以了
面向过程思想:
面向过程思想就是把关注点放在一件事或一个活动中涉及到的步骤(也就是过程)上的思想(或思维方式)。面向过程关键字:步骤,过程
栗子:
比如说有一堆袜子需要洗,首先时需要一盆水,然后需要把袜子放在水盆里,然后放入洗衣液,然后开始清洗,洗完以后还需要晒干。如果其中有一个步骤
没有执行,那么洗袜子这件事就不会完成
面向对象思想特点
- 是一种跟符合人们思考习惯的思想
- 把复杂的事情简单化
- 把人们从执行着变成了指挥者
面向对象的程序开发
就是不断的找对象、使用对象、指挥对象做事的过程,没有对象?创建一个!
面向对象思想特征
- 封装(encapsulation)
- 继承(inheritance)
- 多态(polymorphism)
封装
什么是封装?
引申义:把一系列功能打包到一台设备里,提供使用这些功能的界面,常见的封装体:汽车,电脑,洗衣机。。。
封装的概念
将一系列相关事物共同的属性和行为提取出来,放到一个类中,隐藏对象的属性和实现细节,仅对外提供公共的访问方式
封装的关键
绝对不能让类中的方法直接访问其他类的数据(属性),程序仅通过对象的方式对对象的数据进行交互
封装的好处
- 提高安全性
- 提高服用性
- 将复杂的事情简单化
java中的封装体
方法
安全性:调用者不知道方法的具体实现
复用性:方法可以被重复使用
简单化:将繁多的代码以一个方法的方式呈现,近通过调用方法就可以实现功能;代码维护也变得简单
类
安全性:调用者不知道类的具体实现
复用性:类的对象可以被重复使用
简单化:类的对象包含了更多的功能,使用起来也更方便
继承
概念:泛指把前人的作风,文化,知识,财产等接收过来
java中的继承
让类与类之间产生父子关系
被继承的类叫做父类(基类、超类)
继承的类叫做子类(派生类)
格式(extends)
class父类{
//....
}
class 子类 extends 父类{
//....
}
注意:在java中,子类只能继承父类的非私有成员(成员变量,成员方法)
继承的特点
- 单继承
java只支持类的单继承,但是支持多层(重)继承
java支持接口的多继承,语法为:
接口A extends 接口B,接口C.
- 私有成员不能继承
只能继承父类的非私有成员(成愿变量,成愿方法)
- 构造方法不能继承
构造方法用于初始化本类对象。
创建子类对象时,需要调用父类构造初始化该对象的父类内容,若父类构造可以被继承,该操作会造成调用的混乱(构造方法只能本类调用)
- 继承体现了“is a”的关系
子类符合“is a(是一个)”父类的情况下,才使用继承,其他情况下不建议使用
继承的使用场景
多个类中存在相同的属性和行为时,可以将这些内容提取出来放到一个新类中,让这些类和新类产生父子关系,实现代码的复用性
继承的优缺点
优点:
- 功能复用
直接将已有的属性和行为继承过来,实现了功能的复用,节省了大量的工作
- 便于扩展新功能
在已有的功能的基础上,更容易建立,扩充新功能
- 结构清晰,简化认识
同属于一个继承体系的相关类,他们之间结构层次清晰,简化了人们对代码结构的认识
- 易维护性
不同类之间的继承关系,让这些事物之间保持一定成都的一致性,大大降低了维护成本
缺点
- 打破了封装性
父类向子类暴露了实现细节,打破了对象的封装性
- 高耦合性
类与类之间紧密的结合在一起,相互依赖性高
方法重写(Override)
定义:子类中出现和父类方法定义相同的方法的现象
解释:方法重写也叫方法的复写、覆盖方法名、参数列表、返回值类型都相同
注意事项:父类私有方法无法重写
子类方法访问权限不能小于父类方法(private<默认(什么都不写就是默认),protected,public)
子类不能比福哦欸方法抛出更大的异常
使用场景:扩展父类功能
父类功能过时,重新实现父类功能
java中的访问权限修饰符
总结:
private:强调的是给自己来使用
默认:强调的是给同包下的类来使用
protected:强调的是给子类使用
public:强调的是给大家使用
方法重写和方法重载的区别
重载(Overload):
方法名:相同
参数列表:不同(个数或对应位置类型)
返回值类型:无关
修饰符:无关
定义位置:同一个类中(同一个类中出现两个或两个以上命名一致,并且参数列表不同时)
重写(Override):子类与父类方法命名一致
方法名:相同
参数类型:相同
返回值类型:相同
修饰符:访问权限不小与被重写方法
定义位置:子父类中(子类中出现和父类一样的方法时)
方法的调用
在方法中调用成员方法是编译看左(首先要看左边的类型有没有这个成员(即父类有没有,如果没有,则会报错),运行看右(运行时
具体用的时右边类中的成员(即使用的是通过子类重写以后的方法)
多态
什么是多态?
多种状态,同一对象在不同情况下表现出不同的状态或行为
结论:多态关系中,成员变量不涉及到重写
简单记忆:多态关系中,使用成员变量,遵循“编译看左,运行看左”
编译看左:意思是在编译期间会看左边的类型有没有这个成员,没有就报错。
编译看左:意思是在运行期间使用的是左边类型的这个成员
多态关系中成员变量的内存图
java中实现多态的步骤
要有继承(或实现(类和接口))关系
要有方法重写
父类引用指向子类对象(is a关系)
多态的使用场景
父类型可以作为形参的数据类型,这样可以接收其任意的子类对象
多态的好处
- 可维护性:基于继承关系,只需要维护父类代码,提高了代码的复用性。大大降低了程序的工作量、
- 可扩展性:把不同的子类对象都当作父类看待,屏蔽了不同子类对象间的差异,做出通用的代码,以适应不同的需求,实现了向后兼容
多态的弊端
不能使用子类特有成员,如果一定要使用,可以使用类型转换
类型转换
当需要使用子类特有功能时,需要进行类型转换
- 向上转型(自动类型转换)
子类型转换成父类型
栗子:Animal animal = new Dog();
- 向下转型(强制类型转换)
父类型转换成子类型
栗子:Dog dog = (Dog)animal;
注意事项
- 只能在继承层次内进行转换(否则会报错(ClassCastException))
- 将父类对象转换成子类之前,使用instanceof进行检查
instanceof关键字的用法:
对象名 instanceof 数据类型
意思时判断前边对象是否时后边的数据类型
栗子:
dog类
//定义一个狗类,并继承动物类 public class Dog extends Animal{ @Override public void eat(){ System.out.println("啃骨头"); } public void watch(){ //狗的特有方法 System.out.println("狗会看家"); } }
父类
//定义一个动物类 public class Animal { public void eat(){ System.out.println("睡觉"); } }
测试类
public class a { public static void main(String[] args) { //测试类 Animal an= new Dog(); //使用多态指向子类 an.eat(); //调用子类的方法 //调用子类特有的watch方法 // an.watch(); 子类的特有方法不能直接调用,否则会报错 //正确的写法 Dog dog = (Dog)an; //向下转型 if(an instanceof Dog){ //判断当前类是否是Dog对象 dog.watch(); } } }