抽象和多态

抽象类

一、抽象

面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的。 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
例如:动物,植物,星球等抽象概念
语法格式:在不同类的定义前面加上一个 abstract ,就表示抽象类。
例如:
abstract class Tree
{
···················
}
抽象类的主要目的:该类不能完整的描述对象,所以不允许创建对象,必须强制该类被继承后,才可以使用。
注意:final和abstract是不能同时修饰的;
【抽象类仍然是一个类,除了不能直接实例化之外,与普通的类基本一致,它使用关键字abstract来对一个类进行修饰】

abstract:只能修饰类和方法
修饰类:表示该类是一个抽象类,必须被继承
修饰方法:如果修饰方法则该方法必须被重写,如果一个类中有一个以上的抽象方法, 则该类必须为抽象类。
使用abstract修饰的方法,只有方法的名称没有方法体。
【抽象类不一定是有抽象方法,但是抽象方法的类必须是抽象类】
抽象类:是把相同功能的信息抽取出来,并作为一个类的继承模板。它本身是一个类,具有除创建对象外的所以类的功能。

例:

通过抽象类求得长方形和圆的周长面积

public class NEW {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
      Shape a=new Rect(10,20);//建立Rect类对象a
      a.getarea();//得出面积
      a.getlen();//得出周长
      Shape b=new Circle(3);//建立子类Circle的对象b
      b.getarea();//得出面积
      b.getlen();//得出周长
    }

}
abstract class Shape{//建立父类为抽象类
    abstract double getlen();//周长
    abstract double getarea();//面积
}
class Rect extends Shape{//子类Rect继承父类
    double length;//长
    double width;//宽
    public Rect(double length,double width) {
        this.length=length;
        this.width=width;
    }
    @Override  //重写
    double getlen() {
        // TODO Auto-generated method stub
        System.out.println((length+width)*2);
        return (length+width)*2;
    }
    @Override
    double getarea() {
        // TODO Auto-generated method stub
        System.out.println(length*width);
        return length*width;
    }
}
class Circle extends Shape{//子类Circle继承父类
    double rid;//半径
    double pi=3.14;
    public Circle(double rid) {
        this.rid=rid;
    }
    @Override
    double getlen() {
        // TODO Auto-generated method stub
        System.out.println(2*pi*rid);
        return 2*pi*rid;
    }

    @Override
    double getarea() {
        // TODO Auto-generated method stub
        System.out.println(rid*rid*pi);
        return rid*rid*pi;
    }

运行结果如下所示:
这里写图片描述

二 、

接口: 接口它是一个特殊的抽象类(只包含抽象方法和常量),它主要描述的是一种功能的集合。它本身不是类。你可以创建接口的变量,不能创建接口的对象。
【面向接口编程,其他的:面向过程,面向对象,面向切面】
接口的语法:
[public] interface interfaceName [extends SuperInterfaceList] {
常量属性
抽象方法
}
接口里面的属性是:public static final int a; 但是可以省略public static final,默认就是这个类型
方法:默认是public abstract;

public default void getcolor(){
System.out.println(“打印颜色”);
}
【类可以实现多个接口,接口之间使用逗号分隔,1个类即可以继承类,也可以实现接口,但是必须先继承类,后实现接口。】
如:class XXX (子类名) implements YYY(接口类名){}
注意:java只支持单继承,但是要考虑接口的多继承。
一个类可以实现一个接口,如果未能全部实现接口方法,则该类为抽象类,换句话说,抽象类是可以实现接口的。

总结: 
    1、接口没有构造方法。
    2、接口中定义的所有属性默认是public static final的,即静态常量。
    3、接口中定义的所有方法默认是public abstract的,即抽象方法。
    4、由于接口中的定义的所有方法默认都是抽象的,所以接口不能被实例化。
    5、有抽象函数的不一定是抽象类,也可以是接口。
    6、类可以通过implements实现接口,一个类可以实现多个接口。
    7、如果类没有实现接口中的所有方法,那么类必须是抽象类。
    8、如果在类中访问接口中的属性,不能使用super关键字,因为两者之间没有显示的继 承关系。
interface JieKou{//创建接口
    public String shuchu(); 
}
class XiFen implements JieKou{//利用接口
    public XiFen() {//默认构造方法        
    }
    @Override
    public String shuchu() {
        System.out.println("输出");
        return "输出";
    }

多态

1.概念:事物存在的多重形态,即同一种事物由于条件不同,产生的结果也不同。多态只发生于继承关系,可以理解为父类变量可以指向子类对象。
2.方法:实现多态的技术:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。【重写才可以动态绑定】
3.条件:多态存在的三个必要条件:
1)要有继承关系或者要有接口的实现关系
2)要有方法重写
3) 要有父类引用指向子类对象(格式:Father fa = new Son())
4.多态具有的特点
1) 多态中成员访问成员变量的特点: 多态对成员变量的访问时不构成多态特性的(如在父类中int number=111,子类中创建 int number=222。主函数在输出子类中的number时,结果仍然是父类中number的值)
2)多态中成员方法的访问特点:对重写过的成员方法有效
父类变量指向子类对象,在通过父类变量调用子类对象的重写方法时,则调用的实际方法时子类的重写方法。否则不是重写方法则调用自己的。
5.多态的用处:
1) 可以使用父类接受该父类下的所有对象。特殊情况为:Object 的变量可以接受java中的任意类型。
2) 可以使用该变量调用子类的重写方法时,达到方法的特殊调用会根据你传递的对象不同而动态变化。
3)多态中访问静态成员的特点:多态其实仅限于类的非静态成员方法,只有在运行时才能决定具体调用谁。

