J2SE自学(七)——面向对象之继承.
1、计算机编程语言现在有两个重要的分类是:面向过程的编程语言与面向对象的编程语言。
1)、面向过程的编程语言:典型代表是C,在C 中,程序由一个过程(又称函数,方法)组成,程序由main 过程开始执行,main 过程又可以调用别的过程。当然很多个过程也可以集中在一个点h 的头文件中,我们需要的时候导入头文件,类似于java 中的导入包。
2)、面向对象的编程语言:它是现在的主流,比如 C++,Java,C#。在面向对象的语言中万事万物皆对象(类),但不是有了类就可以称为面向对象的编程语言了,它还必须满足面向对象的三个基本特征,即:封装,继承,多态。比如有门语言 JavaScript,虽然其内部也有类与对象的概念,但并没有完全满足面向对象的三个特征,所以我们把它叫基于对象的语言。到这里,我们也明白判断一门语言是或否为面向
对象的标准:即是否支持封装,继承与多态。
2、继承定义:在一个类基础上定义一个新类叫继承,原有的类叫父类,新生成的类叫子类。(在OOAD(面向对象的分析与设计)中,继承又叫派生,父类又叫超类)。
3、Java中只有单继承,也就是说,在Java中一个类只能继承自一个父类。Java 虽然不允许一个子类有多个父类,但允许一个父类有多个子类。而且父子类的关系是相对的。
补充:
C++中有多继承,多继承带来的麻烦并不比它带来的方便少,因为它使类的体系结构变的混乱,这也是我们称C++为最不纯粹面向对象语言的一个原因。(在很多资料上说C++是最不纯粹的面向对象语言,其中一个原因就是因为C++万恶的多继承,还有一个重要原因是因为C++中保留了指针,指针的保留提高了C++运行速度效率,但也增加了程序的复杂性,学习难度。)可是反过过来说,Java也不是很纯粹的面向对象的语言!因为有两个原因——①、main方法;②、8个基本数据类型。
那有没很纯粹的面向对象的语言呢?有!SmallTalk语言就是(在SmallTalk中,所有的东西都是对象,包括int,甚至加号。)!可是不常用,因为效率不是很高!但它是Java的基础语言!
4、在Java 中,继承由extends 关键字实现(在C#语言用:实现)
补充:
在Eclipse中用快捷键“Ctrl + t”可以列出类的等级结构
在Eclipse中用快捷键“Shift + Ctrl + t”可以打开你想要的类(要输入这个类名才可以)
在Eclipse中用快捷键“Ctrl + o”可以列出类的属性和方法结构
5、继承特点:
1)、子类拥有父类所有可以继承的属性和方法 (如private修饰的方法就不能继承了)
①、当两个类有多个相同的属性方法时,抽取父类。
②、减少代码冗余,实现代码复用。
2)、子类可以有自己新的属性和方法
3)、子类可以重写(覆盖)父类的方法 (在Eclipse中的快捷键是“Shift + Alt + S”)
方法覆盖(方法重写):子类方法与父类方法具有相同的方法声明(方法头),不同的实现(方法体)。方法覆盖是相对于父子类而言的,一个类无法实现覆盖(也就是说没有类覆盖)。
①、可以声明父类,创建子类(父类能出现的地方,子类一定能出现)
②、声明的什么类型,就只能调用本类型的属性和方法——意思是声明什么类型就要站在什么类型的角度来调用相关的属性和方法——(同时也暗含的说明子类继承了父类的属性和方法。但也不是说子类可以继承父类所有的属性和方法,比如private修饰的就绝对不行)
③、创建的什么类型,运行什么类型的方法(因为有方法的重写——其实这句话里暗含有多态的思想了!)
④、创建的什么类型,就可以强转为什么类型
5、关键字:@Override(JDK1.5提供):@Override 用在子类方法声明的前面,表示此方法是重写的父类方法,当方法声明不满足时,在Java 源文件编译为类文件时就会报错。也就是说我们在编译阶段就能发现这样的错误。
如:
public class Test { public static void main(String[] args) {Student stu = new Student("张三") ;System.out.println(stu) ;stu = null ;System.gc() ; //这里仅仅是建议垃圾回收线程运行 }}