抽象类
就是一个使用abstract修饰的类
//格式
abstract class 类名{
//属性
//方法
}
抽象类里面可以有抽象方法,也可以没有.(一般都是有的,因为这是它的作用)
反之,抽象方法是一定在抽象类或接口里面的,不能放在普通类中.
抽象方法就是用abstract修饰的方法
//抽象方法里面什么都不写,直接;结束,内容是留给子类重写的
abstract class 类名{
abstract 返回类型 方法名(参数列表);
}
抽象的使用
通过继承抽象类的方法使用抽象类.
当继承抽象类时,子类必须重写抽象类中所有的抽象函数.
ps: 多重继承时,必须把所有抽象函数重写.
(也就是最下面的实现类来把还未有方法体的抽象方法重写)
(作用:多人开发时,防止遗漏某些功能)
注意事项:
-
抽象类不能创建对象.
-
抽象类中,可以有构造方法.
-
抽象类中,不一定含有抽象方法,但抽象方法一定在抽象类或接口中.
-
抽象类的子类(最下面的倒霉蛋?),必须重写父类中的所有抽象方法
接口
java中的一种引用数据类型,是方法的集合.(多个方法丢在一个地方)
主要作用:扩展java类的功能,定义额外的功能.(ps:父类类似创建角色的模板,接口类似于角色的装备.)
接口内部主要封装方法.
抽象方法(jdk7以前)
默认方法(jdk8)
静态方法(jdk8)
私有方法(jdk9)
接口的定义:
使用interface定义
interface 接口名{
//方法的集合
}
publice interface 接口名称{
//默认方法
//抽象方法
//静态方法
//私有方法
}
(接口里面并不能存放变量,只能存放常量,如果你在里面定义了变量,会默认添加public static final 变为常量)
(常量在Java中一般软性规定使用全大写的名字,如: PI , SIZE)
接口的使用:
接口不能创建对象,但可以被实现implements.
一个实现接口的类,需要实现接口的所有抽象方法(类似抽象类)
如果是抽象类实现接口,不需要实现所有接口.
interface A{
public abstract void show();
public abstract void tell();
}
//如果是抽象类实现接口,可以不用把方法全部重写
//和抽象类差不多,都是实现类需要把抽象方法重写.
abstract class B implements A{
public void show(){
System.out.pringln("hello world!");
}
}
//实现类重写所有抽象方法
class C implements A{
public void tell(){
System.out.println("hello tell");
}
public void show(){
System.out.println("hello show");
}
}
在接口里面定义默认方法和静态方法
默认方法:使用 default 修饰,不可省略,供子类调用或重写
(默认方法里面要有方法体)
静态方法:使用 static 修饰, 可供接口直接调用
(静态方法可以为接口中的其他方法所用,但不能直接给其实现类使用)
类与接口的关系
类实现接口,使用关键字implements
非抽象类实现接口:
-
必须重写接口中的所有抽象方法
-
继承接口的默认方法,可以直接调用,也可以重写
//格式 class 类名 implememts 接口名{ //重写接口中的抽象方法(必须) //重写接口中的默认方法(可选) }
静态方法的使用:
静态方法与.class文件相关,只能使用
接口名调用,不可以通过实现类的类名或实现类的对象调用.
//静态方法的调用方式
接口名.静态方法();
静态方法无法重写.
优先级:
如果父类及接口默认方法都有相同的名字,
优先执行父类的方法
(ps:抽象类是公司里的董事长,接口是兼职工作的老板,里面的抽象方法就是领导规划的工作,作为最下层继承或实现的类就是员工,必须要重写里面所有还没有方法体的抽象方法,就是做好工作?当工作冲突时(抽象方法重名时),先以抽象类为准?)
接口的私有方法:
-
私有方法:只有 默认方法可以调用
-
私有的静态方法: 默认方法和静态方法可以调用
ps:私有的方法是对默认方法和静态方法的补充,为了封装它们的重复代码(jdk1.9后才有的,需要注意)
接口的多实现与多继承:
在继承中,一个
类只能继承一个父类.而一个
类可以实现多个接口.
(类似父亲只有一个,但你的爱好却不止一个.)
//多实现的格式 查api的时候 [ 内容 ] 在java一般表示可选择的意思
class 类名 [extends 父类] implements 接口1,接口2,接口3...{
//重写的抽象方法
//重写接口中的默认方法(如果实现的接口中有默认方法重名的情况下,必须重写方法,如果不重名,则可选择不重写,也可选择重写)
}
//一个接口继承多个接口,如果父接口中的默认方法有重名,那么子接口必须重写一次和上面的实现多个接口类似
interface 接口名 extends 接口1,接口2,接口3...{
//父接口里面的默认方法重名的情况下必须重写
}
抽象方法:
接口中,实现类必须重写所有的抽象方法,
如果重名(只需重写一次)
接口中,方法没有注明,默认为抽象方法
interface InterfaceKind{
//默认添加public abstract
void 方法名();
//等效于 public abstract void 方法名();
}
ps:
子接口重写默认方法时,
default可以保留
实现类重写默认方法时,
default不可保留(因为类里面是没
default关键字的)
接口的特点:
-
接口中,无法定义成员变量,只能创建常量
//格式: 例如圆周率 public static final double PI = 3.14; //如果是定义double PI //则会默认加上public static final //定义常量,所有的名字都是大写,用2个单词或以上用_连接
-
接口中,没有构造方法,无法创建对象
-
接口中,没有静态代码块
//静态代码块,存在于类中,与类的属性和方法是同一级别的 //静态代码块,存在于内存的方法区中,是比类的构造函数更加优先调用,且只调用一次,和构造方法类似 static{ //方法体 }
(以上均为本人观点,如果有不同的意见,欢迎大家在下面留言吐槽!)