黑马程序员——java基础之继承,多态

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

1.继承:

提高代码的复用性。让类与类之间产生了关系,才有了多态的特性。

Java语言中:java只支持单继承,不支持多继承。因为多继承容易带来安全隐患:当多个父类中定义了相同功能,当功能内容不同时,子类对象不确定要运行哪一个。但是java保留这种机制。并用另一种体现形式来完成表示,多实现。

子父类中的函数:当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容。如同父类的函数被覆盖一样。

覆盖1.子类覆盖父类,必须保证子类权限大于等于父类权限,才能覆盖,否则编译失败。2.静态只能覆盖静态。

 

记住:重载:只看同名函数的参数列表。重写:子父类方法要一模一样。

 

子类中的构造函数:在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();

Super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();

 

为什么子类一定要访问父类中的构造函数?

因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化时,要先访问一下父类中的构造函数。

如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

注意:super语句一定定义在构造函数的第一行。

 

结论:子类的所有的构造函数,默认都会访问父类中空参数的构造函数。因为子类每一个构造函数内的第一行都有一句隐式super()

当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。

当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。

 

 

final关键字:

final 可以修饰类,方法,变量。

final 修饰的类不可以被继承。

final 修饰的方法不可以被覆盖。

final 修饰的变量是一个常量。只能被赋值一次。

内部类只能访问被final修饰的局部变量。

 

抽象类

抽象类的特点:

1.抽象方法一定在抽象类中。

2.抽象方法和抽象类都必须被abstract关键字修饰。

3.抽象类不可以用new创建对象,因为调用抽象方法没意义。

4.抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

 

模板方法设计模式:在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去。

 

  接口

       接口,可以被认为是一个特殊的抽象类。当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。接口使用interface来表示,子类中用implements实现。

格式为:

         interface 接口名{}   

        子类名 implements接口名{}

接口定义时,格式特点:

        1、接口中常见定义:常量,抽象方法。

        2、接口中的成员都有固定修饰符。

               常量:public static final

               方法:public abstract

        注意:接口中的成员都是public的。

在使用中,常量可以不写publicstatic final,方法可以不写publicabstract,编译时Java会自动添加这些修饰符,因为这是固定的格式修饰符。但为了方便阅读,通常我们都写上。

注:1、接口不可以创建对象的,因为有抽象方法。需要被子类实现(implements),子类对接口中的抽象方法全都覆盖后,子类才可以实例化。否则子类是一个抽象类。

        2、实现多个接口时,接口中不可以有返回不同类型的同名抽象函数。这样子类实现时将不能复写。

 接口的特点

        ①接口是对外暴露的规则。

        ②接口是程序的功能扩展。

        ③接口可以用来多实现。

        ④类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。

        ⑤ 接口与接口之间可以有继承关系。而且可以多继承。

 

接口与抽象类

       共性:都是不断向上抽取出来的抽象的概念。

       区别:

                1抽象类体现继承关系,一个类只能单继承。

                    接口体现实现关系,一个类可以多实现。同时接口与接口之间有继承关系。

                2、抽象类是继承,是 "is a "关系。

                    接口是实现,是 "like a"关系。

                3、抽象类中可以定义非抽象方法,供子类直接使用。

                    接口的方法都是抽象,接口中的成员都有固定修饰符。

                4抽象类中可以私有变量或方法。

                    接口中的常量和方法都是public修饰的权限。

 

2.多态

定义:某一类事物的多种存在形态。

例:动物中有猫,狗。

1,多态的体现

父类的引用指向了自己的子类对象;

父类的引用也可以接收自己的子类对象。

2,多态的前提

必须是类与类之间有关系,要么继承,要么实现。

通常还有一个前提:存在覆盖。

3,多态的好处

提高了程序的扩展性。

4,多态的弊端

提高了扩展性,但是只能使用父类的引用访问父类中的成员。

 

Animal a=new Cat();

  a.eat();

  类型提升,向上转型。

  Cat c=(Cat)a;

  c.cathMouse();

  如果想要调用猫的特有的方法时,如何操作呢?

  强制将父类的引用,转换成子类类型。这种为向下转型。

  

  千万不要出现这样的操作,就是讲父类对象转成子类类型。

  我们能转换的是父类的引用指向了自己子类对象时,该引用可以被提升也可以被强制转换。

  多态自始至终都是子类对象在做着变化。

在多态中,静态成员函数的特点:无论编译和运行,都参考左边。

一个继承多态的经典例子:

class A {
            void fun1() {
                      System.out.println(fun2());
                }
                int fun2() {
                        return 123;
                }
        }
         public class B extends A {
                int fun2() {
                         return 456;
                 }
              public static void main(String args[]) {
                        B b = new B();
                        b.fun1();
                        A a = b;
                        a.fun1();
                }
        }

运行结果是:

456

456

分析结果:第一个执行语句创建B对象,而B类继承A类,所以B类中的fun2()方法会覆盖A类中的fun2()方法因此b.fun1()语句调用的是B类中的fun2()方法,故返回456。

A a = b;语句的作用是将B类的对象赋值给父类,就是多态中的向上转型,a和b指向对内存中的同一对象故调用结果也是456。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值