抽象类
由于继承这个显著特点,我们可以将子类设计的更加具体,而父类更加一般化,通用化。父类可以封装不同子类的共同特征或者共同行为.而有的时候,父类中封装的方法无法具体完成子类中需要的逻辑,因此我们可以将此方法设计成抽象方法,即使用关键字abstract进行修饰。而有抽象方法的类,也必须使用abstract关键字进行修饰,因此我们称之为抽象类
无{},有abstract 有抽象方法的类是抽象类 子类要实现父类的所有抽象方法,或子类也声明为抽象类 不能final 可以没有抽象方法 不能实例化(new)调用构造器,可以提供构造器
public abstract class Animal {
private String name;
private int age;
private String color;
public Animal() {}
public Animal(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
// 抽象方法
public abstract void noise();
}
class Dog extends Animal{
public Dog() {
}
public Dog(String name, int age, String color) {
super(name, age, color);
}
public void lookHouse(){
System.out.println("~~看家~~");
}
public void noise(){
System.out.println("~~汪汪汪~~");
}
}
class Cat extends Animal{
public void getMouse(){
System.out.println("~~可以抓耗子~~");
}
public void noise(){
System.out.println("~~喵喵喵~~");
}
}
// 如果不想实现抽象类里的抽象方法,该类需要使用abstract修饰
abstract class Duck extends Animal{
public void swim(){}
}
接口
接口特点
- 使用interface进行定义
- 可以提供成员变量,默认提供public static final进行修饰
- 可以提供成员方法,默认使用public abtract进行修饰
- 接口中不能存在构造器,接口不能实例化,没有任何意义
实现接口
1) 与继承不同,一个类可以实现多个接口。接口间使用逗号分开。
2) 使用关键字implements进行实现,必须实现接口中的所有抽象方法
3) 若一个类中没有全部实现接口中的抽象方法,那么该类需要使用abstract声明成抽象类
接口间的继承
1)接口之间可以存在继承关系,即一个接口通过关键字extends可以继承另一个接口。
2)子接口继承了父接口中的所有抽象方法
public interface IntefaceA {
double PI = 3.14;
public static final double NUM = 0.618;
void showInfo();
public abstract int sum(int a, int b);
}
/**
* 5. 一个类实现接口,需要使用关键字implements
* 6. 一个类实现接口时,需要实现里面的所有抽象方法,否则需要使用abstract修饰class
*/
class ClassA implements IntefaceA {
public void showInfo() {}
public int sum(int a, int b) {
return a + b;
}
}
abstract class ClassB implements IntefaceA {
public void showInfo() {}
}
JDK1.8以后的接口新特性
1. 提供了默认方法:使用default修饰词修饰的具有方法体的方法。 --1)该方法,默认使用public修饰, --2)该方法,逻辑不能满足子类时,子类可以重写 2. 提供了静态方法:使用static修饰的具有方法体的方法 --1)该方法,默认使用public修饰
public interface InterfaceM {
default void print(){
System.out.println("--欢迎来到中国,我的家--");
}
static void print2(){
System.out.println("--地球只有一个,人人有责---");
}
}
class classU implements InterfaceM{
//重写接口里的默认方法
@Override
public void print(){
System.out.println("--欢迎来到长春,我的家--");
}
//@Override 添加注解报错,因此print2方法不能重写,此时是自己独有的静态方法。
static void print2(){
System.out.println("--地球只有一个,人人有责---");
}
}
其他接口
@Override
public int compareTo(Person o) {
//按照年龄比较,升序: 返回负数,证明this小,返回0,证明一样,返回正数,证明this大
//return this.age - o.age;
//按照身高比较,降序:
//return o.height - this.height;
//先按照年龄升序,如果年龄相同,按照身高降序
int r = this.age - o.age;
if(r == 0){
r = o.height - this.height;
}
return r;
}