java复习2(面向对象)

2021/9/29 1:12:38

本文主要是介绍java复习2(面向对象),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

2 面向对象OOP
2.1 面向对象与面向过程
两者都是一种编程的思想
面向对象强调的是事情的结果,我们通过对象完成对应的功能
面向过程强调的是事情的过程,我们做任何事情,都要亲力亲为,经过每一个步骤
Java是一门面向对象的语言
2.2 类与对象
定义类通过关键字class来定义,类是一类事物的抽象,它是抽象的,它是模板
创建对象通过new关键字触发构造函数生成,对象是根据类创建出来的具体的内容
一个类可以创建出多个对象,对象是根据类的设计来创建的,所以对象具有类的所有属性与功能
对象之间是相互独立的,互不影响。我们把创建对象也称作“实例化”
2.3 面向对象的三大特性:封装
前提:为了保证数据的安全,也为了程序的使用者能够按照我们预先设计好的方式来使用资源
封装属性:用private修饰我们的属性
然后为属性提供对应的getXxx()【获取属性值】与setXxx()【设置属性值】
封装方法:用private修饰方法,被修饰的方法只能在本类中使用,所以我们在本类的公共方法里调用这个私有方法
外界如果想要使用这个私有方法的功能,只需要调用这个公共方法就可以了
2.4 面向对象的三大特性:继承
前提 :继承可以实现程序的复用性,减少代码的冗余
我们通过extends关键字建立子类与父类的继承关系:格式:子类 extends 父类
继承相当于子类把父类的功能复制了一份,包括私有资源
注意:虽然私有资源继承了,但是私有资源不可用,原因是被private限制了访问,私有资源只能在本类使用
注意:构造方法不能继承,原因是:构造方法要求名字是本类的类名,我们不能在子类中出现父类名字的构造方法
继承是可以传递的:爷爷的功能会传给爸爸,爸爸的功能会传给孙子
注意:爸爸从爷爷那里继承的功能,也会一起传给孙子
Java的类是单继承的:一个子类只能有一个父类,但是一个父类可以有多个子类
子类在继承了父类以后,如果对父类的功能不满意
可以在不修改父类功能的【满足OCP原则】前提下,在子类中,重写继承过来的这个方法
重写需要满足的规则:两同 两小 一大,我们可以在重写的方法上加@Override注解验证是否写对
继承是一种is a的关系,强耦合,关联性特别强,而且类的继承机会只有一次,要谨慎使用
子类可以直接使用父类的所有非私有资源
2.5 面向对象的三大特性:多态
前提:为了忽略子类型之间的差异,统一看作父类类型,写出更加通用的代码
比如:把Cat看作Animal,把Dog看作Animal,把Bird看作Animal,如果方法需要设置传入的参数,可以buy(Animal a)
比如:把算术异常、输入不匹配异常都看作是Exception,统一捕获处理,只写一个解决方案
概念:在同一时刻,同一个对象,代表的类型不同,拥有多种形态
多态的要求:继承 + 重写
多态的口诀1:父类引用指向子类对象:父类型的引用类型变量保存的是子类对象的地址值
多态的口诀2:编译看左边,运行看右边:
父类中定义的功能,子类才能使用,否则报错
多态中,方法的定义看的是父类的,方法的实现看的是子类重写后的功能

