多态的内存分析:
栈(自动分配连续的空间,后进先出)放置:局部变量
堆(不连续)堆:放置new出的对象
方法区(也是堆)存放:类的代码信息、static变量、常量池
HttpServlet对象:
service(this, super)
doGet(this, super)
MyServlet对象:
doGet(this, super)(里边的this指的是整个对象)
抽象类:包含了抽象方法的类
抽象方法:只有方法的声明,没有方法体
有抽象方法的类只能定义为能抽象的类
抽象类不能实例化,及不能用new来实例化抽象类
抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
抽象类只能用来继承
抽象方法必须被子类实现
package cn.mjc.oo.polymorphism.myServlet;
public class Test {
public static void main(String[] args) {
HttpServlet s = new MyServlet();
s.service();
s.doGet();
}
}
接口(设计跟实现的分离):
本质是契约
比抽象类还要抽象的类
接口中只有:常量、抽象方法
public static final 接口中常量定义时,写或不写都是这样
public abstract 接口中方法定义时,写或不写都是这样
一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的
接口可以多继承
package cn.mjc.oo.testInterface;
public interface Flyable {
int MAX_SPEED = 11000;
int MIN_HEIGHT = 1;
void fly();
}
interface Attack{
void attack();
}
class Plane implements Flyable{
@Override
public void fly() {
System.out.println("飞机依靠发动机在飞");
}
}
class Man implements Flyable{
@Override
public void fly() {
System.out.println("跳起来,飞!");
}
}
class Stone implements Flyable, Attack{
@Override
public void fly() {
System.out.println("被人扔出去");
}
@Override
public void attack() {
System.out.println("砸人");
}
}