第五章笔记继承、接口和抽象类
第一节继承
子类继承父类所有的属性和方法(但不能直接访问private私有成员)根据信息隐藏原则:子类会继承父类所有的方法。可以直接使用子类可以通过调用父类的方法来访问父类的私有成员属性在同样方法名和参数情况下,子类的方法会比父类的方法优先级高
单根继承原则:每个类只能继承一个类Java所有类从javlanObject开始,构建出一个类型继承树
Object类里面默认有clone,equals,finalize,getClass,hashCode,toString等方法
每个Java类必须有构造函数,如果没有定义构造函数,编译器将自动为该类产生一个空的无形参的构造函数
class A(){
public A{} //编译器自动产生一个无参的空构造函数
}
每个子类的构造函数的第一句话,都默认调用父类的无参数构造函数super(),除非子类的构造函数第一句话是super,而且super语句必须放在第一条。
public class A {
public A()
{
System.out.println('111111');
}
public A(int a)
{
System.out.println('222222');
}
}
public class B extends A{
public B()
{
//super(); 编译器自动添加super();B类就调用A类的无参函数
System.out.println('333333');
}
public B(int a)
{
super(a); //已经添加super()且在第一句,编译器不会自动添加;B类调用A类的有参函数
System.out.println('444444');
}
public static void main(String[] a)
{
B obj1 = new B();
System.out.println('==============');
B obj2 = new B(10);
}
}
/* 运行结果:
111111
333333
==============
222222
444444
第二节抽象类和接口
抽象类
类:属性+方法一个完整的类:所有的方法都实现(方法体)一个完整的方法:
方法名(参数)
{
方法体
}
类可以没有方法,但是有方法就一定要实现,才是一个完整的类一个完整的类才可以被实例化new如果一个类暂时有方法没实现,需要被定义为抽象类
若方法只有方法名,形参列表,没有方法体,那所在的类就被定义为抽象类
抽象类关键字abstract抽象类的组成—成员变量,不限个数—具体方法,方法有实现,不限个数—抽象方法,加abstract关键字,不限个数Tips:如果有一个方法是abstract,那么类也必须是abstract
抽象类也是类。如果一个类继承于抽象类,就不能再继承其他(抽象)类子类也可以继承抽象类,但必须实现父类全部abstract方法,如果不能完全实现,就必须加上abstract关键字定义为抽象类
接口
如果类的方法全部没有实现,那这个类就叫一个接口interface
类只能继承(extends)一个类,但可以实现(implement)多个接口,继承和实现可以同时
extends必须写在implement前面
实现多个接口,必须实现接口中定义的所有方法接口设计弥补单根继承的不足
抽象类和接口的异同
相同点
两者都不能被实例化,不能new操作
不同点
抽象类abstract,接口interface抽象类可以有部分方法实现,接口所有方法不能实现一个类只能继承(extends)一个(抽象)类,实现(implement)多个接口接口可以继承(extends)多个接口抽象类有构造函数,接口没有构造函数抽象类可以有main,也能运行,接口没有main函数抽象类方法可以有private/protected,接口方法都是public
第三节转型、多态和契约设计
类转型
类型可以相互转型,但只限制于有继承关系的类—子类可以转换成父类,而父类不可以转换为子类—子类继承父类所有的方法属性,子类可以变成父类(从大变小,即向上转型);从父类直接变成子类(从小变大,即向下转型)则不允许
父类转为子类有一种情况例外,就是这个父类本身就是从子类转化过来的
Human obj1 = new Man();
Man obj2 = (Man) obj1;//obj1本身起源就来自Man
多态
类型转换,带来的作用就是多态子类继承父类的所有方法,但子类可以重新定义一个名字、参数和父类一样的方法这种行为就是重写(覆写,覆盖),而重载是指函数名一样,形参不一样子类的方法优先级高于父类
public class Human {
int height;
int weight;
public void eat() {
System.out.println('I can eat!');
}
}
public class Man extends Human {
public void eat() {
System.out.println('I can eat more');
}
public void plough() { }
public static void main(String[] a) {
Man obj1 = new Man();
obj1.eat(); // call Man.eat()
Human obj2 = (Human) obj1;//obj2转型之前是obj1,Man类型,所以obj2本质也是Man
obj2.eat(); // call Man.eat()
Man obj3 = (Man) obj2;
obj3.eat(); // call Man.eat()
obj1==obj2;//true
obj1==obj3;//true
//三者指向同一内存,调用的是同一个方法eat
}
}
多态的作用—以同一的接口来操纵某一类中不同对象的动态行为—对象之间的解耦
public class Cat implements Animal
{
public void eat() {
System.out.println('Cat: I can eat');
}
public void move(){
System.out.println('Cat: I can move');
}
}
public class Dog implements Animal
{
public void eat() {
System.out.println('Dog: I can eat');
}
public void move() {
System.out.println('Dog: I can move');
}
}
契约设计
契约:规定规范了对象应该包含的行为方法接口定义了方法的名称、参数和返回值,规范了派生类的行为基于接口,利用转型和多态,不影响真正方法的调用,将调用类和备用类解耦
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点