继承 (is a 的关系)
上面我创建的这两个类,我们可以发现 age name toGether都是相同的.那么在实际项目中我们为了避免一次不用写这么多相同的代码引出了继承这一概念.什么是继承呢?
继承
:在多个类当中若是存在相同的行为属性和行为时,则将这些内容单独写入一个类当中,其他类就不用在重新定义了,只需要继承就可.
像 Family这样的类 我们称之为父类 基类 或超类
而 Mother这样的类 我们称之为子类 派生类
继承:提高了代码的维护性
一个类中的代码可以多次使用
一些tips:
1.Java中子类只能继承一个类,只支持单继承
2.子类继承了父类除构造方法之外的所有类
3.父类的私有方法只能继承不能访问 父类的私有方法和私有属性不能在子类中被访问
4.子类继承了父类 子类当中包含父类属性
super关键字: 代表父类对象的引用 super必须放第一行
super() :调用父类的构造方法
super.data:调用父类的属性
super.func():调用父类的成员方法
与this区别! ! !
Java 中对于字段和方法共有四种访问权限
private: 类内部能访问, 类外部不能访问
默认(也叫包访问权限): 类内部能访问, 同一个包中的类可以访问, 其他类不能访问.
protected: 类内部能访问, 子类和同一个包中的类可以访问, 其他类不能访问.
public:类内类调用者都可以被访问.
多态
向上转型
(代码注释可以更加细致的理解哦!)
1.直接赋值
2.传参
3.返回值*
运行时期绑定(动态绑定)前提
1.必须发生向上转型 即父类引用了子类
2.子类和父类有同名的覆盖方法(重写方法)
3.通过父类的引用调用该重写方法
多态
:顾名思义 一种新式多种形态(封装的进一步封装)
1.多态? 什么叫多态?
父类引用子类对象,子类和父类有同名的重写方法,通过父类调用重写方法
2.多态的优点 :成本大大降低
简化代码
容易扩展
多态一定发生向上转型 核心:父类引用子类 发生重写
一个大大的例子:
图中我们先写一个父类 父类中关于画什么 我不关心怎么画我也不关心
如果要花一个圆我将写一个子类去画⚪ 写的时候要写上重写方法并在内部写上你想实现的过程 画其他雷同
第一种打印方法
第二种 写一个方法实现
第三种 使用数组 (for each循环)
方法重写(override)
方法名相同,返回值类型相同,参数类型个数相同,有继承关系.
**注意:**静态方法不能被重写
private不行因为它权限最小
子类的访问权限一定大于等于父类
重写的时候最上面加上@override标注
与之前写过的重载区分清楚!
向下转型
前提:必须发生同等类型的向上转型
但是向下转型并不安全 为了安全起见我们最好加上instanceof判断animal是不是bird的实列. if (animal istanceof Bird) 然后在进行强转
在构造方法中调用重写方法(一个坑)
构造D对象时,会调用A的构造方法
A中调用了func(),此时会动态绑定 调用D中的func
D自己还未构造,为0
构造函数当中会发生运行时绑定吗? 可以!
对于没有在同一个类当中的运行顺序来说
初始化一个Derive,会先去实现父类方法的Static类型 再去实现子类的Static 接着是父类的实例代码块和构造方法 最后实现子类的实例代码块和构造方法
抽象类(不能被final修饰)
1.包含抽象方法的类 用关键字abstract修饰
2.与普通类不一样的是:包含了抽象的方法 就是说不能有 { }
3.不能被实例化 不可以new
4.是用来被继承的 可拥有方法或普通类的数据成员
5.抽象方法不能是私有的,也不能有static
6.只要有一个类继承了抽象类,必须重写抽象类的方法 如果不想写将这个类变成抽象类
整理总结
*抽象类与普通类的区别
1.关键字:抽象类的关键字是abstract 而普通类可以是public private protected
2.抽象类不能有主体,但是普通类可以
3.继承:抽象类要想继承子类必须实现他的构造方法,普通类可以不用
4.抽象类无法实例化普通类可以
5.抽象类不能用static 普通类可以
6.抽象类的方法在扩展性和延伸性方面要比普通类的好
接口(比抽象还抽象)
1.用关键字interface修饰
2.数据成员是默认常量 public static final…
3.成员方法默认为抽象方法
4.不能定义一个已经实现了的方法
5.jdk1.8中可以定义一个已经实现的方法 但是必须被default修饰
6.类和接口的实现 class circle implements shape() {重写方法 }
7.implements可实现多继承问题
8.还是无法被实例化
9.实现该接口的重写方法时 public不能省略
10.接口和接口之间不能interface 但可以通过extends多个接口
整理总结
: 抽象类与接口的区别
1.关键字:abstract修饰抽象类 interface修饰接口
2.数据成员:抽象类是普通的 接口是默认的 public static final
3.抽象类要被子类继承,接口要被类实现。
4.接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
5.抽象类是各种权限 接口只能是public
6.子类限制:一个子类只能继承一个抽象类但是一个子类可以实现多个接口
7.抽象类是普通类+抽象方法 接口是抽象方法+全局常量
comparable的比较
1.搭建构造方法
2.构造toString的重写方法(没有这个打印出来的是一些哈希值)
3.写comparable的重写方法(不写程序会报出异常)
在这里由于我是按照年龄从小到大排列所以代码最后的运行结果如下:
*
cloneable接口(实现深拷贝)
实例
想克隆自定义类型
1.实现接口
为何接口是空接口呢?
如果一个类实现这个标记接口就证明这个类是可被clone的
2.需要重写一个Object方法
一.通过people1.age不影响people people.age是简单类型
二.引用类型(实现深拷贝)
不写这个并且money没有cloneable的时候发生浅拷贝,在你对people1修改的时候,people的值也会被修改
此时在修改people1的值的时候我们就会发现只修改了people1,实现深拷贝