多态中资源的使用:
1)成员变量:使用的是父类的
2)成员方法:对于方法的定义看的都是父类的,对于方法实现,重写后使用的是子类的
3)静态资源:静态资源属于类资源,不存在重写的概念,在哪个类中定义的,就属于哪个类
向上造型与向下造型
1)这两种都属于多态,只不过是多态的两种不同的表现形式
2)向上造型【最常用】
可以把不同的子类型都看作是父类型,比如Parent p = new Child();
比如:花木兰替父从军,被看作是父类型,并且花木兰在从军的时候,不能使用自己的特有功能,比如化妆
3)向下造型
前提:必须得先向上造型,才能向下造型
子类的引用指向子类的对象,但是这个子类对象之前被看作是父类类型,所以需要强制类型转换
Parent p = new Child(); 然后:Child c = (Child) p;
比如:花木兰已经替她爸打完仗了,想回家织布,那么这个时候,一直被看作是父类型的花木兰必须经历“解甲归田”【强制类型转换】这个过程,才能重新被看作成子类类型,使用子类的特有功能
为什么有向下造型:之前被看作是父类类型的子类对象,想使用子类的特有功能,那就需要向下造型
2.6 构造方法
格式 :修饰符 类名当做方法名(){ } 注意:与类同名且没有返回值类型
构造方法作用:用于创建对象,每次new对象时,都会触发对应的构造函数,new几次,触发几次
一个类中默认存在无参构造,如果这个构造不被覆盖的话,我们可以不传参数,直接创建这个类的对象
如果这个类中提供了其他的构造函数,默认的无参构造会被覆盖,所以记得手动添加无参构
构造方法也存在重载的现象:无参构造 含参构造 全参构造【创建对象+给所有的属性赋值】
2.7 this与super
this代表的是本类,super代表的是父类
当本类的成员变量与局部变量同名时,我们可以通过this.变量名指定本类的成员变量
当父类的成员变量与子类的变量同名时,我们可以通过super.变量名指定父类的成员变量
我们可以在本类构造函数的第一行
使用this();调用本类的无参构造 / 使用this(参数); 调用本类对应参数的构造方法
构造函数的调用只有这一种方式,或者创建对象时被动触发,不能在外面自己主动调用
构造函数直接不能互相调用,否则会死循环
我们可以在子类构造函数的第一行
使用super();调用父类的无参构造 / 使用super(参数); 调用父类对应参数的构造方法
注意:子类默认调用super();父类的无参构造,如果父类没有无参构造,需要手动指定调用哪个含参构造
2.8 对象创建的过程
前提:对象是根据类的设定来创建的,目前我们可以在类中添加很多的元素:
属性 方法 静态方法 构造代码块 静态代码块 局部代码块 构造方法…所以不限制类里具体写什么,取决于业务
对象创建的过程:Phone p = new Phone();
需要在堆内存中开辟一块空间,用来存放对象
对象需要完成初始化,比如对应的属性都有自己的对应类型的默认值
对象创建完毕后,会生成一个唯一的地址值用于区分不同的对象
将这个地址值交给引用类型变量来保存
后续如果想要使用这个类的功能,可以从引用类型变量中保存的地址值找到对应的对象做进一步的操作
匿名对象:new Phone();
匿名对象是没有名字的对象,所以创建过程:
需要在堆内存中开辟一块空间,用来存放对象
对象需要完成初始化,比如对应的属性都有自己的对应类型的默认值
对象创建完毕后,会生成一个唯一的地址值用于区分不同的对象
那么我们使用匿名对象只能使用一次,并且一次只能使用一个功能
new Phone().video();//创建匿名对象1,调用看直播的方法
new Phone().message();//创建匿名对象2,调用看发短信的方法
2.9 方法的重写与重载
方法的重写:
继承后,子类想在不改变父类代码的前提下,修改或者拓展功能
重写的规则:两同 两小 一大
1. 子类与父类的方法名要保持一致
2. 子类与父类的方法的参数列表要保持一致
3. 子类的返回值类型小于等于父类方法的返回值,这里说的是继承关系,不是值的大小
4. 子类的抛出异常类型小于等于父类方法抛出的异常类型
5. 子类方法的修饰符大于等于父类方法的修饰符
6. 注意:我们可以使用@Override注解标记这是一个重写的方法

方法的重载:
在同一个类中,存在两个或者两个以上的方法,方法名相同,但参数列表不同的现象
作用:重载提高程序的灵活性,只要用户调用这个方法,不管传入什么参数,都能匹配的上
注意:方法是否构成重载,除了前两项以外,看的是参数的个数与类型,与方法的参数名字没关系
3 面向对象的其他知识点
3.1 代码块与它们的执行顺序
静态代码块 static { }
位置:类里方法外
执行时机:随着类的加载而加载,最先加载到内存,优先于对象进行加载,直到类小消失,它才会消失
作用:一般用来加载那些只需要加载一次并且第一时间就需要加载资源,称作:初始化

构造代码块 { }
位置:类里方法外
执行时机:创建对象时执行,创建几次,执行几次,并且优先于构造方法执行
作用:用于提取所有构造方法的共性功能

局部代码块 { }
位置:方法里
执行时机:当其所处的方法被调用时才会执行
作用:用于限制变量的作用范围,出了局部代码块就失效

代码块之间的顺序:
静态代码块 -> 构造代码块 -> 构造方法 -> 普通方法【如果普通方法里有局部代码块,局部代码块才会执行】

