-------android培训、java培训、期待与您交流! ----------
面向对象(中)
继承:
什么是继承:
一个新类从已有的类那里获得其已有的属性和方法,这各现象叫做类的继承,这个新类被称为子类,也叫派生类,已有的那个类叫做父类,也叫做基类。
为什么需要继承:
提高代码的重用性,形成一种类的层次结构,为多态创造条件。
说明:
父类的私有成员不可以被继承,其他的成员都可以被继承。
子类所在方法的内部都可以访问父类私有的成员以外的所有成员,所谓子类的所有方法也包括子类的私有方法
java只支持单继承,不允许多继承。
子类可以继承父类的所有成员变量和成员方法,但子类不可以继承父类的构造方法,在子类的构造方法中可使用super调用父类的构造方法。
Super:
什么是super:
调用父类的构造方法
为什么需要super:
调用父类的构造方法时必须借助于super,
说明:
每个子类构造方法的第一条语句,都是隐含地调用super
如果显示的写出super语句,则必须保证该语句是第一条语句,并且必须保证参数一致。
方法的重写:
什么是方法的重写:
指在子类中重新定义父类中已有的方法
为什么需要方法的重写:
如果子类对继承自父类的方法不满意,就应该重写父类的方法
说明:
重写方法必须和被重写方法具有相同的方法名称,参数列表和返回值类型
子类中不允许出现与父类同名同参但不同返回类的方法,如果出现了,编译时会报错。
重写方法时,不能使用比父类中被重写的方法理更严格的访问权限
多态:
什么是多态:
一个父类的引用类型变量它既可以指向父类对象也可以指向子类对象,它可以根据当前时刻的指向不同,自动调用不同的对象方法,这就是多态。
为什么需要多态:
利用多态可以实现现一段代码做不同的事情
说明:
子类对象可以直接赋给父类引用,但父类对象在任何情况下都不可以直接赋给子类引用,因为子类可当做父类看待,但父类不可以当做子类看待。
通过父类引用只能访问子类从父类继承对来的成员
通过父类引用不能访问子类所特有的成员
只有父类引用本身指向的就是一个子类对象时,才可以把父类引用强制转化为子类引用。
/* 父类引用永远不可能直接赋给子类引用 注意: 只有在父类引用本身指向的就是一个子类对象时,才可以把父类引用强制转化为子类引用 其他情况下不允许把父类引用强制转化为子类引用 */ class A { } class B extends A { } public class TestPoly_3 { public static void main(String[] args) { A aa = new A(); B bb = new B(); //bb = aa; //error //bb = (B)aa; //24行 编译没有错误,但运行时出错! 因为aa指向的是父类对象 A aa2 = new B(); //bb = aa2; //error 永远不可以把父类引用直接赋给子类引用 bb = (B)aa2; //OK 因为aa2 本身指向的就是一个B类对象 所以可以进行强制转化,注意与24行的区别 如果父类引用指向的是个子类对象,则可以通过强制类型转化把父类引用强制转化为子类引用,注意必须强制转化,在Java中无论如何绝对不可能直接把父类引用赋给子类引用的 } }
抽象类:
什么是抽象类:
抽象类指的是含用纯虚函数的类,该类不能建立对象,只能声明指针和引用,用于基础类的接口和运行时的多态。
为什么需要抽象类:
利用抽象类是为了更邓的对类加以分类,就如同人类不但给各种具体的植物取了名字还发明了“植物”这个抽象的词对所有具休的植物进行归类
说明:
用abstract关键字来修饰一个类是,该类叫做抽象类
包含抽象方法的类必须声明为抽象类
但是一个抽象类中却可以不包含任何抽象方法
抽象类不一定有抽象方法,有抽象方法的一定是抽象类
//如果f方法没有方法体,则必须的在class前加 abstract 如果f方法含有方法体, //则class前面可加也可不加abstract ,因为“一个抽象类中是可以不包含任何抽象方法,尽管比较少见” abstract class A { private int i; public abstract void f(); //如果f方法没有方法体,则f方法必须的声明为抽象方法,即必须的在前面加abstract } class TestAbsClass_1 { public static void main(String[] args) { System.out.println("今天我很高兴!"); } }
什么是抽象方法:
在定义java方法时可以只给出方法头,而不给出方法内部实现代码,这样的方法称为抽象方法
说明:
凡是没有方法体的方法必须的使用关键字abstract修饰为抽象方法
凡是含有抽象方法的类必须的声明为抽象类
Final修饰符:
什么是Final:
Final是修饰符,它可以修饰整个类,类中的若干个属性或类中的若干个方法,一般的意思就是声明“这个东西不能改变”。
为什么需要Final:
之所以要使用 final 方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改 变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可 以采取这种做法。
采用 final 方法的第二个理由是程序执行的效率。将一个方法设成 final 后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。只要编译器发现一个 final 方法调用,就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法
利用final定义方法:这样的方法为一个不可覆盖的方法。Public final void print(){}, 为了保证方法的一致性(即不被改变),可将方法用final定义。如果一个方法前有修饰词private或static,则系统会自动在前面加上final。即private和static方法默认均为final方法。对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效。
注:
final并不涉及继承,继承取决于类的修饰符是否为private、default、protected还是public。也就是说,是否继承取决于这个方法对于子类是否可见。
Abstract(抽象)可以修饰类、方法如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。Abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。Abstract虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。Final和abstract永远不会同时出现。
说明:
用Final修饰一个类,表示该类不能被继承
用Final修饰的方法表示该方法可以被子类继承,但不可以被子类重写
用Final修饰类中的若干个属性表示该属性必须被赋值并且只能被赋一次值
一个类的所有普通方法内部都不可以修改final修饰过的成员变量的值
/* final类型修饰的属性必须在定义的同时初始化 如果final类型修饰的属性没有在定义的同时初始化,则必须在该类中的所有构造函数中完成初始化 不过这两种初始化只能存在一种,否则编译时会报错!因为final表示常量的意思,常变量当然不能被初始化两次了 */ class Point { int x; final double PI = 1.9; //10 final定义的变量必须在定义的同时初始化 如果这里只定义不初始化则我们就必须在所有的构造函数中完成对final变量的初始化 不过这两种方式只能选择其中的一种 Point() { //PI = 1.234; //只要10行对PI进行了初始化,本语句就必须的被注释掉,否则编译时会报错! } Point(int m, int n) { //PI = 2.33; //只要10行对PI进行了初始化,本语句就必须的被注释掉,否则编译时会报错! } void output() { //PI = 2; //error 因为“一个类的所有方法内部都不可以修改final修饰过的成员变量的” System.out.printf("%d %f\n", x, PI); } public static void main(String[] args) { Point pt = new Point(); pt.output(); } } /* 在JDK 1.6中的运行结果是: ----------------- 0 1.900000 ----------------- */