关于抽象类:
abstract:抽象的
可以修饰:类,成员方法
修饰的类:抽象类
抽象类的特点:抽象类中可以有抽象方法也可以没有抽象方法
1.构造方法:
抽象类中允许有构造方法,但是抽象类不能创建本类对象,抽象类中的构造方法是给成员变量赋值或去加载抽象类的父类
2.成员变量:
抽象类中允许有成员变量
3.自定义常量:
抽象类中允许有自定义常量
4.普通方法:(普通方法和普通的静态成员方法)
抽象类中允许有普通方法
5.抽象方法:
抽象类中可以有抽象方法也可以没有抽象方法
抽象类的使用:一般是作为父类存在,当父类中的某个方法子类们实现的方式各不相同,所以要把父类中的该方法定义成抽象方法;
子类继承抽象类:
1.要么实现抽象父类中所有的抽象方法;-->空实现也是实现
2.要么把自己也变成抽象类;
修饰成员方法:抽象方法
抽象方法必须存在于抽象类或者接口中;
关于接口:
接口:比抽象类更抽象的类
接口的定义格式:
public interface 接口名{
}
接口中的成员:
构造方法:接口不可以直接创建对象,也没有构造方法;
JDK1.7之后:
1.接口中只能有自定义常量
2.接口中只能由抽象方法
JDK1.8之后:
1.接口中增加 默认方法
格式:
public default 返回值类型 方法名(形式参数列表){
方法体;
return 返回值;
}
作用:补充接口中以前没有完成的功能;
使用:
1.接口的子类对象直接调用
2.当子类实现父接口的时候可以不重写父类的默认方法;
2.接口中增加 静态方法
格式:
public static 返回值类型 方法名(形式参数列表){
方法体;
return 返回值;
}
作用:补充接口中以前没有完成的功能;
使用:
1.只能使用接口名直接调用;
JDK1.9之后:
1.私有方法:
格式:
private 返回值类型 方法名(形式参数列表){
方法体;
return 返回值;
}
作用:只为接口中的默认方法和静态方法服务
接口的使用:
格式:
public class 子类名 implements 接口名1,接口名2..{
}
注意:
子类可以实现多个接口,实现多个接口要实现接口中所有的抽象方法或者把子类自己也变成抽象类;
一个类继承一个父类还要实现多个接口的格式:
public class 子类名 extends 父类名 implements 接口名1,接口名2..{
}
接口的好处:
1.打破了继承的单一性
2.拓展了程序的功能
3.约束了子类(实现类)的行为
接口的思想:
1.提供规则,规范 所以接口中的成员都被 public 修饰
2.从父类往子类看:约束了子类的行为
3.从子类往父类看:拓展了子类的功能
类与类,类与接口,类与抽象类,接口与接口之间的关系:
类与类之间的关系:继承关系 单一继承,多层继承
类与抽象类之间的关系:继承关系 单一继承,多层继承
类与接口之间的关系:实现关系 多实现
接口与接口之间的关系:继承关系(Java中特殊的继承) 多继承
抽象类和接口的区别:
不同点:
1.构造方法:
抽象类中允许有构造方法
接口中没有构造方法
2.成员变量:
抽象类中允许有成员变量
接口中不允许有成员变量
3.自定义常量:
抽象类中允许有自定义常量
接口中只能有自定义常量
4.普通成员方法:
抽象类中允许有普通方法
接口中不允许有普通方法
5.抽象方法:
抽象类中可以有抽象方法也可以没有抽象方法
接口中只允许有抽象方法
相同点:
1.接口和抽象类都不可以创建对象;
2.接口和抽象类中都可以有抽象方法;
3.接口和抽象类一般都是作为父类存在;
什么时候用抽象类 什么时候用接口:
当一个类 需要有 成员变量和普通方法和抽象方法的时候,只能选抽象类;
当一个类只有自定义常量和抽象方法,可以选接口
关于静态的内存图:
我们可以看到,在方法区中,一个字节码文件的空间里,又分为静态区和非静态区