将一些名称一致但是细节不同的行为提取到父类中定义为抽象方法。抽象方法所在的类必须是抽象类。用abstract修饰。抽象方法没有方法体。
当一个具体类继承了抽象类之后,必须实现这个抽象类中的抽象方法。抽象类不能直接创建对象。
抽象类中有构造函数(任何类都有构造方法),只是不常用它来创建对象。抽象类中的构造方法是用来让子类继承的,也就是说,在生成子类对象的时候,必须先生成父类对象才能创建,这个时候就用到了父类的构造方法。
问题1、抽象类中一定有抽象方法吗?不一定。
有抽象方法的类一定是抽象类,但是抽象类中不一定必须有抽象方法。
可以
静态方法不是抽象方法,不需要子类重写。两者并不会起冲突。
可以
问题4、抽象方法可以重载吗?可以
重载只与方法名和参数列表有关,与标识符是没有关系的
可以
问题6、抽象方法可以是静态的吗?不可以
抽象方法在被子类继承之后必须重写,但是子类是不可以重写父类的静态方法的。
不可以
抽象方法需要被继承重写,但是final修饰的方法是不可以被重写的,两者是有冲突的,所以不可以
可以
问题9、抽象方法可以是私有的吗?不可以
子类不能继承父类私有的方法,也就不能重写。但是抽象方法又要求必须重写,两者产生了冲突。
抽象类可以继承普通类
子类在继承父类的时候,什么东西无法继承?
构造方法、所有私有的东西、代码块(构造代码块和静态代码块)无法继承。(局部代码块是在方法中的,只要方法继承过去了,局部代码块也就被继承过去了)
其它的内容看修饰符是否允许。
package a;
public abstract class A{
abstract void m();
}
package b;
import a.A;
public class B extends A {---报错,抽象类的抽象方法是默认修饰符。而默认的对其他包是不可见的。子类重写会报错。
void m(){}
}
二、接口
interface
接口不是类—接口中的方法全部是抽象方法。
由于接口中的方法都是抽象方法(JDK1.8以前,1.0~1.7,在1.8以后,接口中可以定义实体方法),默认使用public atstract修饰,那么就意味着是个抽象类,是不能创建对象的
接口中定义的属性默认是用public static final。
问题1、接口中可以定义静态方法吗?不可以
静态方法不可以被重写。但是子类又必须重写接口的所有方法,二者会有冲突。
可以
但是默认用public static final 来修饰(修饰符没有优先级,顺序是不会影响后面的变量的)
接口中的抽象方法默认是用public来修饰,且只能用public修饰。
// 小坑
interface A{
void m();
//虽然没有写修饰符,但是默认已经把public abstract加上去了
}
class B implements A{
void m(){}
//这一行报错。因为接口中的方法默认是public,重写的权限不可以小于父类。B类的重写权限是默认的,小于public。
}
Java中支持的是单继承,多实现
一个类只能继承一个类,但是可以去实现多个接口—不可避免的可能会产生安全问题
一个类中不能存在两个方法签名完全一致的方法,否则会出现调用混乱的情况。
问题3、抽象类实现了接口,也必须实现接口中的方法吗?可以不用
问题4、接口可以继承接口吗?可以
问题5、一个接口可以继承多个接口吗?因为接口中的方法都是抽象方法,没有方法体
Java中的单继承是指类之间的单继承
| 具体类实现接口的里的方法,修饰符必须是public |
制定了一份标准,结合多态,以及反射可以实现解耦
instanceof在判断的时候看的是具体的实现类而不是看声明类(也就是new的什么类型的就是什么类型的)。



