抽象类
抽象类是为方法覆写而提供的类,定义抽象类和抽象方法需要使用关键字abstrast。
例子:
abstract class Imethod{ //抽象类
public abstract void method();//抽象方法
public void setter() {}
public void getter() {}
//抽象类中也可以定义普通方法
}
要使用抽象类,要注意以下几个点:
(1)必须有子类继承抽象类,与其他类一样使用extends进行继承
(2)抽象类的子类(子类不是抽象类)必须覆写抽象类中的所有抽象方法
(3)如果要对抽象类进行实例化,就需要利用多态性,用向上转型的方法完成实例化
例子:
abstract class Imethod{ //定义抽象类
public abstract void method();//定义抽象方法
public void setter() {}
public void getter() {}
}
class method extends Imethod{ //子类继承抽象类
public void method() {
System.out.println("覆写抽象类方法");
}
//对抽象方法进行覆写
}
public class Java {
public static void main(String[] args) {
Imethod test = new method();//利用多态性,向上转型进行实例化
test.method();
}
}
/*
输出结果:
覆写抽象类方法
*/
在使用抽象类时要注意不能使用final关键字来定义抽象类和抽象方法,否则会报错。
还有一点就是在抽象类中定义构造方法时,子类继承时会默认调用父类中的无参构造方法,如果这时抽象类中没有无参构造方法,则子类需要使用super()来调用父类中的构造方法。
例子:
abstract class Imethod{
int x;
public abstract void method();
public Imethod(int x) { //定义只有一个参数的构造方法
this.x = x;
}
}
class method extends Imethod{
public method(int x) {
super(x); //调用抽象类中的构造方法,super()调用父类的构造方法
}
public void method() {
System.out.println(x);
}
}
public class Java {
public static void main(String[] args) {
int x=666;
Imethod test = new method(x);
test.method();
}
}
/*
输出结果:
666
*/
抽象类中允许不定义抽象方法,但即使没有抽象方法,也不能直接使用new关键字直接实例化,但抽象类中可以使用static方法,该方法就不受到抽象化实例对象的性质。
例子:
abstract class Imethod{
public abstract void method();
public static Imethod function() {
return new fun(); //实例化子类对象
}
}
class fun extends Imethod{
public void method() {
System.out.println("666");
}
}
public class Java {
public static void main(String[] args) {
Imethod test = Imethod.function(); //调用function方法返回实例化对象
test.method();
}
}
/*
输出结果:
666
*/
接口
定义接口需要用到interface关键字,在接口中定义使用public访问权限的方法是抽象方法,其他方法可以用default访问权限和static访问权限,还可以定义全局变量。
例子:
interface Imethod{
public static int x = 666; //定义全局变量
public abstract void fun1();//定义抽象方法
default void fun2() { //定义其他方法
System.out.println();
}
}
当定义的接口内有抽象方法,就无法被直接实例化,其使用注意需要以下几点:
(1)接口需要被子类实现,使用implements关键字实现,可以实现多个父接口
(2)子类如果不是抽象类,则必须覆写接口中的所有抽象方法
(3)接口对象也可以利用向上转型进行实例化
例子:
interface Imethod1{ //定义接口类
public static int x = 666; //定义全局变量
public abstract void fun1(); //定义抽象方法
default void fun2() { //定义其他方法
System.out.println("接口方法fun2()被调用");
}
}
interface Imethod2{
default void fun3() {
System.out.println("接口方法fun3()被调用");
}
}
class method implements Imethod1,Imethod2{ //运用implements关键字实现多个接口
public void fun1() { //覆写接口中的抽象方法
System.out.println("接口内抽象方法fun1()被覆写");
}
}
public class Java {
public static void main(String[] args) {
method test = new method();
test.fun1();
test.fun2();
test.fun3();
}
}
/*
输出结果:
接口内抽象方法fun1()被覆写
接口方法fun2()被调用
接口方法fun3()被调用
*/
还需要注意的是如果实现父接口的同时,也需要继承父类,则要实现混合运用要用到的语法如下:
interface Imethod1{
}//接口
interface Imethod2{
}//接口
class function{
}//普通类
class method extends function implements Imethod1,Imethod2{
}
//要实现混合应用则要注意,要先进行继承,然后再实现接口,继承的父类依然只能有一个,但父接口还是可以实现多个