请大家仔细看完,学习要慢慢来,基础要仔细打牢!! 看完这篇面向对象还不懂的,来打我!!
一.面向对象:封装、继承、多态。(原文PDF获取详情见末尾)
1.1、封装:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
好处:1.只能通过规定的方法访问数据
2.隐藏该类的实例细节,方便修改和实现。
A.访问修饰符
B.Java中的内部类:
内部类就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
那么问题来了:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!
内部类的作用:
1.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
2.内部类的方法可以直接访问外部类的所有数据,包括私有的数据。
3.内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
内部类分类:
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
1.2、继承:
继承是类与类的一种关系,是一种”is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。
好处:
子类拥有父类的所有属性和方法(除了Private修饰的属性不能拥有)从而实现了代码的复用;
- 方法的重写
子类如果对继承的父类的方法不满意(不合适),可以自己编写继承的方法,这种方式就成为方法的重写,当调用方法时会优先调用子类的方法。
重写要注意,以下三个条件都是保持一样:
- 返回值类型
- 方法名
- 参数类型及个数
比如动物会叫,那么狗叫,a.都返回叫;b.都是叫的方法;c.都是需要相同类型的发生器官
方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
继承的初始化顺序
父类对象属性初始化—》父类对象构造方法—》子类对象属性初始化—》子类对象构造方法
C、Final关键字
使用final关键字做标识有“最终的”含义:
- final修饰类,该类不许被继承。
- final修饰方法,该方法不能被重写
- final修饰属性,只能在初始化赋值或者构造方法赋值(只能选1)
- final修饰遍历,只能赋值一次,在声明遍历的时候赋值,赋值完就变为了变量
1.3、多态:
多态是对象的多种形态。
Java中里的多态主要表现在两个方面:
引用多态:
父类的引用指向本类的对象;
父类的引用可以指向子类的对象;
方法多态:
当我们父类的引用指向不同的子对象时,他们调用的方法也是多态的。
创建本类对象时,调用的方法为本类方法;
创建子类对象时,调用的方法为子类重写的方法或者继承的方法;
但是多态使用的时候应该注意:如果子类编写了一个父类不存在的方法,那么就不能通过父类的引用来调用这个方法。
注意:继承是多态的基础
A、引用类型转换
1.向上类型转换(隐式/自动类型转换),是小类型转换到大类型。
2向下类型转换(强制类型转换),是大类型转换到小类型(有风险,可能出现数据溢出)。
但是,如果父类没有引用该子类,那么是不能向下类型转换,虽然编译器不报错,但是运行会出错:
还有一种情况也无法强制,父类引用是指向一个子类,之后又去强转为其他类中是不行的。
是因为程序animal开辟的是Dog类型的内存空间,这与Cat类型内存空间不匹配,所以无法正常转换。
instanceof运算符
instanceof是JAVA的一个二元操作符,和==,>,<是同一类。他的作用是测试他左边的对象是否是它右边的类的实例,返回boolean类型的数据。
B、抽象类
定义:抽象类前使用abstract关键字修饰,则该类为抽象类。
使用抽象类要注意以下几点:
- 抽象类是约束子类必须有什么方法,而并不关注子类如何实现这些方法。
- 抽象类应用场景:
a.在某些情况下,某个父类只是知道其子类应该包含什么方法,但无法知道具体实现内容(实现多态)
b.从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免子类设计的随意性。
3.抽象类定义抽象方法,只是声明,不需要实现。
4.抽象类中也可以包含其他普通的方法,也可以没有抽象方法。
5.抽象类不能直接创建,可以定义引用变量来指向子类对象,来实现抽象方法。
C、接口
1.概念
接口可以理解为一种特殊的类,由全局变量和公共的抽象方法所组成。
如果说类是一种具体实现体,那么接口定义某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里面方法的实现细节,它只规定这些类里必须提供的某些方法。(与抽象类相似)
2.基本语法
3.为什么要有接口
Java中一个类只能继承一个父类,是不够灵活,通过实现多个接口可以补充。
注意:如果要继承父类,继承父类必须在实现接口之前,即extends关键字必须在Implements关键字之前。
D、接口和匿名内部类配合使用
接口在使用过程中经常和匿名内部类配合使用。匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称。
1.4、抽象类和接口的区别
(1)语法层面上的区别
1.一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;所以不能实现类中不能重新定义,也不能改变其值;而抽象类成员变量是frendly,其值可以在子类中修改。
3.抽象方法中可以有非抽象方法,接口中则不能有非抽象办法。
4.接口中可以省略abstract,抽象类是不能省略的。
5.接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
(2)设计层面上的区别
1)抽象类是对类的一种抽象,而接口是对行为的抽象。比如飞机和鸟,他们都会飞,我们会把飞机设计为一个类,鸟会设计一个类,但是不会把飞行设计为一个类,只会把飞行设计为一个接口,然后类去实现自己的飞行方式。其他不能飞的东西就不能实现这个接口。
更加详细的程序演示,请见下链接:
https://blog.csdn.net/qq_40262372/article/details/109200239
二、JAVA基础高频面试题:
https://blog.csdn.net/qq_40262372/article/details/112556249
B站视频讲解面向对象
https://www.bilibili.com/video/BV1Rz4y1m7Lv
B站视频讲解如何三个月学习JAVA拿到实习Offer:
https://www.bilibili.com/video/BV1dV411t71K
想要在学习的道路上和更多的小伙伴们交流讨论
请加Q群:725936761
期待每一位努力学习的小伙伴加入
我们一起朝着目标加油!加油!
想要了解更多请关注微信公众号:万小猿
回复“面试”即可获取原文PDF文件