继承中的问题
- 用extends关键字实现继承
- 在子类只能继承父类中的非私有方法。
- final修饰的类不能被继承。
- 子类不能继承父类的构造方法,但是默认在子类中会调用父类的无参构造方法,即子类的构造方法中第一句默认为super()。
- java只能单继承,就是每个类只能继承一个类,但java支持多层继承,及子类的父类还可以继承一个类。(java中Object类是java的根类,是所有类的父类)。
//单继承和多层继承
class grandfather{
}
class father extends grsndfather{
}
class son extends father{
}
- 子类不能重写父类中的私有方法。
- 子类重写父类的方法时,方法的访问权限不能比父类中的低。
注意:
- 我们没有在类中写构造方法时,系统会默认添加无参构造方法。如果我们在类中添加了有参构造方法,那么也要重写无参构造方法,因为我们一旦自己写了构造方法,系统就不会再默认添加无参构造。
- 当父类中不存在无参构造方法时,调用子类的构造方法就会出错。解决办法:1,在父类中添加无参构造。2,在子类构造方法第一句用super显示调用父类带参构造。(保证在完成子类初始化之前先完成父类的初始化)
- this关键字和super关键字
this关键字代表所在类的对象引用,方法被哪个对象调用,this就代表那个对象
super代表父类存储空间的标识。(可以理解为父类的引用) - 什么时候使用继承呢?
符合is-a的关系情况下可以使用继承来提高代码的复用性。例如:猫和动物,狗和动物这种关系,因为我们完全可以说猫是一种动物,狗是一种动物。这样父类中定义一些通用的方法,子类继承父类,就可以直接重写这些方法实现自己的功能,而不需要再自己定义这些方法。
多态中的问题
- 多态(同一事物在不同时刻的不同状态)
- 多态的前提:1.有继承关系,2.有方法重写,3.有父类引用指向子类对象 (向上转型)
//向上转型
class F{
void show(){...};
}
class Z extends F{
void show(){...};//子类冲重写父类的show方法
void call(){...}
}
F f=new Z();//父类的引用指向子类对象
/*多态访问中成员的特点:
成员变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
静态方法:编译看左边,运行看右边
*/
- 多态的好处:程序扩展性好。
多态的弊端:父类不能使用子类特有的功能
解决办法:向下转型(即将父类的引用赋给子类的对象)
F f =new F();
Z z=(Z) f;//进行类型的强制转换(向下转型)
z.show();
z.call();//子类的方法也可以调用
//此时z可以调用子类的方法。
抽象中的问题
- 用关键字abstract修饰
- 抽象类中可以没有抽象方法
- 有抽象方法的类一定是抽象类
- 抽象类有构造方法。但不能实例化
- 抽象类中的方法只需要给出方法声明,而不需要实现
注意
- 子类问题:子类还是抽象类时,也只需要声明方法即可。子类不是抽象类时:需要实现父类中所有的抽象方法。
- 父类成员方法为抽象方法时,是强制子类必须实现的方法。
- abstract不能同以下关键字共存:和private冲突(子类必须实现父类中抽象方法,声明为private,子类就无法继承),和final冲突(final修饰就不可以修改,而子类需要重写抽象方法,得到具体实现。)和static用 无意义(static修饰的成员属于类成员,也就是说被static修饰的是与类关联的,子类是无法拥有的)
接口中的问题
- 使用interface关键字修饰
- 使用implements关键字实现
interface B{
}//接口
class A{
}//类
class A implements B{
}//A类实现B类,需要实现接口B中的方法。
- 接口中成员的特点:
成员变量,默认修饰符 public static final 静态的常量
构造方法:没有构造方法
成员方法:默认public abstract 抽象的方法,因为我们在接口中也只是对方法进行声明,而不具体实现,具体的实现都交给实现此接口的类来完成。 - 接口继承了object类。
注意
- 类与类之间的关系:继承(单继承和多层继承)
- 类与接口之间的关系:类实现接口(一个类可以实现多个接口)
//多个接口之间用,分开
class A implements B,C,D...{
}//B,C,D都是接口
- 接口与接口之间的关系:多继承(一个接口可以继承多个接口)
- 接口与抽象类的区别:
成员区别:1,成员变量:抽象类的成员变量可以是变量,也可以是常量,而接接口的成员变量只能是常量。 2,构造方法: 抽象类有构造方法(但是不能实例化),接口没有构造方法。 3,成员方法: 抽象类中可以抽象和非抽象方法,接口中只能是抽象方法。
设计理念: 通常我们使用抽象类完成is-a的关系,即继承,我们将一类事物的最基本的功能抽象出来,设计在一个基本的父类中,将这些方法定义为抽象的,要求属于这一类的事物必须完成或者实现这些功能。【例如:手机这类事物最基本的功能有电话服务和短信服务,所以我们要求所有的手机都要完成这两个最基本的功能。】
而接口通常来完成like-a的关系,作为扩展,当某个类需要完成一些特有功能,我们只需要实现有这些特有功能的接口。【例如:手机需要扩展音乐的功能,打游戏,视频等等功能,我们就实现这些接口来扩展它的功能。】
(个人学习总结,仅供参考,有误请指正,谢谢)