日期:2014-05-20  浏览次数:20740 次

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 源文件编译为类文件时就会报错。也就是说我们在编译阶段就能发现这样的错误。
如:
  @Override  //这个是给java编译器看的!
  public void driver() { 
    System.out.println("儿子重写父类方法,开个BMW"); 
  }

   补充:(下面的注释也是在JDK1.5提供的)
   @Deprecated 在方法前面声明一下,其意思是不推荐使用的方法,但是如果使用了,编译器不会出错,程序仍旧可以继续运行!
   @SuppressWarnings("deprecation") ; 这个是在方法前声明的,意思是忽略警告

6、this与super关键字:
   1)、一般用在子类中
   2)、this表示调用自己声明的属性和方法
(这里说的方法不一定就是构造方法)
3)、super表示调用父类声明的属性和方法
   4)、static方法中不能使用this与super关键字


7、继承中的构造方法(关键是匹配的问题!):
    1)、创建对象一定会调用构造方法
    2)、创建子类对象一定会调用父类的构造方法
    3)、子类默认调用父类无参构造方法(子类隐式构造方法默认调用父类无参(不管显式还是隐式)构造方法)
   4)、子类只能调用父类存在的构造方法(因为要匹配)
    5)、子类构造方法中使用super 调用父类构造方法,并且super必须放在第一行
    6)、构造方法中this 表示调用本类其他构造方法,并且this必须放在第一行


8、JAVA规定,如果某个类没有父类,那它就默认的继承自Object类,也就是说,Object是java体系所有类的直接或间接父类。根据子类可以拥有父类的属性和方法,所以所有java类拥有可以从Object继承的属性和方法。(所以SUN公司一般不轻易更改Object类!)

9、native关键字:一般对方法使用,意思是说明这个方法是本地方法,也就是与操作系统进行交互的方法(比如:多线程,对于线程,JVM是分配不了的,而是操作系统的分配,则这个native方法就会调用JDK安装文件里面jre中bin文件夹下的一些dll文件,和include文件夹中的h头文件)

10、在Object类中的toString方法,在练习中向控制台打印信息一般重写此方法,后期项目中使用较少。

11、在Object类中有finalize方法,类似在C++语言中的析构方法(但是在java中是没有析构方法的),在对象消亡(即收集堆内存空间)时由系统自动调用。因为我们无法得知垃圾回收车何时运行,也就无法得知finalize方法什么时候执行。但是我们用System.gc();建议垃圾回收线程运行。例如:
public class Test {
   public static void main(String[] args) {
	Student stu = new Student("张三") ;
	System.out.println(stu) ;
	stu = null ;
	System.gc() ; //这里仅仅是建议垃圾回收线程运行
   }
}



12、在学习java语言的时候,由一个让程序员比较幸福的地方,就是自动垃圾回收机制,但是对于程序,其运行的效率就降低了!
    于是就诞生了一个问题——我们创建的对象在什么时候被垃圾回收车收集呢?答案是:不知道!因为我们程序员根本没有办法来控制这个垃圾回收车(或者垃圾回收线程)什么时候运行,于是我们就无法得知这个方法(finalize方法)什么时候被调用!但是我们知道这个方法(finalize方法)在对象消亡的时候一定会被调用的!并且我们可以用System.gc();这行代码建议垃圾回收线程运行(这里仅仅是建议)


13、在Object类中有equal方法,比较两个对象的数值(堆内存中存储的对象数值)是否一致,一般也由子类重写(覆盖),比如我们使用的String类的equals方法就是覆盖的它。这个equal方法可以在eclipse中自动生成
    补充:
    ==比较的是栈内存的对象数值是否相等


14、instanceof:判断类型是否一致,现在已经不常使用了,因为有泛型的出现

15、在Object类中有clone方法,这个方法克隆的是堆内存的数据!