淄博网站建设卓迅,网站后台,互联网网站建设水平,国内建网站公司抽象类什么是抽象类#xff1f;抽象类是特殊的类#xff0c;只是不能被实例化#xff1b;除此以外#xff0c;具有类的其他特性#xff1b;重要的是抽象类可以包括抽象方法#xff0c;这是普通类所不能的。抽象方法只能声明于抽象类中#xff0c;且不包含任何实现#…抽象类什么是抽象类 抽象类是特殊的类只是不能被实例化除此以外具有类的其他特性重要的是抽象类可以包括抽象方法这是普通类所不能的。抽象方法只能声明于抽象类中且不包含任何实现派生类必须覆盖它们。另外抽象类可以派生自一个抽象类可以覆盖基类的抽象方法也可以不覆盖如果不覆盖则其派生类必须覆盖它们。如何定义抽象类抽象类和抽象方法需要被 abstract 关键字修饰抽象类中的方法一般要求都是抽象方法抽象方法没有方法体举个例子/*** author gf* date 2023/2/23*/
// 1.抽象类和抽象方法需要被 abstract 关键字修饰
abstract class Car {// 2.抽象类中的方法一般要求都是抽象方法抽象方法没有方法体abstract void makeCar();}抽象类存在的意义众所周知抽象类不能被实例化那么抽象类存在的意义是什么呢抽象类存在的一个最大意义就是被继承当被继承后就可以利用抽象类实现多态。先看一段代码/*** author gf* date 2023/2/23*/// 抽象类和抽象方法需要被 abstract 关键字修饰
abstract class Car {// 抽象类中的方法一般要求都是抽象方法抽象方法没有方法体abstract void makeCar();
}class BWM extends Car{// 重写抽象类中的draw方法Overridevoid makeCar() {System.out.println(制造宝马);}
}
public class CatTest {public static void main(String[] args) {// 抽象类虽然不能直接实例化,但可以把一个普通类对象传给一个抽象类的引用即父类引用指向子类对象Car bwm new BWM();// 通过父类引用调用被子类重写的方法bwm.makeCar();}
}运行结果疑问1父类引用指向子类对象后发生了什么关于方法父类引用可以 调用子类和父类公用的方法(如果子类重写了父类的方法则调用子类方法)但子类特有的方法无法调用。关于属性: 父类引用可以调用父类的属性不可以调用子类的属性疑问2这样做的好处是什么减少一些重复性的代码对象实例化的时候可以根据不同需求实例化不同的对象抽象类实现多态再看一段代码// 抽象类和抽象方法需要被 abstract 关键字修饰
abstract class Car {// 抽象类中的方法一般要求都是抽象方法抽象方法没有方法体abstract void makeCar();
}class BWM extends Car{// 重写抽象类中的draw方法Overridevoid makeCar() {System.out.println(宝马即使你把我拆得七零八落我依然是位美人);}
}
class Tesla extends Car{// 重写抽象类中的draw方法Overridevoid makeCar() {System.out.println(特斯拉我要做电车界的老大);}
}class BYD extends Car{// 重写抽象类中的draw方法Overridevoid makeCar() {System.out.println(比亚迪干掉特斯拉我们就是电车界的老大);}
}
public class CatTest {public static void main(String[] args) {// 抽象类虽然不能直接实例化,但可以把一个普通类对象传给一个抽象类的引用即父类引用指向子类对象Car bwm new BWM();Car tesla new Tesla();Car byd new BYD();// 通过父类引用调用被子类重写的方法bwm.makeCar();tesla.makeCar();byd.makeCar();}
}运行结果多态的好处这里就不赘叙了疑问抽象类实现多态和普通类实现多态有什么区别抽象类的子类必须重写父类的所有方法而普通类则不用抽象类的特点信到这里对抽象类也有了一个大概的认识下面我们来简单做一下总结使用abstract修饰的类或方法就抽象类或者抽象方法抽象类是不能具体的描述一个对象不能用抽象类直接实例化对象抽象类里面的成员变量和成员方法都是和普通类一样的只不过就是不能进行实例化了当一个普通类继承这个抽象类后那么这个普通类必须重写抽象类当中的所有的抽象方法我们之前说过抽象类是不具体的没有包含足够的信息来描述一个对象所以我们需要把他补充完整但当一个抽象类A继承了抽象类B这是抽象类A就可以不重写抽象类B当中的抽象方法final不能修饰抽象类和抽象方法因为抽象类存在的最大意义就是被继承而被final修饰的不能被继承final和抽象他们两个是天敌抽象方法不能被private修饰抽象方法一般都是要被重写的你被private修饰了还怎么重写抽象类当中不一定有抽象方法但如果一个类中有抽象方法那么这个类一定是抽象类。接口如何定义接口接口的定义格式与定义类的格式基本相同将class关键字换成 interface 关键字就定义了一个接口口当中的成员变量默认都是public static final接口当中的成员方法默认都是public abstract例子
public interface 接口名称{
// 定义变量,接口当中的成员变量默认都是public static final
int a 10; // 抽象方法
public abstract void method1(); // public abstract 是固定搭配可以不写
void method2(); // 接口当中的成员方法默认都是public abstract, 更推荐用第二种来定义方法
}疑问那么接口一般用在什么地方呢一般情况下实现类和它的抽象类之前具有 is-a 的关系但是如果我们想达到同样的目的但是又不存在这种关系时使用接口。由于 Java 中单继承的特性导致一个类只能继承一个类但是可以实现一个或多个接口此时可以使用接口。 通过接口实现多态代码如下
/*** author gf* date 2023/2/23*/interface Car {void makeCar();
}class BWM implements Car{Overridepublic void makeCar() {System.out.println(宝马即使你把我拆得七零八落我依然是位美人);}
}
class Tesla implements Car{Overridepublic void makeCar() {System.out.println(特斯拉我要做电车界的老大);}
}class BYD implements Car{Overridepublic void makeCar() {System.out.println(比亚迪干掉特斯拉我们就是电车界的老大);}
}
public class CatTest {public static void main(String[] args) {Car bwm new BWM();Car tesla new Tesla();Car byd new BYD();bwm.makeCar();tesla.makeCar();byd.makeCar();}
}运行结果 帮java实现多继承由于 Java 中单继承的特性导致一个类只能继承一个类但是可以实现一个或多个接口此时可以使用接口。代码例子class Animal {String name;// 父类的自定义的构造方法public Animal(String name) {this.name name;}
}
// 自定义多种接口
interface IFlying {void fly();
}
interface IRunning {void run();
}
interface ISwimming {void swimming();
}
// 小鸭子不仅会跑还会游泳、飞行
//一个类继承父类并实现多个接口间接的解决java中不能多继承的问题
class Duck extends Animal implements IRunning, ISwimming, IFlying {// 子类构造方法public Duck(String name) {super(name);// 在给实现子类的构造方法前先要用super()调用实现父类的构造方法比较先有父后有子呀// 因为父类自己定义了构造方法编译器不会自动给给子类构造方法中添加super();来实现父类的构造方法需要我们自己实现}// 对接口中的抽象方法进行重写Overridepublic void fly() {System.out.println(this.name 正在用翅膀飞);}Overridepublic void run() {System.out.println(this.name 正在用两条腿跑);}Overridepublic void swimming() {System.out.println(this.name 正在漂在水上);}}public class CatTest {public static void main(String[] args) {Duck duck new Duck(小黄鸭); // 实例化鸭子对象duck.fly(); // 通过引用 变量名.方法名 输出重写后的方法duck.run();duck.swimming();}
}疑问 有人可能会说干嘛用接口我直接在父类Animal中实现fly、run、swimming这些属性然后不同的动物子类再继承父类这些方法不行吗但问题是鸭子会fly、swimming那猫会飞和游泳吗你再写个其他动物的子类是不是就不行了而用接口呢我们只是把这种飞、游泳的行为给抽象出来了只要一个子类有这种行为他就可以实现相对应的接口接口是更加灵活的。抽象类与接口的区别通过以上对抽象类和接口的描述我们总结一下抽象类和接口的区别抽象类要被子类继承接口要被类实现接口只能做方法声明抽象类中可以作方法声明也可以做方法实现接口里定义的变量只能是公共的静态的常量抽象类中的变量是普通变量接口是设计的结果抽象类是重构的结果抽象类和接口都是用来抽象具体对象的但是接口的抽象级别最高抽象类可以有具体的方法和属性接口只能有抽象方法和不可变常量抽象类主要用来抽象类别接口主要用来抽象功能