------- android培训、java培训、期待与您交流! ----------
9 继承
9.1 继承提高了代码的复用性,让类与类之间产生了关系,有了这个关系才有了多态的特性.千万不要为了获取其它类的功能,简化代码而继承,必须是类与类之间有所属关系才可以继承.
9.2 在Java语言中只支持单继承,不支持多继承,因为多继承会带来安全隐患(当多个父类中定义了相同的功能,但是功能内容不同时,子类对象不知道要运行哪一个),C++支持多继承,Java保留了这种机制,并用另一种体现形式来完成表示---多实现.
9.3 Java支持多层继承,也就是一个继承体系,如休使用一个继承体系中的功能呢?--->先查阅父类的描述,因为父类定义的是这个体系中的共性功能,通过了解共性功能,就可以知道该体系的基本功能.在具体调用时,创建子类对象,因为:
1>有可能有父类是不能创建对象的;
2>创建子类对象可以获取更多的功能,包括共性的,特有的.
9.4 子父类中变量的特点
如果子类中出现非私有的同名的变量时,子类访问本类的变量要用this;
访问父类的变量要用super.super和this的使用几乎一致,this代表本类对象的引用;
super代表父类对象的引用.
9.5 子父类中函数的特点---覆盖
1>覆盖又称为重写,当子类出现和父类一模一样的函数时,当子类对象调用该函数会运行子类函数的内容.子类继承父类,沿袭了父类的功能,子类虽然具备该功能,但是功能的内容却和父类不一致,这时没有必要定义新的功能,而是使用覆盖特性,保留父类的功能定义,重写功能的内容.
2>子类覆盖父类时,必须保证子类权限大于父类权限才可以覆盖,否则编译失败,静态只能覆盖静态.
9.6 子父类构造函数的特点----子类实例化的过程子类中的所有构造函数都会默认访内的问父类中的空参构造函数,因为每一个子类的构造 函数第一行都有一句隐式的super();当父类没有空参构造函数时,子类必须通过手动super();来指定要访问的父类构造方法.当然,子类构造函数的第一行也可以手动指定this语句来访问本类中的构造函数,子类中至少有一个构造方法会访问父类的构造方法.
this,super为什么不能在同一构造函数中--->因为都要在第一行,为什么要在第一行--->因为初始化动作要先做.
9.7 final关键字
1> final,最终,作为一个修饰符,可以修饰类,函数,变量;被final修饰的类不可以被继承;被final修饰的函数不可以被复写.
注:final既可以修饰成员变量,又可以修饰局部变量.当内部类定义在局部位置上时,只能访问该局部被final修饰的局部变量.
10 抽象方法,抽象类
10.1 当多个类中出现相同的功能,但是功能的主体不同,这时可以向上抽取,只抽取功能定义,不抽取功能主体----->抽象方法
注:抽象方法只能放在抽象类中.
10.2 抽象类的特点:
1> 抽象方法一定定义在抽象类中;
2> 抽象类和抽象方法必须被关键字abstract修饰;
3> 抽象类不可以用new创建对象,因为调用抽象方法没有意义;
4> 抽象类的抽象方法要被使用必须由子类复写所有抽象方法后,建立子类对象调用,如果子类只覆盖了部分抽象方法,该子类还是一个抽象类.
10.3 抽象类中可以没有抽象方法,这样做是为了为让该类建立对象.抽象类强迫它的子类去复写它的抽象方法.
11.接口
11.1 初期理解
可以认为接口是一个特殊的抽象类.当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示.
11.2 格式特点:
接口中成员都有固定的修饰符,
常量:public static abstract
方法:public abstract
这些修饰符可以省略,系统会默认加上,但是为了提高阅读性,建议加上.
11.3 接口可以被类多实现,一个类可以实现多个接口,也是多继承不支持的转换形式.一个类在继承一个类的情况下,还可以实现多个接口.接口与接口之间是继承关系.接口之间可以多继承.接口是对外暴露的规则,是程序的功能扩展,降低了程序的耦合性.
12 多态
12.1 定义:某一事物存在多种形态. 如动物 X = new 狗();
12.2 多态----扩展性
体现:父类引用指向了自己的子类对象,父类引用可以接收自己的子类对象.
好处:大大提高了程序的扩展性. 前提:类与类之间存在关系(继承,实现);还有一个前提:存在覆盖.
局限性:只能用父类引用访问父类中的成员.
12.3 转型
向上转型:Animal a = new Cat();类型向上提升,Cat--->Animal,自动完成.
向下转型:强制将父类引用转成子类类型,Cat c = (Cat)a;
注意:当父类可以创建对象时,是不可以向下转型的,千万不要将父类对象转成子类类型.
12.4 多态中成员的特点
1> 多态中成员函数的特点:在编译时期参阅引用型变量所属的类中是否有所调用的方法,如果有,编译通过,否则,不通过.在运行时期,参阅对象所属的类中是否有所调用的方法.总之,编译时看左边,运行时看右边.
2> 多态中成员变量的特点:无论编译,运行时期,都看左边,引用型变量所属的类.
3> 在多态中静态成员函数的特点:无论编译,运行时期,都看左边.static优先于对象存在.
13 内部类
13.1 概念:将一个类定义在另一个类里面,里面的那个类就称为内部类(内置类或嵌套类).
13.2 内部类的访问规则
1> 内部类可以访问外部类有成员,包括私有.
2> 外部类要访问内部类必须建立内部类对象.
注:之所以内部类可以直接访问外部类成员,是因为内部类持有一个外部类的引用(外部名.this).内部类访问局部变量,该局部变量必须被final修饰.
13.3 内部类的定义原则
当描述事物时,事物内部还有事物,该事物就用内部类描述,尽量将内部类封装,提供访问内部类的方法.
13.4 静态内部类
1>内部类处于外部类的成员位置时,就可以被成员修饰符所修饰,private: 将内部类在外部类中进行封装.static: 内部类就具备静态的特性.当内部类被静态修饰时,就只能访问外部类中的静态成员,出现访问局限.
2>如何访问静态内部类的非静态成员(function())
new Outer.Inner().function();
如何访问静态内部类中的静态成员(function())
Outer.Inner.function();
3>当内部类有静态成员时,该内部类必须是静态的. 当外部类中的静态成员访问内部类时,内部类必须是静态的.局部内部类不能被静态修饰,里面也不能有静态成员 13.5 匿名内部类
1> 匿名内部类其实就是内部类的简写格式定义一个内部类的前提:必须继承一个类或实现一个接口.
格式: new 父类名或接口名(){定义子类内容}
注:其实匿名内部类就是匿名子类对象,而且这个对象是带内容的.
2> 匿名内部类不可以被成员修饰符修饰,可以直接访问外部类中的成员,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量.