java面向对象

1面向对象特性

1.1:继承

继承是子类继承父类的特征和行为, 能使得‘
a.子类对象(实例)具有父类的实例域和方法
b.子类从父类继承方法,使得子类具有父类相同的行为

1.2 多态

a.多态是同一个行为具有多个不同表现形式或形态的能力
b.多态就是同一个接口, 使用不同的实例而执行不同操作
c.同一个事件发生在不同的对象上会产生不同的结果

1.3 封装

a.封装是一种将抽象性函数接口的实现细节部分包装,隐藏起来的方法
b.封装被认为是一种保护屏障, 防止该类的代码和数据被外部类定义的代码随机访问
c.封装特性要i求, 访问该类的代码和数据,必须通过严格的接口控制
d.封装的目的是,在修改代码的时候只需要修改实现代码的片段,而不用修改调用代码片段
e.适当的封装可以让代码更容易理解与维护, 也增强了程式码的安全性

2继承

2.1java中的继承体系

1.java中使用extends关键字来表示类继承关系
2.java使用implement关键字来表示接口实现关系
3.Java类继承体系是单继承, 接口继承体系是多实现
4.Java也可以使用类的内部方式来实现类的多实现关系
5.Java的继承初始化关系:
父类对象属性初始化 -> 父类对象构造方法 -> 子类对象属性初始化 -> 子类对象构造方法

2.2 Java方法覆写

1.Java允许=子类对父类的方法进行重写, 当调用方法时会优先调用子类的方法
2.如果仅是方法名相同,那么此类操作称为重载, 而不是覆写
3.只有返回值类型、方法名、类型参数及个数都与父类继承的方法相同时,才能进行覆写
4.对于覆写的方法,我们一般使用@Override注解标注, 有助于静态检查

2.3 抽象类 Abstract Class

1.抽象类里面可以没有抽象方法
2.抽象类既可以对方法进行声明也可以对方法进行实现, 还能定义final方法
3.如果一个类里面有抽象方法, 那么这个类一定时抽象类
4.抽象类里面的方法都要被实现,所以抽象方法不能是静态的static, 也不能是私有的private
5.抽象类中抽象方法必须被子类=全部实现, 如果子类不能全部实现, 那么子类也必须是抽象类
6.不能直接被实例化

2.4 接口 Interface

1.Interface可以使用反射的代理方法, 但Abstract Class无法实现反射代理
2.Interface可以继承接口,甚至可以继承多个接口, 但是类只能继承一个类
3.Interface里面的方法只能声明,不能有具体的实现(但在java 8中引入了default关键字, 此关键字标注接口方法后,允许接口进行默认实现)
4.接口里面的方法必须被子类全部实现, 如果子类不能全部实现,那么子类必须位抽象类
5.不能直接被抽象化
在实际编程过程中,建议将继承多用于is-a的关系, 将接口看做是has-a的关系。uses-a是依赖关系。抽象类功能较之接口虽多,但扩展性不如接口,优先使用接口来解决问题

2.5 final关键字

1.final修饰类,则该类不允许被继承
2.final修饰方法,则该方法不允许被覆写
3.final修饰属性,则该类的该属性不会进行隐式的初始化, 构造方法中不许唯一的赋值
4.final修饰变量,则该变量的值只能赋一次值, 在声明变量的时候才能赋值,即变为常量

2.6 this关键字

1.在类中作为关键字,可以引用成员变量、方法、以及当前对象的引用
2.作为构造方法, 只能在构造方法中通过this来调用其他构造方法且要放在首行,普通方法中不能使用
3.不能 通过this递归调用构造方法

2.7 super关键字

1.如果自己用super关键字在子类调用父类的构造方法,则必须在子类的构造方法中的第一行
2.如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法
3.如果子类构造方法中既没有显示调用父类的构造方法, 而父类没有无参的构造方法,则编译出错
注意:super.getClass()和this.getClass()返回的都是new对象时指定的类

3多态

3.1多态的特点

1.可替换性,父类的引用可以替换成任意子类
2.可扩充性,增加新的子类不会影响已存在类的多态性,继承性,以及其他的特性的运行和操作,实际上新加子类更容易获得多态功能
3.接口性,父类通过方法签名,向子类提供一个共同接口,由子类来完善或者覆盖它而实现
4.灵活性:在应用中体现灵活多样的操作,提高了使用效率
5.简化性:简化对应用软件的代码编写或修改过程,在处理大量对象的运算和操作时尤为重要

