1、Java大学实用教程58章知识点Java大学实用教程 = 第五章继承、接口与泛型 5.1 子类与父类 子类继承父类的状态和行为,并根据需要增加它自己的新的状态和行为。 Java只支持单继承,即子类只能有一个父类。子类对象一定是父类对象(Is-A)。 使用关键字extends来声明继承关系。如果一个类未显式声明父类,它默认是Object类的子类。 Object类是所有其它类的最终父类。 5.2 子类的继承性 子类的方法中可访问的父类的成员变量和方法是子类继承下来的成员变量和方法。 如果子类和父类在同一个包中,那么子类继承了其父类中非private的成员变量和方法。 如果子类和父类不在同一个包中,
2、那么子类只能继承父类的protected、public成员变量和方法。 继承的成员变量和方法的访问权限不变。 5.3 子类对象的构造过程(例5-2) 子类的构造方法中总是先调用父类的某个构造方法,如果未显式调用父类的构造方法,默认调用父类无参数的构造方法。 子类对象中包含了父类对象。子类对象的构造过程:为继承链中各个类的成员变量分配内存空间并清零,自上而下对每个类的成员变量执行定义初始化和构造初始化。 通过调用继承下来的父类方法可以实现对未继承的父类成员的访问。 5.4 成员变量隐藏和方法重写(例5-3,例5-4) 子类中定义的成员变量与父类中的成员变量同名时(不必类型相同),子类就隐藏了继承
3、的成员变量。 方法重写(override):子类中定义一个方法,并且这个方法的名字、返回值类型、参数个数和类型与从父类继承的方法完全相同。 子类通过方法重写可以隐藏继承的方法,把父类的行为改变为自身的行为。 5.5 关键字super(例5-6,例5-7) 用法一:使用super调用父类的构造方法。 子类不继承父类的构造方法,子类如果想使用父类的构造方法,必须使用super关键字,而且super必须是子类构造方法中的第一条语句。 用法二:使用super操作被隐藏的成员变量和方法。 5.6 final类和final方法 final类不能被继承,final方法不能被重写。 5.7 对象的上转型对象(
4、例5-8) 把子类对象b的引用赋值给父类对象a时,称a为b的上转型对象。好比,把老虎当做哺乳动物。 对象的上转型对象对于理解多态以及面向抽象的编程至关重要。 上转型对象的实体是由子类负责创建的,它只能访问父类的成员,但当它调用被子类重写了的父类方法时,它会通知子类对象调用重写的方法。上转型的目的是为了实现多态。 5.8 继承与多态(例5-9) 多态:不同对象的上转型对象调用同一方法可能产生不同的行为。多态的目的是为了实现面向抽象的编程。 5.9 abstract类 抽象类:用关键字abstract修饰的类。 抽象方法:只允许声明不允许实现的方法。抽象方法不能用final修饰。 抽象类中可以有抽
5、象方法,含有抽象方法的类必须是抽象类。抽象类的非抽象子类必须重写父类的抽象方法。 不能用抽象类new对象,用抽象类声明的对象只能作为其子类对象的上转型对象,通过该上转型对象可以回调子类重写的方法以实现“多态”。 5.10 面向抽象(例5-10) 为了使程序可扩展、易维护,设计程序时应当遵循“开-闭原则”。 “开-闭原则”:一个应用程序应当对扩展(增加新类)开放,对修改(修改现有类)封闭。 “面向抽象”可以很好地体现“开-闭”原则,其核心思想如下: 1)抽象细节 将经常变化的部分分离出来,作为抽象类的抽象方法。比如,柱体的求底面积的方法经常变化,可以将其作为抽象类Geometry的一个方法。 2
6、)面向抽象设计类 面向抽象类来设计一个新类。比如,在Pillar类中,声明Geometry类的成员变量作为柱体的底。 最终,Pillar类的设计不依赖于细节,即不依赖于抽象类Geometry的子类,当程序再增加一个Geometry类的子类时,Pillar类不需要做任何修改。 5.11 接口(例5-11) 接口是一种纯抽象的功能封装体。一个类只能继承一个父类,但可以通过实现接口来不断扩展功能。 实现接口类似于继承抽象类。 使用关键字interface来声明接口,接口中可以声明默认为public static final的常量和默认为public abstract的方法。 类通过使用关键字impl
7、ements 声明自己实现一个或多个接口。如果实现多个接口,用逗号隔开接口名。 如果一个类实现某个接口,就必须实现该接口的所有方法。类在实现接口方法时,一定要用public来修饰。 接口和类一样,可以是public或者友好的。 如果父类实现了某个接口,那么子类就自然实现了该接口。 接口的思想在于它可以增加很多类都需要实现的功能,使用相同接口的类不一定有继承关系。 5.12 接口回调(例5-12,例5-13) 接口回调:可以把实现了某一接口的类创建的对象的引用赋值给用该接口声明的变量,当接口变量调用接口中被类实现的接口方法时,就是通知相应的对象调用被实现的方法,这一过程称为接口回调。接口回调和上
8、转型对象的回调是一样的。 不同的类在实现同一接口时,可能具有不同的功能体现,因此通过接口回调可以实现“多态”。 不能用接口new对象,用接口声明的变量只能作为实现了该接口的类的对象的上转型对象,通过接口变量可以回调被类实现的方法以实现“多态”。 5.13 面向接口(例5-14) 通过接口回调产生的多态性也可以实现程序设计的“开-闭”原则。 可以将经常变化的部分分离出来,作为接口中的抽象方法,然后面向接口来设计类。 5.14 抽象类与接口的比较 二者都可以有抽象方法,接口中只能声明常量和抽象方法,而抽象类中可以声明成员变量和具体的方法,可根据应用需要选择使用抽象类或接口。 二者的本质都是将易变化
9、的部分推迟到子类去实现,通过面向抽象的编程实现“开-闭”原则,使应用程序不依赖于易变的细节。 5.15 内部类 在内部类中可以访问外部类的一切成员。当希望一个类B可访问另一个类A的全部成员的时候,可考虑将类B嵌入类A中。 5.16 匿名类(例5-16,例5-17) 与类有关的匿名类 Java允许直接用类名和一个类体创建一个匿名对象,此类体被认为是该类的一个子类去掉类声明后的类体,即匿名类。 与接口有关的匿名类 Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了该接口的类去掉类声明后的类体,即匿名类。 匿名类一定是内部类,匿名类的主要用途就是向方法的参数传值。 5.17 异
10、常类(例5-18,例5-19) Java使用try-catch语句来处理异常。将可能出现异常的操作放在try-catch语句的try部分,当try部分中的某个语句发生异常后,try部分将立刻结束执行,而转向执行相应的catch部分,因此程序可以将发生异常后的处理放在catch部分。 各个catch语句的参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常,这些子类之间不能 有父子关系,否则保留一个含有父类参数的catch语句即可。 try-catch语句后面可以有finally语句,无论是否发生异常,finally语句中的内容都会执行,通常将释放资源的操作(比如关闭数据
11、库连接)放入finally语句中。 可以扩展Exception类来定义自己的异常类,然后规定哪些方法产生这样的异常。一个方法在声明时可以使用关键字throws声明抛出可能发生的若干种异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象并抛出,这将导致该方法结束执行并抛出所创建的异常对象。程序必须在try-catch语句中调用抛出异常的方法。 课后问答题和作业 问答题:1-13 作业:1,2,4 = 第六章字符串 6.1 String类 创建字符串对象 String s; s=new String(“hello”); 一步完成:String s=new String(“he
12、llo”); 可以用字符数组构造字符串对象。 引用字符串常量 字符串常量是对象,可以把字符串常量的引用赋值给一个字符串变量。如:String s=”hello”; 内容相同的字符串常量在内存中只有一份数据。 String类的常用方法(见教材)(例6-1) 有两个字符串对象s1和s2,理解s1=s2与s1.equals(s2)的区别。 字符串与基本数据类型的相互转化 基本数据类型包装类.parseXxx方法可以将字符串转化为基本数据类型。 String.valueOf可以将基本数据类型转化为字符串,也可以通过”+基本数据类型的方式转化。 对象的字符串表示(例6-3) Object类有一个publ
13、ic方法public String toString(),一个对象通过调用该方法可以获得该对象的字符串表示。 一个类可以通过重写toString()方法来重新定义该类的对象所期望的字符串表示。 字符串与字符数组、字节数组(例6-5) 字符串对象调用public char toCharArray()方法可以根据字符串的内容创建一个字符数组。 String类的方法public byte getBytes()使用平台默认的字符编码,将当前字符串转化为一个字节数组(编码)。 String类的构造方法String(byte)或String(byte,int offset,int length)根据平台默
14、认的字符编码用字节数组或字节数组的一部分构造一个字符串对象(解码)。 课后问答题和作业 问答题:1 作业:1 = 第七章常用实用类 7.1 Date类 Date对象 用java.util包中的Date类的无参数构造方法可以创建表示本地当前时间的Date对象。 用Date的构造方法Date(long time)创建的Date对象,表示相对于1970年1月1日0点(GMT)的时间。 System类的静态方法public long currentTimeMillis()可以获取系统当前时间,这个时间是从1970年1月1日0点(GMT)到目前时刻所经过的毫秒数。 Date类的缺点:不能设置时间子项。
15、格式化时间(例7-1) 可以使用SimpleDateFormat类来实现时间的格式化。首先,用构造方法public SimpleDateFormat(String pattern)创建一个时间格式化对象,参数pattern用来指定时间格式,pattern中含有时间元字符;然后,用时间格式化对象调用public String format(Date date)方法格式化Date对象并返回结果字符串。 7.2 Calendar类 Calendar类的静态方法getInstance()可以获得一个表示本地当前时间的日历对象。 日历对象调用一系列重载的set方法可以将日历翻到任何一个时间。 calen
16、dar对象调用方法public int get(int field)可以获取年份、月份、小时、星期等信息,参数field的有效值由Calendar的静态常量指定。规定:0表示1月,1表示2月;1表示周日,2表示周一。(例7-2,例7-3) 7.3 Math类 public static double random()方法返回0,1)之间的一个double值。 课后问答题和作业 问答题:1-3 = 第八章线程 8.1 Java中的线程 进程是程序的一次动态执行。一个进程中可以有多个线程,即可以有多条执行线索。 Java的多线程就是在操作系统分配给Java程序的一个CPU时间片内,在若干个独立的可
17、控制的线程之间切换。 Java程序的主线程负责执行main方法,main方法中可以创建其它线程。程序中的所有线程都终止程序才退出。 System.exit(int n)方法会立即结束整个程序的运行,终止所有线程。 8.2 线程的生命周期 在Java语言中,Thread类及其子类创建的对象称为线程 线程的生命周期中要经历4种状态。(例8-1,例8-2) 新建:当一个Thread类或其子类的对象被声明并创建时,线程对象处于新建状态。 运行:线程对象调用start方法后,线程会进入线程等待队列,一旦获得CPU资源就会立即执行。 可以用Thread类的子类创建线程对象,子类必须重写父类的run方法以规
18、定线程的具体操作。 中断:线程切换或睡眠等原因会导致线程中断运行。 终止:run方法运行结束,线程就会终止。终止的线程不具有继续运行的能力。 线程间的切换依赖于CPU资源的使用情况,具有不确定性。 8.5 使用Runnable接口 创建线程的另一个途径是用Thread类的构造方法Thread(Runnable target)直接创建线程对象。该构造方法中的参数为Runnable接口类型,因此必须向构造方法传递一个实现了Runnable接口的类的对象,该对象称为所建线程的目标对象。当线程获得CPU资源时,接口变量就会自动调用接口中的run方法,再通过接口回调调用被实现的run方法。 对于使用同一目标对象的线程,目标对象的成员变量自然就是这些线程共享的数据单元。(例8-5) 课后问答题和作业 问答题:1-4 =
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1