2023年11月26日20:11:11
抽象类:抽象类其实就是特殊的父类
抽象方法存活在抽象类中,并且继承后的子类必须重写抽象方法
+ 抽象方法的定义格式:
+ public abstract 返回值类型 方法名(参数列表);
+ 抽象类定义格式:
+ public abstract class 类名 {}
看下面代码:这样设计完全不合理,我想抽取到父类中,让两个动物子类继承父类。里面的方法通过父类继承。但是我发现,方法都是一样的,就是里面的逻辑不一样,此时就得用到了抽象类和抽象方法:
不使用抽象类的代码如下:
package com.liujintao.demo;
public class Abstrcte {
public static void main(String[] LiuJinTao) {
}
}
class Animal {
public void eat () {
System.out.println("我是吃饭的方法");
}
}
class dog {
public void eat () {
System.out.println("吃骨头");
}
}
class pig {
public void eat () {
System.out.println("吃食料");
}
}
使用抽象类和抽象方法后的代码如下:
package com.liujintao.demo;
public class Abstrcte {
public static void main(String[] LiuJinTao) {
}
}
abstract class Animal {
public abstract void eat (); // 抽象方法必须存在抽象类中!!!
}
class dog extends Animal {
public void eat () {
System.out.println("吃骨头");
}
}
class pig extends Animal {
public void eat () {
System.out.println("吃食料");
}
}
接口:体现的思想是对规则的声明
,Java中的接口更多体现的是对行为的抽象(抽象方法)
如果发现一个类,所有的组成,都是抽象方法
和定义类很像:
interface 接口名 {}
注意:接口不允许实例化。
接口和类之间是实现关系,通过implements关键字来完成接口的实现(和继承父级一样的写法)
class 类名 implements 接口名 {}
实现类 (也就是接口的子类)
第一种使用接口的方式(实现类中,重写抽象方法)
/**
* 定义一个接口
*/
interface Inter {
public void method ();
public void show ();
}
// 第一中使用接口的方法,使用接口(实现类)
class demoClass implements Inter {
// 1. 要么将接口里面的规则(抽象方法)全部重写
public void method() {
System.out.println("我是实现类中的 method方法");
}
public void show () {
System.out.println("我是实现类中的 show方法");
}
}
第二种使用接口的方式(将实现类变成抽象类) 不推荐使用
/**
* 定义一个接口
*/
interface Inter {
public void method ();
public void show ();
}
// 接口的第二种使用方法(变成抽象类,让其他类继承我的实现类)
abstract class Demo implements Inter {
// 要么将这个实现类变成抽象类
}
class Test extends Demo {
public void method () {
}
public void show () {
}
}
public static final
成员方法:只能是抽象方法,因为系统会默认加入两个关键字
public abstract
接口中没有构造方法
1、 类和类之间的关系只能单继承,或者多层继承(前面有讲过),这里展示一个类继承多个类:
package com.liujintao.demo;
public class InterfaceDemo02 {
public static void main(String[] LiuJinTao) {
}
}
// 定义一个抽象父类
abstract class Fu1 {
// 抽象方法
public abstract void show();
}
// 定义第二个抽象父类
abstract class Fu2 {
public abstract void show();
}
// 定义一个子类继承抽象方法 (类与类不支持一个继承多个)
abstract class Zi extends Fu1, Fu2 { // 报错 同时继承了两个类
// 重写抽象方法
public void show() {
}
}
2、 类和接口之间的关系(这里展示一个继承多个的代码实现):
package com.liujintao.demo;
public class InterfaceDemo02 {
public static void main(String[] LiuJinTao) {
}
}
// 定义一个接口
interface Interf {
public void show ();
public void method();
}
// 定义第二个接口
interface Interf2 {
public void show ();
public void method ();
}
// 定义一个实现类(一个类继承多个接口(类))
abstract class testClass implements Interf, Interf2 {
// 实现了接口(就相当于继承了),里面全是抽象方法,因此必须存活在抽象类中。
public void show () {
System.out.println("我是实现类,实现接口继承方法后,重写抽象类");
}
public void method () {
System.out.println("我是实现类,实现了接口的继承方法后,重写抽象类");
}
}
3、 接口和接口之间的关系(和上面一样,一个接口继承多个接口代码展示):
package com.liujintao.demo;
public class InterfaceDemo02 {
public static void main(String[] LiuJinTao) {
}
}
// 定义第一个接口
interface isInter1 {
public void showA();
}
// 定义第二个接口
interface isInter2 {
public void showB();
}
// 定义第三个接口,实现上面连个接口的继承
interface Come extends isInter1, isInter2 {
public void showA();
public void showB();
}
接口里面写的全是抽象的方法,然后通过实现类对我的规则进行重写,完成功能的实现。
多态分为:
package com.liujintao.polymorphic;
public class PolymorphicDemo {
public static void main(String[] LiuJinTao){
// 对象多态的实现
Animal x = new Dog();
Animal y = new Cat();
}
}
// 定义一个父类
class Animal {
}
// 下面定义两个子类
class Dog extends Animal {
}
class Cat extends Animal {
}
对象多态的好处:
package com.liujintao.polymorphic;
public class PolymorphicDemo {
public static void main(String[] LiuJinTao){
// 对象多态的实现
Animal x = new Dog();
Animal y = new Cat();
// 调用方法 传递子类对象给父类引用
userAnimal(new Dog());
userAnimal(new Cat());
}
// 展示一下对象多态的好处 (就是定义一个父类的实例,接受子类对象)
public static void userAnimal (Animal element) {
}
}
// 定义一个父类
class Animal {
}
// 下面定义两个子类
class Dog extends Animal {
}
class Cat extends Animal {
}
package com.liujintao.polymorphic;
import java.sql.SQLOutput;
public class PolymorphicDemo {
public static void main(String[] LiuJinTao){
// 调用方法 传递子类对象给父类引用
// userAnimal(new Dog());
userAnimal(new Cat());
}
// 展示一下对象多态的好处 (就是定义一个父类的实例,接受子类对象)
public static void userAnimal (Animal element) {
// 行为多态的使用
element.eat(); // cat
}
}
// 定义一个父类
abstract class Animal {
public abstract void eat ();
}
// 下面定义两个子类
class Dog extends Animal {
public void eat () {
System.out.println("dog");
}
}
class Cat extends Animal {
public void eat () {
System.out.println("cat");
}
}
userAnimal(new Cat());
: 根据传递的子类对象,方法的形参引用不同的对象,实现功能方法。
成员变量:编译看左边(父类), 运行看左边(父类)
成员方法:编译看左边(父类), 运行看右边(子类)
多态创建对象,调用静态成员:
package com.liujintao.polymorphic;
public class polymorphicDemo02 {
public static void main(String[] args) {
Zi z = new Zi();
System.out.println(z.num); // 100
}
}
// 定义一个父类
class Fu {
int num = 100;
public void method () {
System.out.println(num);
}
}
// 定义一个子类
class Zi extends Fu {
public void method () {
System.out.println(num);
}
}
package com.liujintao.polymorphic;
public class polymorphicDemo02 {
public static void main(String[] args) {
Zi z = new Zi();
System.out.println(z.num); // 100
z.method(); // 我是子类
}
}
// 定义一个父类
class Fu {
int num = 100;
public void method () {
System.out.println(num);
}
}
// 定义一个子类
class Zi extends Fu {
public void method () {
System.out.println(num);
System.out.println("我是子类");
}
}
Zi z = new Zi();
Zi.print(); // <== z.print(); 编译的时候自动改为类调用。
// 定义一个父类
class Fu {
public static void print() {
System.out.println("父类----print");
}
}
// 定义一个子类
class Zi extends Fu {
public static void print() {
System.out.println("父类----print");
}
}
向上转型:
Fu f = new Zi();
向下转型:
Zi z = (Zi)f;
测试类:
package com.liujintao.test;
import com.liujintao.polymorphic.PolymorphicDemo03;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请选择支付方式: 1. 支付平台支付 2. 银行卡网银支付 3. 信用卡快捷支付");
int choice = sc.nextInt();
// 定义一个接口类型的引用
Payment payment = null;
switch (choice) {
case 1 :
// 父类引用指向子类对象
payment = new PlatformPaymentImpl();
break;
case 2:
payment = new BankcardPaymentImpl();
break;
case 3:
payment = new CreditCardsAccepted();
}
System.out.println("请输入您的支付金额: ");
double money = sc.nextDouble();
// 通过实现类对象。访问实现类里面的方法
payment.pay(money);
}
}
先定义一个接口:
package com.liujintao.test;
/**
* 支付接口
*/
public interface Payment {
void pay(double money);
}
第一个实现类:
package com.liujintao.test;
/**
* 实现类
*/
public class PlatformPaymentImpl implements Payment {
/**
* 重写接口方法
* @param money
*/
@Override
public void pay(double money) {
System.out.println("通过支付平台支付了:" + money + "元!");
}
}
第二个实现类:
package com.liujintao.test;
/**
* 实现类
*/
public class BankcardPaymentImpl implements Payment{
@Override
public void pay(double money) {
System.out.println("通过银行卡网银支付了:" + money + "元!");
}
}
第三个实现类:
package com.liujintao.test;
/**
* 实现类
*/
public class CreditCardsAccepted implements Payment {
public void pay(double money) {
System.out.println("通过信用卡支付了:" + money + "元");
}
}