——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
继承的特点:关键字是:extends
继承就是为了提高代码的复用性而产生的,它可以让代码变得更简洁。它主要是由父类跟子类组成的,一个父类可以有N多个子类,而父类里面的东西就是众多子类的共性,包括变量、方法。子类中可以建立自己特有的成员,也可以覆盖父类中的方法。
关于子父类构造函数:
当子类初始化时,父类也会运行,子类的构造函数的第一行默认有一个隐藏的语句super() , 但如果父类没有空参数的构造函数时,子类要手动加一个super语句调用父类的构造函数,如super(name)。
抽象类是在继承的基础上发展来,关键字是:abstract
如果一个类中有一个用abstract修饰的抽象方法,那么该类就肯定是一个抽象类,也要用abstract修饰。
当一个方法的具体内容是不确定的,因为不同子类的该方法的内容都不一样,那么可以把该方法定义为抽象方法,让抽象类的子类来重写该方法。
定义功能中有确定和不确定的元素时,可以用到模板方法设计模式,
譬如下面的 ‘代码运行计时程序’:
abstract class GetTime{
public final void getTime(){ //被final修饰的方法是不能被重写的
long start = System.currentTimeMillis(); //该方法是返回当前毫秒数
runcode(); //调用抽象方法,让子类重写的代码执行
long end = System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}
abstract void runcode(); //因为代码不确定,所以把方法定义为抽象方法,让当前类的子类来重写
}
class SubTime extends GetTime{ //子类继承父类
public void runcode(){ //重写父类的抽象方法
for(int x=0;x<300;x++){
System.out.println(x);
}
}
}
public class Moban {
public static void main(String[] args){
SubTime s=new SubTime();
s.getTime();
}
}
接口:全是抽象方法组成。 关键字是:interface
接口与类之间是实现关系:implements
接口与接口之间是继承关系:extends,比较特殊,可以是多继承
因为它权限是最大的,所以实现它的子类的方法权限也要是最大的(public)
它对扩展功能有很大重要性。
abstract class Student{ //因为类中有抽象方法,所以要定义成抽象类
abstract void study(); //学习是每个学生都要的,但是学习的方法具体不一样,这个不明确,所以可以抽象
void sleep(){
System.out.println("sleep"); //这里的睡觉是一样,普通方法
}
}
interface Smoking{ //抽烟为什么要用接口呢,因为抽烟不是每个学生都会抽烟,这个不一定的元素
void smoke(); //这里表现出接口的拓展功能,就是在需要的类中实现该接口就可以新增功能
} //接口里面的方法默认是public abstract类型
class ZhangSan extends Student implements Smoking{
void study(){ //张三重写‘学习’方法,定义自己的方法
System.out.println("我喜欢一个人静静学习");
}
public void smoke(){ //这里可以实现抽烟这个接口,说明张三抽烟,有抽烟功能
System.out.println("我会抽烟");
}
}
class Lisi extends Student{ //因为李四不抽烟,所以不实现抽烟接口
void study(){
System.out.println("我喜欢一大堆人一起讨论学习");
}
}
public class interfaceTest {
public static void main(String[] args){
ZhangSan zs=new ZhangSan();
zs.study();
zs.smoke();
Lisi ls=new Lisi();
ls.study();
}
}
多态:也是在继承的基础上才发生的。
具体体现是:父类的引用指向自己的子类对象。
子类一般会把父类中的方法覆盖掉,所以不同子类的方法内容会有所不同,通过父类的引用调用方法,具体会按照指向哪个子类对象去调用相应的子类方法。
下面是多态的例子:
abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
public void eat(){ //重写父类的方法
System.out.println("吃鱼");
}
public void catchMouse(){ //特定的技能
System.out.println("抓老鼠");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("吃骨头");
}
public void kanJia(){
System.out.println("看家");
}
}
public class DuoTai {
public static void main(String[] args){
Animal a=new Cat(); //类型提升,向上转型
a.eat();
Cat c=(Cat)a; //强制将父类的引用,转成子类类型,向下转型
c.catchMouse();
function(new Cat());
function(new Dog());
}
public static void function(Animal a){
a.eat();
if(a instanceof Cat){ //instanceof 看是否属于什么类
Cat c=(Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog d=(Dog)a;
d.kanJia();
}
}
}