一,继承
1.继承
继承是面向对象的特征之一
Java中的继承
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么,多个类中无需在定义这些属性和行为,只需要和抽取出来的类构成继承关系
(1)继承的优点:
1,继承的出现减少了代码的冗余,提高了代码的复用性
2,继承的出现,更有利于功能的扩展
3,继承的出现让类与类之间产生了is-a的关系,为多态的使用提供了前提。
(2)继承的使用条件:
extend关键字
符合is-a关系的设计,可以使用继承
继承的语法:
通过extends关键字,可以声明一个类B继承另外一个类A,定义格式如下:
[修饰符] class 类 A{
......
}
[修饰符] class 类B extends 类A{
......
}
类B,称为子类/派生类
类A,称为父类/基类
(3)继承性的细节:
1.子类会继承父类中所有的实例方法和实例变量
2.子类不能直接访问父类中私有的(private)的成员变量和方法
3.在Java中,继承的关键字是“extends”,表示子类是对父类的扩展
4.Java支持多层继承(继承体系)
5.一个父类可以同时拥有多个子类
6.Java只支持单继承,不支持多重继承
7.类java.lang.Object,是类层次结构的根类,即所有其他类的父类。每个类都使用Object作为超类
注:当一个类没有显示的继承其他类时,默认继承Object类
2.方法的重写:
(1)产生原因:
父类的方法功能实现不能满足子类需求时,可以对方法进行重写
子类可以对从父类中继承而来的方法进行改造
也称方法的重写为方法地覆盖
注:构造方法,静态方法不能重写,成员变量不存在重写
(2)重写的规则:
1.子类重写的方法必须和父类被重写的方法名称,参数列表相同
2.子类重写的方法的返回值类型与父类保持一致
3.子类重写的方法使用的访问权限不能小于父类被重写方法的访问权限
注:(1)父类私有方法不能重写
(2)跨包的父类默认权限的方法也不能重写
4.子类方法抛出的异常不能大于父类被重写方法的异常
(3)@Override使用说明:
@Override是java定义的注释标签,用来进行标记
写在方法上面,表示此方法是从父类重写而来,用了来检测是不是满足重写方法的要求。
这个注释就算不写,只要格式满足要求,也就是正确的方法覆盖重写。建议保留,这样编译器可以帮助我们检查格式,另外也可以让阅读源代码的程序员清晰的知道这是一个重写的方法。
3.super关键字
在Java类中使用super来调整父类中的指定操作:
super可用于访问父类中定义的属性
super可用于调用父类中定义的成员方法
super可用于在子类构造器中调用父类的构造器
注:
尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
super的追溯不仅限于直接父类还可以是父类的的父类
super和this的用法相像,this代表本来对象的引用,super代表父类的内存空间的标识
误区:不要把super误认为是父类对象,在创建子类对象时,不会创建父类对象
只会将父类中的信息加载到子类对象中存储。
4.继承中的构造方法
1.子类继承父类时,不能继承父类的构造方法。只能通过“super(形参列表)”的方法调用父类指定的构造方法
2.规定super(形参列表),必须声明在构造器的首行。
3.如果在子类构造器的首航没有显示调用super(形参列表),则子类构造器默认调用super(),即调用父类空参的构造器。
4.这么做时为了保证对付类成员进行初始化
常见错误:
如果子类构造器中即未显示调用父类或本类的构造器,且父类中又没有空参的构造器,则编译出错。
二,抽象
1.抽象方法
抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。
首相方法必须使用abstract关键字进行修饰。
2.抽象类
定义:
1.如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
2.抽象类除了不能实例化对象之外,类的其他功能依然存在,成员变量、成员方法和构造方法。
3.使用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。
特点:
1.抽象类不能被实例化,但可以有构造方法,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象
2.抽象类只能用作基类,表示的时一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而以实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。
3.抽象类声明方法:
[访问权限] abstract class 类名{
成员列表
}
抽象类、抽象方法,在软件开发过程中都是设计层面的概念。也就是说,设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能。
三.多态
定义:
父类引用指向子类对象,从而产生多种形态
Aminal dog = new Dog();
Animal cat = newCat();
同一事物,在不同时刻表现不同状态
二者存在直接或间接的继承关系时,父类引用指向子类对象,即形成多态。
当编译类型是父类时,运行期间类型是子类时,称为父类引用指向对象
class Animal{ ……
}
class Cat extends Animal{ ……
}
class Dog extends Animal { ……
}
Animal c = new Cat() //Animal 的引用指向Cat的对象
Animal d = new Dog() //Animal 的引用指向Dog的对象
多态的优点:提高代码的扩展性
class Animal{
void eat() { }
}
class Cat extends Animal{
void eat() { }
}
class Dog extends Animal{
void eat(){ }
}
//方法的形参数类型是父类类型,而传递的实际参数可以是任意子类的对象
method(Animal animal){
animal .eat();
}
多态环境下对成员方法的调用
class Animal{
void show() {
System.out.println(“Anmial");
}
}
class Cat extends Animal{
void show() {
System.out.println(“cat");
}
}……. Animal x = new Cat()
x.show() //调用的是子类中的方法
//简单的说:编译看左边,运行看右边。
向上转型
class Animal{
void eat(){ }
}
class Cat extends Animal{
void eat() {
System.out.println("狗吃骨头");
}
}………
Animal x=new Cat() //向上造型,Cat对象提升到Animal对象
x.eat() //在编译奇迹只能调用父类中定义的方法, 如果子类重写了父类方法,那么运行时
//调用子类重写的方法
向下转型
父类引用仅能访问父类所声明的属性和方法,不能访问子类独有的属性和方法
class Animal{
void eat(){ }
}
class Cat extendsAnimal{
void look() {
System.out.println("看家");
}
} ………
Animal x=new Cat()
x.look();//编译报错,Animal类型中没有look方法
Cat m=(Cat)x; //需要向下转型,转为Cat类型
m.eat() ;
m.look();//子父类中的方法都可以使用
向下转型的作用是:为了使用子类的独有方法
四.final关键字
final的使用:
final用于修饰类,方法,参数,和属性
类:不能被定义为抽象类或是接口,不可被继承
方法:子类里不可以重写
参数:参数值在方法中不可被修改
属性:定义时就必须直接赋值或者在构造方法中进行赋值,并且后期都不能修改
五.接口
可以使用Java接口来实现