注:此处代码引用他人
    package cn.com;

public class TestPolymorphism {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TwoDragonM t=new TwoDragonM();
        t.trueWords();

        System.out.println("--------");
        Wine w1=new TwoDragonM();
        w1.trueWords();

        int num = w1.number;
        System.out.println("num="+num);

        Wine w2=new FenWine();
        w2.trueWords();
        int num2=w2.number;
        System.out.println("num2="+num2);


    }


//  public static void printMessage(TwoDragonM t) {
//      System.out.println("---> "+t.trueWords());
//  }

//  public static void printMessage(FenWine t) {
//      System.out.println("---> "+t.trueWords());
//  }

    public static void printMessage(Wine t) {
        System.out.println("---> "+t.trueWords());
    }

}

class Wine{
    String brand;
    int grade;
    double price;

    int number=111;

    public String trueWords() {
        System.out.println("父类");
        return "父类";
    }
}

class TwoDragonM extends Wine{
    int number=222;
    @Override
    public String trueWords() {
        System.out.println("子类1");
        return "子类1";
    }
}

class FenWine extends Wine{
    int number=666;
    @Override
    public String trueWords() {
        System.out.println("子类2");
        return "子类2";
    }
}
<think>首先,用户的问题是:“我想理解Java中抽象多态之间的关系 请问Java中抽象多态性的关系”。我需要基于提供的引用系统指令来回答。 系统指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 引用仅供参考,参考用户上一次的问题回答(但这里没有提供上一次的对话历史)。 用户的问题是关于Java中抽象多态性的关系。引用提供了相关信息: - 引用[1]:定义了多态性,包括编译时多态(方法重载)运行时多态(方法重写)。 - 引用[2]:解释了多态的实现条件,如继承、重写向上转型。 - 引用[3]:讨论了抽象类的作用,如归类子类、提供共享行为属性,强制子类实现方法。 - 引用[4]:展示了接口如何实现多态性,通过统一方式处理不同类型的对象。 - 引用[5]:用实例说明多态性,如通过数组调用不同子类的方法。 关键点: - 抽象类:在Java中,抽象类是不能被实例化的类,用于定义抽象方法(没有实现),子类必须实现这些方法。它支持代码重用强制实现。 - 多态性:允许不同对象对同一消息作出不同响应。在Java中,主要通过运行时多态(方法重写)实现,这依赖于继承接口。 关系: - 抽象类是实现多态性的基础之一。通过定义抽象方法,抽象类强制子类提供具体实现。当子类覆盖这些方法时,运行时多态允许通过父类引用调用子类的具体方法。 - 例如,在引用[4]中,接口Animal定义了sound()方法,DogCat类实现它,通过Animal引用调用sound()时,根据实际对象类型执行不同的实现,这就是多态。 - 类似地,抽象类也可以定义抽象方法,子类实现后,通过父类引用调用时,实现多态。 回答结构: - 逐步解释: 1. 定义抽象类:简要说明什么是抽象类及其作用。 2. 定义多态性:解释多态性在Java中的含义实现。 3. 阐述关系:解释抽象类如何促进多态性,通过例子说明。 4. 引用支持:自然地引用提供的引用内容。 5. 总结:清晰总结关系。 生成相关问题: - 在回答后,添加“§§相关问题§§”部分,列出2-3个相关问题。 LaTeX:问题中没有数学表达式,所以可能不需要。但如果有,确保格式正确。 中文回答:整个回答用中文。 引用标识:在引用的段落末尾添加[^n],例如[^1]。 最终回答框架: 1. 引言:重述问题,表示将解释关系。 2. 解释抽象类。 3. 解释多态性。 4. 连接关系。 5. 举例说明。 6. 总结。 7. 相关问题。</think>### Java中抽象多态性的关系 在Java中,抽象多态性是面向对象编程的两个核心概念,它们之间存在紧密的联系。抽象类为多态性提供了基础,而多态性则依赖于抽象机制来实现代码的灵活性可扩展性。下面我将逐步解释它们之间的关系。 #### 1. **抽象类的作用** - 抽象类(使用`abstract`关键字声明)不能被实例化,主要用于定义子类的公共行为属性。它包含抽象方法(没有实现的方法),强制子类提供具体实现。这有助于代码重用、统一接口设计,并确保子类遵循特定规范[^3]。 - 例如,一个抽象类`Animal`可以定义抽象方法`sound()`,但不提供实现,由子类如`Dog`或`Cat`具体实现。 #### 2. **多态性的定义** - 多态性是指不同对象对同一消息作出不同响应。在Java中,它主要通过运行时多态(方法重写)实现,即父类引用指向子类对象时,调用方法会根据实际对象类型执行不同逻辑[^1]。 - 实现条件包括:继承关系、子类重写父类方法、向上转型(父类引用指向子类对象)[^2]。例如,`Animal myAnimal = new Dog();`后调用`myAnimal.sound()`会执行`Dog`的`sound()`方法。 #### 3. **抽象类如何支持多态性** - **基础机制**:抽象类通过定义抽象方法,强制子类重写这些方法。当使用父类引用(如抽象类类型)指向不同子类对象时,调用重写方法会触发运行时多态。这使得代码可以统一处理多种子类类型,而无需关心具体实现细节[^4]。 - **示例说明**: - 定义一个抽象类: ```java abstract class Animal { abstract void sound(); // 抽象方法,强制子类实现 } ``` - 子类重写方法: ```java class Dog extends Animal { @Override void sound() { System.out.println("Woof!"); } } class Cat extends Animal { @Override void sound() { System.out.println("Meow!"); } } ``` - 多态调用: ```java public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); // 向上转型 Animal animal2 = new Cat(); // 向上转型 animal1.sound(); // 输出 "Woof!",根据实际对象类型执行 animal2.sound(); // 输出 "Meow!",体现多态性[^5] } } ``` 在这个例子中,抽象类`Animal`定义了统一接口`sound()`,子类提供不同实现。通过父类引用调用方法时,Java运行时系统根据对象类型(`Dog`或`Cat`)动态选择正确的方法,这正是多态性的核心体现[^4][^5]。 #### 4. **关键关系总结** - **依赖关系**:多态性依赖于抽象类(或接口)提供的抽象机制。抽象类定义了“契约”(抽象方法),子类实现具体行为,从而在运行时通过父类引用实现多态[^3]。 - **优势**:这种结合提高了代码的可扩展性维护性。例如,添加新子类(如`Bird`)无需修改抽象类代码,只需实现`sound()`方法,就能无缝集成到多态调用中[^2]。 - **与接口的区别**:抽象类可以包含具体方法字段,适合共享通用逻辑;而接口(如引用[4]所示)更纯粹地定义行为,但两者都支持多态性[^4]。 总之,抽象类是多态性的实现基础:它通过抽象方法强制子类重写,为运行时多态提供了必要的结构。理解这一点有助于设计更灵活的Java程序[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值