package com.jd.service;
public abstract class Mammal {
public abstract void move();
}//父类
package com.jd.service;
public class Whale extends Mammal {
@Override
public void move() {
System.out.println("靠鳍游动");
}
}//子类
package com.jd.service;
public class Test {
public static void main(String[] args) {
Whale whale = new Whale();
whale.move();
double price = 9;
Mammal mammal = new Whale();
mammal.move();
}
}
/*因为mammal变量类型是Mammal类,所以表面上调用的是Mammal类中的方法;但因为mammal变量保存了new Whale()地址,
*所以再程序运行时JVM根据地址找到new Whale(),实质是new Whale().move(),即运行时调用的是子类重写的方法即多态。
*/
思考:在多态前提下,父类中哪些被子类重写的方法的方法体没有实质的作用——>抽象方法:没有方法体的方法
package com.jd.service;
public abstract Mammal {
public abstract void move();
}//父类中的方法不再有实质性的作用所以move方法变为抽象方法,因为在父类中出现抽象方法,所以父类变为抽象类
一个类中如果有一个抽象方法,则该类必须为抽象类
注意:一个类为抽象类但是其中不一定要有抽象方法。
1、抽象类有构造方法,但是不能创建对象
当我们输入Mammal的构造方法时,编译时并不报错,说明抽象类有默认的构造方法,但是当我们创建对象的时候系统会报错,说明抽象类中不能创建对象。
2、如果一个类没有重写完父类中的所有抽象方法,则该类必须为抽象类
package com.jd.service;
public abstract class Mammal {
public Mammal(){
}
public abstract void move();
public abstract void wave();
}
此时子类会发生报错,因为父类中的wave方法,子类没有完全继承,所以此时子类应该变为抽象类。
package com.jd.service;
public **abstract** class Whale extends Mammal {
@Override
public void move() {
System.out.println("靠鳍游动");
}
}
3、抽象类中可以没有抽象方法
package com.jd.service;
public abstract class Mammal {
public Mammal(){
}
public void move() {
}
public void wave() {
}
}
4、抽象类与普通类的关系:
a、抽象类有abstract 修饰 普通类没有
b、抽象类不能创建对象,普通类可以创建对象
普通类
package com.jd.service;
public class Mammal {
public Mammal(){
}
Mammal mammal = new Mammal();
}
抽象类
此时会发生报错,说明抽象类中不能创建新的对象;
c、抽象类中可以有抽象方法,普通类绝对不能有抽象方法
1、一个抽象类中都是抽象方法,则可以将该抽象类定义成接口
package com.jd.service;
public interface Mammal {
public abstract void move() ;
public abstract void wave();
}
}
2、接口中的抽象方法必须通过一个类来实现 implements 接口 实现类:一个实现了接口中抽象方法的类,因为Whale类实现了接口中抽象方法,所以Whale类即是实现类
1、abstract final class Mammal{ } 能编译通过吗, why?
原因:如果抽象类前面可以添加final就意味着该类无法被继承,也就意味着该抽象类中的抽象方法永远无法得到实现,也就意味着抽象类中的抽象方法是无用的。
2、Mammal抽象类中move抽象方法的访问权限可以为private吗,即“private abstract void move();”, why?
原因:被private修饰的方法其作用范围为本类,如果抽象类中的抽象方法被private修饰就意味着该方法永远无法被实现。
3、Mammal抽象类中move抽象方法可以由static修饰吗,,即“public static abstract void move();” why?
原因:抽象类中的抽象方法如果可以被static修饰就意味着可以使用抽象类的类名来使用该方法,但是该抽象方法没有方法体,不具有使用的价值,所以Java中规定抽象类中不能包含被static修饰的静态抽象方法。