05团队语法
团队语法
1.抽象类 用到继承的知识
2.接口
抽象类和接口 一模一样 都是解耦的
抽象类
抽象类 用abstract修饰的类 这种类 特点 不能new对象
抽象方法 用abstract修饰的方法 这种方法只有声明部分没有实现部分
1.把方法的声明和实现分开
声明部分 public abstract void add();
实现 去掉abstract 需要写出方法的方法体 {}
一个类中有抽象方法那么这个类必须是抽象类
public abstract class One{
public abstract void add(); int a;
}
抽象类用自己的子类来实现自己的抽象方法
抽象类本身 不能 new
想 new,必须 先写一个子类 继承它,再 new 子类
public class Two extends One{
public void add(){
}
}
如何调用抽象类中的方法呢?
我们需要使用上转型对象来调用抽象类中的抽象方法
public class Test{
public static void main(String [] args){
One one = new Two();
//one上转型对象
}
}
上转型对象:把子类对象赋值给父类引用,这个父类引用指向的子类对象,就是上转型对象。
注:
上转型对象 3 个必记规则
- 只能调用父类中定义的方法
- 实际运行执行子类重写的方法(多态)
- 不能调用子类独有的方法
3的原因:
编译阶段,编译器只看左边的类型(AbstractOne)
父类里没有这个子类独有的方法
编译器直接报错:找不到方法
哪怕运行时是子类对象,编译不通过,一切白搭。
接口
接口 由关键字 interface修饰的一个代码书写单元 == 等价与类
1.接口不能new对象
2.接口中必须全部是抽象方法
3.接口中所有的抽象方法会默认添加 两个关键字 public abstract
public interface One{
void add1();
}
接口用实现类来实现自己的抽象方法 two 抽象类
public class Two implements One,其他接口{
public void add1(){}
}
接口中的方法如何调用
public class Test{
public static void main(String [] args){
//接口回调
One one = new Two();
one.
}
}
1.接口弥补了单向继承的缺点 一个实现类可以实现多个接口
2.接口和接口之间允许互相继承
特殊对象(背)
1.%90对象都是正常 类类型 名 = new 构造方法() 类类型名字和构造方法名字 相同
名:你给对象起的名字
A a = new A();
2.%5对象 上转型对象 父类声明子类实例化 父亲类型 名 = new 儿子构造方法() 给抽象类服务的
3.%5对象 接口回调 接口声明由实现类来实例化 接口类型 名 = new 实现类构造方法() 给接口用的
关键字(背)
abstract 抽象 修饰类和方法 修饰的类叫抽象类 修饰的方法叫抽象方法
interface 接口
implements 实现 用于让一个类去实现一个或多个接口
抽象类和接口 有啥区别
区别
- 抽象类 = 半成品类,只能单继承
- 接口 = 能力契约,可以多实现
- is a(是什么)用抽象类,can do(能做什么)用接口
- 抽象类可以有普通方法但接口必须全都是抽象方法 (接口:Java 8 以后也能写普通方法(default /static))
总结
- 抽象类:模板、单继承、有属性有方法
- 接口:规范、多实现、纯能力定义
- 日常开发:接口用得更多(解耦、灵活、符合最佳实践)
拓展
@Override
实现接口时,在方法上写 @Override,是用来【校验】你写的方法,是不是真的正确重写了接口里的方法。
interface Run {
void run();
}
class Dog implements Run {
//这个注解:校验下面的方法,确实是重写接口方法
@Override
public void run() {
System.out.println("小狗跑");
}
}
@Override
public void runs() { // 多写了个 s
System.out.println("小狗跑");
}
如果不写 @Override,编译器不会报错,会一直找不到 bug

浙公网安备 33010602011771号