3.2 static
被static修饰的资源统称为静态资源,可以用来修饰变量、方法、代码块、内部类
静态资源属于类资源,随着类的加载而加载,优先于对象进行加载,只加载一次
静态资源可以不通过对象,使用类名直接调用,不需要创建对象
静态资源只有一份,被全局所有对象共享
静态的调用关系:静态资源只能调用静态资源
静态资源是优先于对象的,所以静态资源不能与this和super共用
3.3 final
final表示最终
被final修饰的类是最终类,也称作叶子结点,所以不能被继承
被final修饰的方法是这个方法的最终实现,不能被重写
被final修饰的是常量,值不可以被修改,注意常量定义时必须赋值
3.4 抽象
抽象的关键字是abstract
被abstract修饰的方法是抽象方法,抽象方法没有方法体
如果一个类中出现了一个抽象方法,那么这个类必须被abstract修饰
关于抽象类的特点:
1)抽象类中的方法不做限制 : 全普 / 全抽 / 半普半抽
2)如果一个类中的方法都是普通方法,还要声明成抽象类,为什么?
为了不让外界创建本类的对象
3)抽象类不可以创建对象,所以常用于多态
4)抽象类中包含构造方法,但是不是为了自己创建对象时使用,而是为了子类的super()
5)抽象类中也是可以定义成员变量的
如果一个子类继承了一个抽象父类,有两种解决方案:
1)作为抽象子类:不实现/实现部分 抽象父类中的抽象方法 : ”躺平” 
2)作为普通子类:实现抽象父类中的所有的抽象方法 : “父债子偿”
面向抽象进行编程:后天重构的结果
3.5 接口
接口不是类,定义接口的关键字interface
如果一个类想要实现接口中定义的规则,需要使用implments与接口建立实现关系
注意:如果有任何一个抽象方法没有实现,那么这个类就是一个抽象子类
Java8中接口里的所有方法都是抽象方法
接口中只有静态常量,没有普通变量,会自动拼接public static final
接口中的方法也可以简写,会自动拼接public abstract
接口不可以实例化
接口中也没有构造方法,实现类调用的是它自己父类的构造方法,如果没有明确指定父类,那就是Object的
接口更多的是规则的制定者,不做具体的实现
接口降低了程序的耦合性,更加方便项目的维护与拓展
接口是先天设计的结果,这样可以省去后续的多次重构,节省资源
3.6 接口与类的复杂关系
类与类的关系
Java的类只支持单继承,类与类就是继承关系,并且一个子类只能有一个父类
class Son extends Father{ }

接口与接口的关系
Java的接口是不做限制的,可以多继承
interface Inter1 extends Inter2{ } – Inter1是子接口 Inter2 是父接口
interface Inter1 extends Inter2,Inter3{ } – Inter1 是子接口 Inter2 和 Inter3 都是父接口
注意:如果是情况2的话,接口1的实现类需要实现这三个接口(Inter1,2,3)的所有抽象方法

接口与类的关系
Java中的类对于接口而言是多实现的,所以一个类可以实现多个接口
class InterImpl implements Inter1{}
class InterImpl implements Inter1,Inter2{}

3.7 接口与抽象类的区别
接口是一种用interface定义的类型
抽象类是一种用class定义的类型
接口中的方法都是抽象方法
抽象类中的方法不做限制
接口中的都是静态常量
抽象类中可以写普通的成员变量
接口没有构造方法,不可实例化
抽象类有构造方法,但是也不可以实例化
接口是先天设计的结果,抽象是后天重构的结果
接口可以多继承
抽象类只能单继承
3.7 异常
异常的继承结构
异常层次结构中的根是Throwable
Error:目前我们编码解决不了的问题
Exception:异常
编译异常:未运行代码就报错了,强制要求处理
运行时异常RunTimeException:运行代码才报错,可以通过编译,不强制要求处理
异常的解决方案
捕获处理try-catch–自己解决
格式:
try{
    可能会出现异常的代码
}catch(预测的异常类型 异常的名字){
    预先设计的,捕获到异常的处理方案
}finally{
    异常处理结构中一定会被执行到的代码块,常用来关流
}

向上抛出throws–交给别人解决,在方法定义的两个小括号之间throws,可抛出多个异常,用逗号隔开
不能直接把异常抛给main(),因为调用main()是JVM,没人解决了
注意:是否抛出异常取决于自己的业务,比如暂时不处理或者处理不了需要交给别人处理

3.8 内部类
我们可以把内部类看作是外部类的一个特殊的资源
内部类可以直接使用外部类的所有资源,包括私有资源
外部类如果想要使用内部类的资源,需要创建内部类的对象才能使用
对象的普通创建方式:
 /*外部类名.内部类名 对象名 = 外部类对象.内部类对象*/
Outer.Inner oi = new Outer().new Inner();
1
2
成员内部类
位置:类里方法外
1)被private修饰
被私有化的内部类在main()中是没有办法直接创建其对象的
可以在私有内部类所处的外部类中,创建一个公共的方法供外界调用,这个方法用来返回创建好的私有内部类对象
2) 被static修饰
静态内部类可以不创建外部类对象,直接创建静态内部类对象,格式:Outer3.Inner3 oi = new Outer3.Inner3();
如果静态内部类中还有静态方法,那么我们可以不创建对象
直接通过链式加载的方式调用:Outer3.Inner3.show2();//表示通过外部类名直接找到静态内部类,再找到静态方法
局部内部类
位置:方法里
直接创建外部类对象,调用局部内部类所处的方法,并不会触发局部内部类的功能
需要在外部类中创建局部内部类的对象并且进行调用局部内部类的功能,才能触发内部类的功能
匿名内部类
位置:可运行代码中,比如 main()中
匿名内部类通常与匿名对象【没有名字的对象】一起使用
格式:new Inter1(){ 我这个大括号其实是一个匿名内部类,我来实现方法 }.eat();
如果只是想使用一次接口/抽象类的某个功能,可以使用匿名内部类
匿名内部类+匿名对象的功能:创建实现类+实现方法+方法功能的一次调用【功能三合一】



这篇关于java复习2(面向对象)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程