3.22多态的表现形式

引用多态:向上类型转换(隐式类型转换, 父类-> 子类);向下类型转换(强制类型转换, 子类-> 父类)
使用instanceof运算符,解决引用对象的类型,避免类型转换的安全性问题
方法多态:
1.创建本类对象时,调用本类的方法;创建子类对象时,调用位子类重写方法或者继承的方法
2.重载(Overload):一个同名方法可以传入多个参数组合
3.覆写(Override)由于继承关系中的子类有一个和父类同名参数的方法,会覆盖父类的方法
4.基本数据类型参在一个方法匹配调用顺序 char->int->long->double, 同时也会进行自动装箱,调用包装类方法

4封装

java中访问修饰符
在这里插入图片描述

4.1Java中封装步骤

1.修改属性可见性为private
2.为属性创建getter和setter方法
3.getter和setter方法中加入合法性判断等校验

4.2 内部类

1.内部类可分为静态内部类,成员内部类,方法内部类, 匿名内部类
2.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
3.内部类的方法可以直接访问外部类的所以数据,包括私有的数据
3.内部类可以帮助实现多继承功能,但不建议使用,提倡使用interface来实现多继承概念

5泛型

5.1 泛型的概念

1.泛型类型在定义类,接口和方法时可作为参数
2.类似方法声明时使用的形式参数一样,泛型中提供的时类型参数(types parameters)
3.类型参数输入的时类型;类型参水可以为一个,也可以为多个
4.泛型机制能使用不同的输入去重用同样的代码

5.2 泛型的优势

1.在编译阶段进行更强的类型检查
2.消除强制类型的转换
3.实现泛化算法,提高通用性,如集合ArrayList等

5.3 泛型的分类

1类泛型:例如 public class DemoClass {}
2方法类型: public void DemoMethod(T e){}
3接口泛型:public interface DemoInterface{}

5.4 有界型参数

1有界类型: public class DemoClass{}
2多界类型:public class DemoClass<T extends A & B & C> {}

5.5子类化

以Collection为例,ArrayList实现List ,List继承Collection,有以下结论:
ArrayList是List的子类, List是Collection的子类
特别注意的是List不是List的子类

5.6通配符

java中使用问号(?)作为通配符,表示未知类型,可分为上界,无界,下界三种类型
1上界通配符:public void DemoMethod(List<? extends A> list){}
2.无界通配符:public void DemoMethod(List<?> list){}
3.下界通配符:public void DemoMethod(List<? super A> list){}

5.7 类型判断

泛型方法引入了类型判断,无需再尖括号<>里指定一个类型
Map<String, Object> demoMap = new HashMap<>(); 若省略尖括号,则编译器会发出未经检查告警

5.8 类型擦除

1.使用泛型类的界或者Object对象来替换所有的类型参数
2.类型擦除会保证参数化类型没有新的类创建;所以泛型不会产生运行时的开销
3.创建桥方法(合成出重载方法)以保证泛型类型继承中的多态

5.9 不可具体化类型

编译期间类型信息被类型擦除机制擦除的类型 - 未被定义为无界通配符的泛型类型的调用, 例如
List 和List 时不可具体化类型, JVM不能再运行时区别这些类型

5.10 堆污染

1.再混合类型和参数化类型时,或在执行未检查类型转化时, 会发生堆污染
2.不可具体化类型的可变参数方法存在潜在堆污染风险
3.添加@SafeVarargs来防止不可具体化类型的可变参数方法的警告

5.11 泛型的限制

1.不能使用基本数据类型实例化泛型类型
Pair<int, char> p;
2.不能创建类型变量实例
E elem = new E();
3.不能声明类型变量为静态属性
private static T t;
3.不能使用参数化类型来做类型转化或者instanceof判断
List list; Boolean flah = list instanceof ArrayList;
4.不能创建参数化类型数组
List[] arrayOfList = new List[2];
5.不能创建、捕获或者抛出参数化类型对象
class MathException extends Exception{}
6、不能重载形式参数化类型擦除后为相同的原始类型的方法
public void priint(Set strSet){}
public void priint(Set strSet){}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值