java入门篇(9)多态,抽象类,接口,修饰符,static

在这里插入图片描述

一、抽象类的一些特性

1.1 成员方法

  • 可以包含抽象方法和非抽象方法。
  • abstract修饰的方法在父类中申明,只有方法名,没有方法体。
    如:abstract void method();
  • 非抽象方法可以被protected,public ,final,static修饰
  • 抽象方法不能被private,static修饰
  • 抽象方法可以定义返回类型;
  • 父类static,final,static,privated修饰的方法不可以被子类重写,其他的都可以。
  • 重写父类的方法,权限修饰符只能大于或者等于原方法权限修饰符。
  • 必须要重写的方法是原父类方法中abstract修饰的方法。

1.2 成员变量

  • abstract 不可以修饰成员变量
  • 成员变量可以用public,private,protected,static,final修饰,default,abstract不可以。
  • final修饰的必须赋初值,static修饰的不可以赋初值。

1.3 构造方法

  • 可以有构造法方法,不可以由final,static,abstract修饰。
  • 可以有无参构造,也可以有有参构造。
  • 有构造方法但是不能实例化

1.4 子类

  • 子类为抽象类,不用重写父类方法
  • 子类不为抽象类,必须重写父类的抽象方法

1.5 父类

  • 父类不能被实例化,但是可以创建子类的对象
  • 可以定义一个抽象类的对象变量,但是只能引用非抽象子类的对象。

二、继承和多态

2.1 多态的特性

  • 在父类引用指向子类对象时:
    先看在父类中有没有该方法,有,再从子类中找到对应的子类方法,然后执行子类的方法,否则执行子类上一层父类的方法。
  • 再看父类的方法体中是否嵌套子类有的方法,有,执行子类方法,否则执行父类方法体中内容

2.2 子类构造函数调用父类构造函数

  • 构造函数的调用只能发生在构造函数体中

  • 子类所有构造函数默认调用父类的无参构造函数

  • 父类自定义有参构造函数,系统不会定义默认无参构造函数,此时需要子类显示调用父类相关构造函数。

  • 子类调用父类构造函数,作用是初始化子类从父类继承来的成员属性。

2.3 向上转型和向下转型

  • 可以通过强制类型转换将子类引用转换为父类引用(向上转型),作用:不能访问子类特有的成员方法和成员变量。

  • 通过强制类型转换将父类引用转换为子类引用(向下转型),作用:可以访问子类特有的成员变量和成员方法。

  • 子类引用不能指向父类引用:会报Incompatible types错误

  • 父类引用可以指向子类引用,可以调用子类的成员方法和成员变量。

  • 子类引用a可以指向向下转型后的父类的引用b,然后b调用子类所有的成员方法和成员变量;父类引用也可以指向向上转型的子类的引用。

  • final修饰的方法也不能被继承,但是final修饰的字段可以被继承

  • 继承重写的方法的访问控制符的粒度不能比之前的小,只能更大

  • 代码展示:

public class duo {
    public static void main(String[] args) {
        A22 a = new A22();
        A22 a1 = new A22("a", "c");
        A22 b = new A3();
        A22 b1 = new A3("a", "b", "c");
        A3 c = new A3();
        A3 c1 = new A3("a", "b", "c");
        c = (A3) a1;
        A3 c2 = (A3) new A22();
        System.out.println(((A22) c).a);
    }
}

class A22 {
    String a;
    String b;

    A22() {
    }

    A22(String a, String b) {
        this.a = a;
        this.b = b;
    }

    public void show() {
        System.out.println("父类的成员变量的值a:" + a + "," + "b:" + b);
        System.out.println("父亲");
    }
}

class A3 extends A22 {

    String c;

    A3() {
        super();
    }

    A3(String a, String b, String c) {
        super(b, c);
        super.show();
        this.c = c;
    }

    public void method1() {

    }
}

2.4 多态定义

父类指针指向不同类型的子类对象,执行子类对象的特有方法,得到的结果是不一致的。

2.5 动态绑定(dynamic binding)

是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

2.6 多态作用

消除类型之间的耦合关系。

2.7 多态存在的必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象

2.8 多态的好处

  • 可替换性(substitutability):多态对已存在代码具有可替换性
  • 可扩充性(extensibility):多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
  • 接口性(interface-ability)::多 态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
  • 简化性(simplicity):多态简化对应用软件的代码编写和修改过程。

2.9 多态的实现方式

接口实现,继承父类进行方法重写,同一个类中进行方法重载。

三、接口和抽象类的区别

Java抽象类和接口的详细区别(全)

表示关系默认字段修饰符默认方法修饰符构造函数子类继承特性
接口定义规范public static final,且只能是public static final,可以不写static final,但其实还是static,finalpublic abstract,可以有方法体,但是由default修饰,其他方法必须是public abstract接口可以继承多个接口
抽象类表示关系默认是defaultabstract/正常的,抽象类中可以没有抽象方法抽象类需要有构造函数,供子类使用子类可以是抽象类或者非抽象类
  • final和abstract是相互对立的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值