抽象类和接口
抽象类
abstract可以修饰类和方法(不可以修饰变量)
abstract 修饰的类叫做抽象类 修饰的方法叫做抽象方法
package test;
public abstract class Chouxiang {
public abstract void nameone();
protected abstract void nametwo();
abstract void namethree();
//public static void namefour(); 这个会报错因为java里规定不允许抽象方法为static修饰若被static修饰则能够通过类名来引用这样是没有意义的
//不能够由私有属性的方法如果这样的话该方法将不能被继承 private abstract void namefour();
public static void main(String[] args) {
//不能实例化抽象类 new Chouxiang();
}
}
有抽象方法的一定是抽象类,抽象类里可以有具体的方法
final不能修饰抽象类,因为final修饰的类不能被继承
接口
接口在jdk8之前是不允许有非抽象方法的 之后允许有
接口调用接口的形式
package test;
import java.util.Set;
public interface IJiekou1 extends Set{//接口的访问权限符只能是public 和 默认, extends可以访问多个接口中间用逗号间隔只能继承接口不能继承抽象类 和普通类
public static final int A=1;
int B=2;
//在接口里 数据类型前面都默认有public static final
public abstract void name();//抽象方法只能是public 访问权限符
}
类调用接口的形式
如果调用接口后类中没有实现完这个接口中的所有抽象方法则这个类必须是抽象类
package test;
import java.util.Set;
public interface IJiekou1 extends Set{
public static final int A=1;
int B=2;
public abstract void name();
}
package test;
public abstract class Test implements IJiekou1 {
}
如果要在这个类中实现所有的抽象方法则实现过程必须遵守多态的原则
如果一个类中接入了多个接口则多个接口中若有相同的抽象方法则只需要实现一次这个抽象方法
接口回调:这个描述的是一种现象:接口声明的变量指向其实现类实例化的对象,那么该接口变量就可以调用接口中的抽象方法。其实实质还是多态的一种形式。
package test;
import java.util.Set;
public interface IJiekou1 extends Set{
public static final int A=1;
int B=2;
public abstract void name();
}
package test;
public class Test implements IJiekou1 {
@Override
public void name() {
System.out.println("实现方法");
}
public static void main(String[] args) {
IJiekou1 jei = new Test();
jei.name();
System.out.println(IJiekou1.A);
}
}
接口没有构造方法,不能创建自己的对象,但是可以引用实现类的对象。
如果一个接口只定义一个抽象方法则称为函数式接口
package test;
import java.util.Set;
@FunctionalInterface
public interface IJiekou1{
public static final int A=1;
int B=2;
public abstract void name();
default void name1() {
}//只能通过实现类来引用
static void name2() {
}//可以通过调用接口名来实现
}
接口实现类可以直接使用接口中的常量。
接口实现类所实现的多个接口中有常量名相同的常量,则在实现类中不能直接使用,必须使用类名来确定到底调用哪个接口中的常量。
java8新特性
Java8以前版本中规定,接口中所定义的方法只能是抽象方法,从Java8开始,接口中可以添加一个或多个由default关键字修饰的非抽象方法,该方法又称为扩展方法,该默认方法将由接口实现类创建的对象来调用,如下例:
•同样,从Java8开始,接口中可以添加一个或多个由static关键字修饰的非抽象方法,该方法将由接口或其实现类直接调用,如下例:
public interface IMammal {
void move();
public default void eat() {
System.out.println("哺乳动物正在吃......");
}
}
interface IMammal {
void move();
static void eat() {
System.out.println("哺乳动物正在吃......");
}
}
函数式接口
如果接口内只定义一个抽象方法,则该接口称为函数式接口
可以使用@FunctionalInterface 注解来验证一个接口是不是函数式接口,Java8中java.lang.Runnable、java.util.Comparator<T>都是函数式接口;
函数式接口中可以定义多个常量、多个默认方法和多个静态方法,但只能定义一个抽象方法及多个java.lang.Object中的public方法,如下例
instanceof运算符
instanceof运算符用于强制类型转换之前检查对象的真实类型以避免类型转换异常,从而提高代码健壮性