继承
1.继承
1.1.什么是继承
两个类之间, A类将属性和特征赠予B类。 此时 A类被称为是⽗类, B类被称为是 ⼦
类, 两者之间的关系是 ⼦类继承⾃⽗类
1.2.特点
-
产生继承关系后,子类可以使用父类的属性和方法,也可以定义子类独有的方法
-
Java是单继承一个子类只能有一个父类,但是他可以有多个父类。
-
父类可以有0个或多个子类,子类之间互不影响
-
使用继承可以简化代码,提高代码的复用性投稿代码的拓张性,增强代码的健壮性,最重要的是使类与类之间产生了继承的关系,是堕胎的前提。
-
几种类与类之间的关系
依赖、关联、聚合、组合、继承、实现,它们的耦合度依次增强
依赖:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时, 这两个对象之间主要体现为依赖关系。
关联:分为单向关联和双向关联。在java中,单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。 双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。
聚合:是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:
关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。
组合:是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系, “整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。(谁拥有谁)
继承:表示类与类(或者接口与接口)之间的父子关系。(谁是谁)
实现:表示一个类实现一个或多个接口的方法
1.3.语法
继承, 需要使⽤关键字 extends。 在定义类的时候, 使⽤ ⼦类 extends ⽗类
的⽅式描述继承。
Object类:是java继承体系中所有类的⽗类,Object类没有⽗类.
//Phone类没有显示的⽗类,默认⽗类是Object类
class Phone {}
//Iphone类继承⾃Phone类
class Iphone extends Phone {
}
1.4.不能被继承
构造⽅法
构造⽅法是为了创建当前类的对象的, 不可以继承给⼦类。
私有成员
私有成员只能在当前的类中使⽤, 不可以继承给⼦类。
注意:⽗类的私有成员,在⼦类中可⻅不可⽤
跨包⼦类
默认权限的属性、⽅法, 不可以继承给跨包的⼦类。
1.5.访问权限修饰符
当前类 同包其他类 跨包子类 跨包其他类
private T F F F
default T T F F
protected T T T F
public T T T T
2.方法的重写
2.1重写的原理
子类可以继承来自父类的方法但是当父类的方法不能满足子类的需求时,子类可以重新定义从父类继承而来的方法并完成对父类方法的覆盖,这就是重写
2.2重写的注意事项
- ⽅法名字必须和⽗类⽅法名字相同
- 参数列表必须和⽗类⼀致
- ⼦类⽅法的访问权限需要⼤于等于⽗类⽅法的访问权限,⽗类不能是private
- ⼦类⽅法的返回值类型需要⼩于等于⽗类⽅法的返回值类型–这⾥说的是引⽤类型
2.3@override
这是一个注解,用来检验一个方法是否可以被重写
2.4super关键字
-
子类中使用super实现对父类方法的调用
-
this和super的对比
this:是一种引用数据类型,代表当前对象,保存当前对象的地址
super:代表的是当前对象的父类,可以调用父类成员,但是他不是引用数据类型
3继承中使用构造方法
public class Demo10 {
public static void main(String[] args) {
Animal animal = new Animal("哈雷",10);
Dog dog = new Dog("halei",10,"狗叫");
}
}
class Animal {
String name;
int age;
public Animal(String name,int age) {
this.age=age;
this.name=name;
System.out.println("⽗类中的构造⽅法执⾏");
}
}
class Dog extends Animal {
String voice;
public Dog(String name,int age,String voice) {
//这⾥不显示写,也会默认有super(),调⽤的是⽗类的空参构造⽅法
super(name, age);
/*
super要放在构造⽅法的第⼀⾏:
在⼦类的构造⽅法中有可能⽤到⽗类的属性,⽽属性在使⽤之前必须先进⾏初始化,否则
⽆法使⽤.super的作⽤是初始化⽗类的属性,如果在super之前调⽤了其他的代码,有可
能造成在未对⽗类属性初始化时使⽤了属性的错误情况发⽣,所以系统默认super前⾯不
能放任何代码,this()⽤于构造⽅法调⽤时也要放在第⼀⾏是⼀个道理.
*/
/*
这里一定要调用super:
⽗类中也有属性要进⾏初始化,⽽对象的属性必须由⾃⼰的构造⽅法进⾏初始化,
所以必须调⽤super(),所以每个构造⽅法中都默认有⼀个super()
在⼦类的构造⽅法中,使⽤ super(参数列表) 调⽤⽗类中的有参构造⽅法。
*/
this.voice=voice;
System.out.println("⼦类中的构造⽅法执⾏");
}
}
4.final关键字的使用
4.1.定义
最终的,最后的,被final修饰后,会变成常量,内容不能再改变
4.2.可修饰的内容
1.类:final修饰的类不能有⼦类
2.成员变量:变量是⼀个终值,不能再被改变.所以在定义时必须先⼿动给⼀个值.
3.局部变量:被final修饰的局部变量是⼀个终值,不能再被改变
4.⽅法:final修饰的⽅法不允许重写
4.3.空白final
-
描述:修饰成员变量的⼀种形式
-
如果是⾃定义的类可以在定义时先不给值,但是必须在构造⽅法中给值,即必须保
证属性是被初始化了的.这种情况叫空⽩final.
-
优点:空⽩final在final的使⽤上提供了更⼤的灵活性,因为⼀个类中的final域可以
做到根据对象⽽有所不同,却⼜保持其恒定不变的特性.
5.Object
5.1定义
Object类::是java继承体系中所有类的⽗类,Object类没有⽗类. 作为所有类的⽗类,它⾥⾯有11个⽅法,相当于所有⼦类都默认有这些⽅法,所以都很重要.
5.2常用方法
equals():判断相等
clone(): 创建并返回对象的副本
finalize:垃圾回收
getClass():获取类的字节码文件
hashcode():获取哈希码值(十六进制)
toString(): 返回字符串(按格式打印)
wait():让线程进入阻塞态
notify():唤醒同一锁下的任意一个线程
noyifyAll():唤醒同一把锁下的所有线程