OOP:面向对象

发布时间 2023-08-19 16:50:00作者: 王闯wangchuang2017

OOP:面向对象

思想
80年代,百花争名,OOP(面向对象编程) OOA(面向对象分析) OOD(面向对象设计)
程序即现实:模拟现实世界
万事万物皆对象
核心:类和对象
类是对象的抽象,对象是类的具体
类:抽象的,模板,概念,是一些具体共同特征和行为的一类的定义
对象:实际存在的,通过类来创建
类的组成:属性(特征)和方法(行为)
目的:消除重复代码
优点:1.可重用性 2.可扩展性 3.可管理性

 
实例变量
 
局部变量
 
位置
 
直接书写在类内部
 
定义在方法中
 
默认值
 
有默认值,与数组相同
 
没有默认值
 
作用范围
 
整个类中
 
离当前变量最近的大括号以内
 
生命周期
 
随着对象的创建而生效,随着对象被垃圾回收而死亡
 
随着方法的入栈而生效,随着方法的出栈而死亡
 
存储位置
 
实例变量全部在堆中
 
局部变量基本数据类型存在栈中,引用数据类型名字在栈,内容在堆
 
命名
 
可以与局部变量重名,就近原则使用
 
局部变量与局部变量之间不能重名
 

 
三大特征
 
封装
封装就是需要在实现的把一部分不让别人看到的操作封装起来,留下一个接口让别人可以直接来调用。
保护信息,聚合内容
类的创建就是封装的体现
封装:私有属性,公有方法
 
继承
把多个类相同的内容抽取到父类中,形成继承关系
能不用就不用
单继承
继承就是子类在父类的基础上边可以有自己的方法,同时可以使用父类非私有化的方法和变量,同时当父类的方法不足以满足需求的时候,还可以重写父类的方法,除此之外还可以有自己的方法,但是Java中只能实现单继承,不过可以通过内部类的方式来解决这个问题
 
重载和重写的区别:
重载:同一个类中,方法名相同,形式参数不同
重写:在子类中,可以对父类的方法进行重写,不能比父类的更严格
 
位置
 
方法名
 
参数列表
 
返回值
 
访问修饰符
 
方法重载
 
同类中
 
相同
 
不同
 
无关
 
无关
 
方法重写
 
子类中
 
相同
 
相同
 
相同或者是其子类
 
不能比父类更严格
 
 
多态
多态,就是一种东西具备多种形态,分为编译时多态(重载)和运行时多态(重写、对象转型)

向上转型:父类作为形参、父类类型作为返回值;向上转型的方式实现多态
父类引用指向子类对象;可以调用子类重写父类的方法和子类继承父类的方法,不能调用子类独有的方法。
Pet dog1 = new Dog();
向下转型:向上转型后,此时的对象是不能访问子类独有的方法的,如果需要访问,必须强制向下转型
Dog dog2 = (Dog) dog1 向下转型可以调子类独有的方法

通过instanceof关键来判断类型是否合理
对象a instanceof 类型A 表示判断对象a 是否属于A类类型的
对象转型:子类可以代指父类,父类对象如果是子类对象充当的,那么父类对象也可以转换为子类对象
想向下转型,先向上转型
 
什么是多态,多态的优点,多态实现的条件
(1)就是对于同一消息,根据调用对象的不同做出不同的反应,例如一个接口,这个接口的不同实现类,对这个方法的实现不一样,当调用时候得出的结果也就不一样。
(2)多态的优点是
可替换性,例如计算一个圆的面积,这个方法同样可以计算圆环的面积。
可扩展性,就是如果新增一个方法,不会破坏已经存在的方法的继承性和多态性。
(3)多态实现的三个条件:重写、继承、父类引用指向子类对象。
 
关键字
 
final 最终的
修饰类 没有子类,不能被继承
修饰方法 可以被继承,不能重写
修饰属性 常量
final可以用来修饰方法,类,变量,常量等,被fina|修饰的方法不能够被重写,被final修饰的类不能被继承,被final修饰的变量中成员变量一旦被赋予初始值就不能改变,被final修饰的局部变量一旦赋值就不能改变,被final修饰的常量不能改变,在编译时期存储到常量池中,被final修饰的引用对象,不能改变引用的内容。
 
static
静态 类 范围很广
修饰类
修饰方法 静态方法中不能直接访问非静态的方法;非静态方法中可以直接访问静态的方法
修饰属性 static修饰的属性称之为静态属性,在内存中只有一份拷贝,属于整个类,不属于任何对象,可以被当前类的所有独享共享
修饰代码块 static修饰的代码块称之为静态代码块,当JVM加载类的时候自动执行,不能调用,多个静态代码块按照顺序执行,每个静态代码块只执行一次。
 
abstract
抽象 模糊
修饰类 抽象类
修饰方法 抽象方法 没有方法体,只有方法声明
 
this
当前类的对象 实例
代指本类对象 参数传递 调用实例属性或方法 调用构造函数
this可以访问属性、普通方法、构造方法;但是访问构造方法时,要求必须在本类中构造方法的第一句 而且在同一个构造方法中只能使用一次this访问构造
 
super
表示父类对象,可以访问父类访问权限允许的属性,方法,构造方法
可以调用父类的标记符
调用父类的构造函数、属性、方法等
 
this和super的区别
this表示当前对象。super不能表示父类对象
this访问本类中的属性,如果本类中没有就去父类中查找;super则直接访问父类中的属性
this访问本类中的方法,如果本类没有此方法则从父类中继续查找。super访问父类中的方法。
this调用本类构造,必须放在构造方法的首行。super调用父类构造,必须放在子类构造方法首行。
 
访问修饰符
public 公共的,都可以访问 本类中 本包中 子类中 本项目
protected 受保护的,本类内部可用,所有的子类中 本类中 本包中 子类中
private 私有的,本类内部使用 本类中
没有访问修饰符 同包下可以 本类中 本包中
访问访问权限从高到低:public>protected>没有访问修饰符>私有
 
接口
interface
模板的定义结构体,主要可以实现规范化开发
1.7和1.8差异 1.8支持默认实现default
接口中方法默认:public修饰 abstract
 
枚举
特殊的类,可以定义变量,用于多种状态的定义
语法格式:enum 枚举名称{变量1(值),……;私有属性 值,公有getter ,私有构造函数 为私有属性赋值}
 
内部类
静态内部类
成员内部类
局部内部类
匿名内部类
 
面试题
 
1.抽象类和接口的区别
(1)从方法上来说,抽象类中的方法可以为抽象方法也可以是非抽象方法,接口中的方法只能够是抽象方法,抽象类的抽象方法没有方法体,接口的抽象方法在jdk1.8中是可以有方法体的。
(2)抽象类的变量没有final修饰,接口中的变量都被public static final修饰。
(3)抽象类只能够单继承,他的子类不用重写其全部方法,接口能够实现多实现,他的实现类必须重写其全部方法。
 
2.final、finally、finalize的区别
final是常量,可以修饰类,方法,变量。
finally是在try catch最终语句执行的,是就算捕获到异常,依然会执行的语句,例如关闭流。
finalize是垃圾回收机制中的一个方法。
 
3.运行时异常,一般异常的区别
(1)运行时异常是不需要用户处理的,是程序运行的时候。jvm抛出的异常,一般异常是用户声明在方法后边可能抛出的异常,是用户处理的
(2)运行时异常在编写方法的时候不能被捕获或者抛出,一般异常是在编写方法的时候可以被捕获或者抛出的
Error是Jvm中出现的重大错误
Excption分为三种:编译时异常、运行时异常、一般异常