java多态性第6章

合集下载

java答案第六章

java答案第六章

Java语言程序设计第六章课后习题答案1.将本章例6-1至6-18中出现的文件的构造方法均改为使用File类对象作为参数实现。

个人理解:File类只能对整文件性质进行处理,而没法通过自己直接使用file.Read()或者是file.write()类似方法对文件内容进行写或者读取。

注意:是直接;下面只提供一个例2变化,其他的你自己做,10几道啊,出这题的人真他妈有病。

import java.io.*;public class test6_2{public static void main(String[] args) throws IOException { String fileName = "D:\\Hello.txt";File writer=new File(fileName);writer.createNewFile();BufferedWriter input = new BufferedWriter(newFileWriter(writer));input.write("Hello !\n");input.write("this is my first text file,\n");input.write("你还好吗?\n");input.close();}}运行结果:(电脑系统问题,没法换行,所以一般使用BuffereWriter中newLine()实现换行)2.模仿文本文件复制的例题,编写对二进制文件进行复制的程序.// CopyMaker类import java.io.*;class CopyMaker {String sourceName, destName;BufferedInputStream source;BufferedOutputStream dest;int line;//打开源文件和目标文件,无异常返回trueprivate boolean openFiles() {try {source = new BufferedInputStream(newFileInputStream( sourceName ));}catch ( IOException iox ) {System.out.println("Problem opening " + sourceName );return false;}try {dest = new BufferedOutputStream(newFileOutputStream( destName ));}catch ( IOException iox ){System.out.println("Problem opening " + destName );return false;}return true;}//复制文件private boolean copyFiles() {try {line = source.read();while ( line != -1 ) {dest.write(line);line = source.read();}}catch ( IOException iox ) {System.out.println("Problem reading or writing" );return false;}return true;}//关闭源文件和目标文件private boolean closeFiles() {boolean retVal=true;try { source.close(); }catch ( IOException iox ) {System.out.println("Problem closing " + sourceName );retVal = false;}try { dest.close(); }catch ( IOException iox ) {System.out.println("Problem closing " + destName );retVal = false;}return retVal;}//执行复制public boolean copy(String src, String dst ) {sourceName = src ;destName = dst ;return openFiles() && copyFiles() && closeFiles();}}//test6_2public class test6_2{public static void main ( String[] args ) {String s1="lin.txt",s2="newlin.txt";if(new CopyMaker().copy(s1, s2))S ystem.out.print("复制成功");elseS ystem.out.print("复制失败");}}运行前的两个文本:lin.txt和newlin.txt(为空)运行后:3.创建一存储若干随机整数的文本文件,文件名、整数的个数及范围均由键盘输入。

Java程序设计教程第6章6.2 类的方法

Java程序设计教程第6章6.2  类的方法

定义带参数的方法
public class ZhazhiJi {
public String zhazhi ( String fruit ) { String juice = fruit + "汁";
本章任务
4/61
会定义和使用类的无参方法 理解变量作用域 会添加JavaDoc注释 会定义带参方法 会使用带参方法 会创建包组织Java工程
本章目标
5/61
类的方法
按此按钮, 狮子开始跑
电动玩具狮子 属性:
颜色:黄色
问题
按此按钮, 狮子开始叫
行为: 跑 叫 抢球
写出狮子对象的“跑”方法、 “叫”方法、“抢 球”方法
public static void main(String[] args){

Student stu = new Student(); name = "神仙姐姐";
stu.sex
sex = 'F'; age = 18;
stu.age
stu.show();
}
}
3/61
实现计算平均分和课程总成绩 实现MyShopping系统菜单切换 实现MyShopping系统入口程序 实现客户信息的添加和显示 修改客户姓名 对客户姓名排序 实现模拟账户存取款功能
语法
对象名.方法名();
问题
小明过生日,爸爸送他一个电动狮子玩具,编程 测试这个狮子能否正常工作
10/61
方法调用
public class AutoLion {
String color = "黄色"; //颜色
/*跑*/ public void run(){

《Java面向对象编程》课件——第6章 类的多态

《Java面向对象编程》课件——第6章   类的多态
}
02 多态转型
多态转型,多态转型有两种,分Fra bibliotek是向上转型和向下转型。
➢ 向上转型 就是指子类对象赋值给父类引用
➢ 向下转型 是指一个已经向上转型的子类对象可以使用强制类型转换的格式,
将父类引用转为子类引用,向下转型的格式如下: 子类类型 变量名 = (子类类型) 父类类型的变量;
➢ 为了防止向下转型的失败,我们可以在向下转型前,进行数据类 型判断,判断父类类型的变量是否是由子类对象向上转型而来, 我们可以通过instanceof关键字来判断某个对象是否属于某种数据 类型,使用格式如下: boolean b = 对象 instanceof 数据类型;
}
class Dog extends Animal{ String color;
}
public class Demo3 { public static void main(String[]
args) { Animal animal=new Dog(); ="小黑";
System.out.println(); }
象 p1.work(); //调用子类方法 Persion p2=new Teacher(); p2.work();
} }
01 多态概述
在多态中,我们知道父类变量调用方法时,会调用子类对象的方法,那么在父类 变量访问成员变量,是访问哪个成员变量呢,接下来通过一个具体的案例来演示,代码 如下:
class Animal{ String name; int age;
《java面向对象课程设计》课程
第6章 类的多态
学 习 内 容
01 多态概述
02
多态转型
01 多态概述

解析JAVA程序设计第六章课后答案

解析JAVA程序设计第六章课后答案

第6章习题解答1.简述Java中设计图形用户界面程序的主要步骤。

对于设计图形用户界面程序而言,一般分为两个步骤:第一步,设计相应的用户界面,并根据需要对相关的组件进行布局;第二步,添加相关的事件处理,如鼠标、菜单、按钮和键盘等事件。

2.试说明容器与组件之间的关系。

组件(component)是图形用户界面中的各种部件(如标签、按钮、文本框等等),所有的组件类都继承自JComponent类。

容器(container)是用来放置其他组件的一种特殊部件,在java中容器用Container类描述。

3.阅读下面程序,说明其运行结果和功能。

//filename:MyFrame.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;public class MyFrame{public static void main(String agrs[]){JFrame f=new JFrame("简单窗体示例");f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JLabel l=new JLabel("习题1");f.getContentPane().add(l,BorderLayout.CENTER);f.pack();f.setVisible(true);}}程序的运行结果如下:4.阅读下面程序,说明其运行结果和功能。

//filename:TestButton.javaimport java.awt.*;import javax.swing.*;public class TestButton extends JFrame{JButton b1,b2;TestButton(String s){super(s);b1=new JButton("按钮1");b2=new JButton("按钮2");setLayout(new FlowLayout());add(b1);add(b2);setSize(300,100);setVisible(true);}public static void main(String args[]){ TestButton test;test=new TestButton("测试按钮"); }}程序的运行结果如下:5.阅读下面程序,说明其运行结果和功能。

Java编程基础及应用(第2版)教学课件第6章 类的继承与多态性

Java编程基础及应用(第2版)教学课件第6章 类的继承与多态性

6.1.1 引言
下图为一个继承的实例:
6.1.2 继承的概念
• 继承是从巳有的类中派生出新的类,新的类拥有已有 类的数据属性 和行为,并能扩展新的数据属性和行为。换句话说,继承就是在已经 存在的类的基础上再扩展新的类。
• 已经存在的类称为父类、超类或者基类。新产生的类称为子类或派生 类。子类拥有父类的所有特性。当然,也可以在子类中添加新的方法 和成员变量,这些新添加 的方法和成员支量仅仅属于子类。
• 继承分为单继承和多继承。单继承是指一个子类最多只能有一个父类 。多继承是指一个子类可以有两人以上的父类。由于多继承会带来二 义性,在实际应用中应尽 量使用单继承。
6.1.3 继承的实现
■关键字(extends)
继承通过关键字extends实现。如果使用默认的extends子句,则该
类为ng.Object的子类。子类可以继承父类中访问权限为public、
■继承的特点: (1) 提供多继承机制。从理论上说,一个类可以是多个一般类的子类,它
可以从密个一般类中继承属性与方法,这便是多继承。Java出于安全性和 可靠性的考虑,仅支持单继承,而使用接口机制来实现多继承。
(2) 继承通过增强一致性来减少模块间的接口和界面, 大大增加了程序 的易维护性。
6.1.5 继承的特点与优点
Child c = new Child(); System.out.println(c.add(4,"3")); }
6.2.2 方法覆盖和重载
■方法重载:是指在同一个类中,定义多个名称相同,但参数个数或 类型不同的方法,程序中的对象根据参数的个数或者类型,调 用相对应的方法。
■例:StudentOverload类定义构造函数和get()方法,并重载了这两个方 法,sol、so2对象根据这两个方法的参数个数或类型调用相应的 方法。

第六章 多态性

第六章 多态性

多态性的分类: 多态性的分类: 通用多态:参数多态、包含多态 通用多态:参数多态、 专用多态: 专用多态:重载多态和强制多态 参数多态与类属函数和类属类相关联,本书第8章将要介 参数多态与类属函数和类属类相关联,本书第8 绍的函数模板和类模板就是这种多态。 绍的函数模板和类模板就是这种多态。由类模板实例化的各 个类都具有相同的操作,而操作对象的类型却各不相同。 个类都具有相同的操作,而操作对象的类型却各不相同。同 样地,由函数模板实例化的各个函数都具有相同的操作, 样地,由函数模板实例化的各个函数都具有相同的操作,而 这些函数的参数类型是各不相同的。 这些函数的参数类型是各不相同的。 包含多态是研究类族中定义于不同类中的同名成员函数的 多态行为,主要是通过虚函数来实现的。 多态行为,主要是通过虚函数来实现的。
虚析构函数
virtual ~类名(); 类名(); 如果一个类的析构函数是虚函数,那么, 如果一个类的析构函数是虚函数,那么,由它派生而来 的所有派生类的析构函数也是虚析构函数, 的所有派生类的析构函数也是虚析构函数,不管它是否使用 丁关键字virtual 进行说明。 丁关键字virtual 进行说明。 析构函数设置为虚函数之后,在使用指针引用时可以动 析构函数设置为虚函数之后, 态联编,实现运行时的多态, 态联编,实现运行时的多态,保证使用基类类型的指针能够 调用适当的析构函数针对不同的对象进行清理工作。 调用适当的析构函数针对不同的对象进行清理工作。 例6.4 6.5 6.6
虚函数与重载函数的关系
普通的函数重载时, 普通的函数重载时,其函数的参数或参数类型必须有所 不同,函数的返回类型也可以不同。但是, 不同,函数的返回类型也可以不同。但是,当重载一个虚函 数时,也就是说在派生类中重新定义虚函数时,要求函数名、 数时,也就是说在派生类中重新定义虚函数时,要求函数名、 返回类型、参数个数、 返回类型、参数个数、参数的类型和顺序与基类中的虚函数 原型完全相同。如果仅仅返回类型不同,其余均相同, 原型完全相同。如果仅仅返回类型不同,其余均相同,系统 会给出错误信息; 若仅仅函数名相同,而参数的个数、 会给出错误信息;·若仅仅函数名相同,而参数的个数、类 型或顺序不同,系统将它作为普通的函数重载, 型或顺序不同,系统将它作为普通的函数重载,这时将丢失 虚函数的特性。 虚函数的特性。 例6.7

java 第六章 继承与多态

java 第六章 继承与多态

6.2.4方法参数和异类集合
1 方法的参数 为了处理的一般性,实例和变量并不 总是属于同一类
public TaxRate findTaxRate(Employee e) { // 进行计算并返回e的税率 findTaxRate() 的 自 变 量 必 须 是 Employee 类 型 } 的,而调用时的参数是 // 而在应用程序类中可以写下面的语句 Manager 类 型 的 , 但 因 为 Manager 是 一 个 Manager m = new Manager(); Employee,所以可以使 用更“一般”的变量类型 TaxRate t = findTaxRate(m); 来调用这个方法。
Object Employee
Manager
Contractor
instanceof运算符 类的变量既可以指向 本类实例,又可以指 向其子类的实例。可 以通过instanceof运算 符判明一个引用到底 指向哪个实例
public void method(Employee e) { if (e instanceof Manager) { // 经理级人士 } else if (e instanceof Contractor){ // 掌握公司机密的高层人 士 } else { // 普通雇员 } }
extends关键字
public class A extends B
public class Employee { public class Manager extends Employee{ private String name; private String department; private Employee [] subordinates; private Date hireDate; ... private Date dateOfBirth; } private String jobTitle; private int grade; } Words.java

chapter06 多态性

chapter06 多态性


例6-2 超类对象的引用赋给一个子类类型的变量
//HierarchyRelationshipTest2.java public class HierarchyRelationshipTest2 { public static void main( String[] args ) { Point3 point = new Point3( 30, 50 ); Circle3 circle; circle = point; //超类对象的引用赋给一个子类 类型的变量,是不允许的。 } }

Point3 point = new Point3( 30, 50 );
Circle circle=(Circle) point; circle. getX() ; circle. getRadius() ; //run-time error
例6-1中的例子举例说明了继承层次结构中对象 间的关系。
6.6.2 内部类的声明

内部类的声明格式如下: [修饰符] class outerClass{ … [修饰符] class innerClass{ … } … }
例子6-5 内部类使用的例子 TestWindow.java
程序的显示界面使用javax.swing包中的JFrame类 生成。定义扩展JFrame的子类TestWindow. 程序运行输出结果如下:

final类:类的声明中包含final。 final类为不能为超类。

final类中所有方法都隐式地为final方法。
String类是final类的一个例子。不能扩展该类,使用字符串 的程序可以调用String对象在Java API中指定的函数。将类声 明为final还可以防止程序员创建绕过安全限制的子类。

第6章 Java的继承与多态

第6章 Java的继承与多态

其他方法
hashCode():计算一个对象的哈希码, hashCode():计算一个对象的哈希码,并将其 返回。 返回。 notify():唤醒一个与当前对象关联的线程。 notify():唤醒一个与当前对象关联的线程。 notifyAll(): notifyAll():唤醒与当前对象关联的所有线程 wait(): wait():使线程等待一个指定的时间间隔或等待 另一个线程调用当前对象的notify()或 另一个线程调用当前对象的notify()或 notifyAll()方法 notifyAll()方法。 方法。
class A {} public class Ex6_7{ public static void main(String args[]) { A a=new A(1); Class ca=a.getClass(); System.out.println(“ System.out.println(“class of obj=”+ca); obj=” }
面向对象程序设计三大特性
继承,以既有类为基础,派生出新类,达 继承,以既有类为基础,派生出新类, 到代码重用的目的。 到代码重用的目的。 封装,对类对象的数据成员进行访问控制, 封装,对类对象的数据成员进行访问控制, 起到数据保护作用。 起到数据保护作用。 多态,程序能够动态的匹配同名方法, 多态,程序能够动态的匹配同名方法,使 程序更加灵活。 程序更加灵活。
习题1——4 习题1——4讲解 习题5 习题5
class A { String str1="Hello!\t"; str1="Hello!\ String str2="How are you"; public String toString() { return str1+str2; } } class B extends A { String str1="\b\b,Bill."; str1="\ public String toString() { return super.str1+str1; } } public class Ex6_5 { public static void main(String args[]) { A a=new A(); System.out.println(a.toString()); B b=new B(); System.out.println(b.toString()); } }

JAVA程序设计教程(第七版)第6章

JAVA程序设计教程(第七版)第6章

Copyright ©2012 Pearson Education, Inc.Chapter 6More Conditionals and LoopsJava Software SolutionsFoundations of Program DesignSeventh EditionJohn Lewis William LoftusMore Conditionals and Loops•Now we can fill in some additional details regarding Java conditional and repetition statements •Chapter 6 focuses on:–the switch statement –the conditional operator –the do loop –the for loop–drawing with the aid of conditionals and loops –dialog boxesCopyright ©2012 Pearson Education, Inc.OutlineThe switch Statement The Conditional Operator The do Statement The for StatementDrawing with Loops and Conditionals Dialog BoxesCopyright ©2012 Pearson Education, Inc.The switch Statement•The switch statement provides another way to decide which statement to execute next•The switch statement evaluates an expression, then attempts to match the result to one of several possible cases•Each case contains a value and a list of statements •The flow of control transfers to statementassociated with the first case value that matchesCopyright ©2012 Pearson Education, Inc.The switch Statement•The general syntax of a switch statement is:switch ( expression ){case value1:statement-list1case value2:statement-list2case value3:statement-list3case ...}switch and case are reserved wordsIf expression matches value2,control jumps to hereCopyright ©2012 Pearson Education, Inc.The switch Statement•Often a break statement is used as the last statement in each case's statement list• A break statement causes control to transfer to the end of the switch statement•If a break statement is not used, the flow of control will continue into the next case•Sometimes this may be appropriate, but often we want to execute only the statements associated with one caseCopyright ©2012 Pearson Education, Inc.The switch Statementswitch (option){case 'A':aCount++;break;case 'B':bCount++;break;case 'C':cCount++;break;}•An example of a switch statement:Copyright ©2012 Pearson Education, Inc.The switch Statement• A switch statement can have an optional default case•The default case has no associated value and simply uses the reserved word default•If the default case is present, control will transfer to it if no other case value matches•If there is no default case, and no other valuematches, control falls through to the statement after the switchCopyright ©2012 Pearson Education, Inc.The switch Statement•The type of a switch expression must be integers, characters, or enumerated types•As of Java 7, a switch can also be used with strings •You cannot use a switch with floating point values •The implicit boolean condition in a switch statement is equality•You cannot perform relational checks with a switch statement•See GradeReport.javaCopyright ©2012 Pearson Education, Inc.Copyright ©2012 Pearson Education, Inc.//********************************************************************// GradeReport.java Author: Lewis/Loftus //// Demonstrates the use of a switch statement.//********************************************************************import java.util.Scanner;public class GradeReport {//-----------------------------------------------------------------// Reads a grade from the user and prints comments accordingly.//-----------------------------------------------------------------public static void main (String[] args){int grade, category;Scanner scan = new Scanner (System.in);System.out.print ("Enter a numeric grade (0 to 100): ");grade = scan.nextInt();category = grade / 10;System.out.print ("That grade is ");continueCopyright ©2012 Pearson Education, Inc.continueswitch (category){case 10:System.out.println ("a perfect score. Well done.");break ;case 9:System.out.println ("well above average. Excellent.");break ;case 8:System.out.println ("above average. Nice job.");break ;case 7:System.out.println ("average.");break ;case 6:System.out.println ("below average. You should see the");System.out.println ("instructor to clarify the material "+ "presented in class.");break ;default :System.out.println ("not passing.");}}}Copyright ©2012 Pearson Education, Inc.continueswitch (category){case 10:System.out.println ("a perfect score. Well done.");break ;case 9:System.out.println ("well above average. Excellent.");break ;case 8:System.out.println ("above average. Nice job.");break ;case 7:System.out.println ("average.");break ;case 6:System.out.println ("below average. You should see the");System.out.println ("instructor to clarify the material "+ "presented in class.");break ;default :System.out.println ("not passing.");}}}Sample RunEnter a numeric grade (0 to 100): 91That grade is well above average. Excellent.OutlineThe switch Statement The Conditional Operator The do Statement The for StatementDrawing with Loops and Conditionals Dialog BoxesCopyright ©2012 Pearson Education, Inc.The Conditional Operator•The conditional operator evaluates to one of two expressions based on a boolean condition •Its syntax is:condition ? expression1: expression2•If the condition is true, expression1isevaluated; if it is false, expression2is evaluated •The value of the entire conditional operator is the value of the selected expressionCopyright ©2012 Pearson Education, Inc.The Conditional Operator•The conditional operator is similar to an if-else statement, except that it is an expression that returns a value •For example:larger = ((num1 > num2) ? num1 : num2);•If num1is greater than num2, then num1is assigned to larger ; otherwise, num2is assigned to larger •The conditional operator is ternary because it requires three operandsCopyright ©2012 Pearson Education, Inc.The Conditional Operator•Another example:•If count equals 1, the "Dime" is printed•If count is anything other than 1, then "Dimes" is printedSystem.out.println ("Your change is " + count +((count == 1) ? "Dime" : "Dimes"));Copyright ©2012 Pearson Education, Inc.Quick CheckCopyright ©2012 Pearson Education, Inc.Express the following logic in a succinct manner using the conditional operator.if (val <= 10)System.out.println("It is not greater than 10.");elseSystem.out.println("It is greater than 10.");Quick CheckCopyright ©2012 Pearson Education, Inc.Express the following logic in a succinct manner using the conditional operator.if (val <= 10)System.out.println("It is not greater than 10.");elseSystem.out.println("It is greater than 10.");System.out.println("It is" +((val <= 10) ? " not" : "") +" greater than 10.");OutlineThe switch Statement The Conditional Operator The do Statement The for StatementDrawing with Loops and Conditionals Dialog BoxesCopyright ©2012 Pearson Education, Inc.The do Statement• A do statement has the following syntax:do {statement-list ;}while (condition );•The statement-list is executed once initially, and then the condition is evaluated •The statement is executed repeatedly until the condition becomes falseCopyright ©2012 Pearson Education, Inc.Logic of a do Loop truecondition evaluatedstatementfalseCopyright ©2012 Pearson Education, Inc.The do Statement•An example of a do loop:•The body of a do loop executes at least once •See ReverseNumber.javaint count = 0;do {count++;System.out.println (count);} while (count < 5);Copyright ©2012 Pearson Education, Inc.Copyright ©2012 Pearson Education, Inc.//********************************************************************// ReverseNumber.java Author: Lewis/Loftus //// Demonstrates the use of a do loop.//********************************************************************import java.util.Scanner;public class ReverseNumber {//-----------------------------------------------------------------// Reverses the digits of an integer mathematically.//-----------------------------------------------------------------public static void main (String[] args){int number, lastDigit, reverse = 0;Scanner scan = new Scanner (System.in);continueCopyright ©2012 Pearson Education, Inc.continueSystem.out.print ("Enter a positive integer: ");number = scan.nextInt();do {lastDigit = number % 10;reverse = (reverse * 10) + lastDigit;number = number / 10;}while (number > 0);System.out.println ("That number reversed is " + reverse);}}Copyright ©2012 Pearson Education, Inc.continueSystem.out.print ("Enter a positive integer: ");number = scan.nextInt();do{lastDigit = number % 10;reverse = (reverse * 10) + lastDigit;number = number / 10;}while (number > 0);System.out.println ("That number reversed is " + reverse);}}Sample Run Enter a positive integer: 2896That number reversed is 6982Comparing while and dostatementtrue falsecondition evaluatedThe while Loop truecondition evaluatedstatementfalseThe do LoopCopyright ©2012 Pearson Education, Inc.OutlineThe switch Statement The Conditional Operator The do Statement The for StatementDrawing with Loops and Conditionals Dialog BoxesCopyright ©2012 Pearson Education, Inc.The for Statement• A for statement has the following syntax:for ( initialization ; condition ; increment )statement ;The initialization is executed once before the loop beginsThe statement is executed until thecondition becomes falseThe increment portion is executedat the end of each iterationCopyright ©2012 Pearson Education, Inc.Logic of a for loopstatement true condition evaluatedfalseincrementinitializationCopyright ©2012 Pearson Education, Inc.The for Statement• A for loop is functionally equivalent to the following while loop structure:initialization ;while ( condition ){statement ;increment ;}Copyright ©2012 Pearson Education, Inc.The for Statement•An example of a for loop:for (int count=1; count <= 5; count++)System.out.println (count);•The initialization section can be used to declare a variable•Like a while loop, the condition of a for loop is tested prior to executing the loop body•Therefore, the body of a for loop will execute zero or more timesCopyright ©2012 Pearson Education, Inc.The for Statement•The increment section can perform any calculation:for (int num=100; num > 0; num -= 5)System.out.println (num);• A for loop is well suited for executing statements a specific number of times that can be calculated or determined in advance •See Multiples.java •See Stars.javaCopyright ©2012 Pearson Education, Inc.Copyright ©2012 Pearson Education, Inc.//********************************************************************// Multiples.java Author: Lewis/Loftus //// Demonstrates the use of a for loop.//********************************************************************import java.util.Scanner;public class Multiples {//-----------------------------------------------------------------// Prints multiples of a user-specified number up to a user-// specified limit.//-----------------------------------------------------------------public static void main (String[] args){final int PER_LINE = 5;int value, limit, mult, count = 0;Scanner scan = new Scanner (System.in);System.out.print ("Enter a positive value: ");value = scan.nextInt();continueCopyright ©2012 Pearson Education, Inc.continueSystem.out.print ("Enter an upper limit: ");limit = scan.nextInt();System.out.println ();System.out.println ("The multiples of " + value + " between " +value + " and " + limit + " (inclusive) are:");for (mult = value; mult <= limit; mult += value){System.out.print (mult + "\t");// Print a specific number of values per line of output count++;if (count % PER_LINE == 0)System.out.println();}}}Copyright ©2012 Pearson Education, Inc.continueSystem.out.print ("Enter an upper limit: ");limit = scan.nextInt();System.out.println ();System.out.println ("The multiples of " + value + " between " +value + " and " + limit + " (inclusive) are:");for (mult = value; mult <= limit; mult += value){System.out.print (mult + "\t");// Print a specific number of values per line of output count++;if (count % PER_LINE == 0)System.out.println();}}}Sample RunEnter a positive value: 7Enter an upper limit: 400The multiples of 7 between 7 and 400 (inclusive) are:714212835424956637077849198105112119126133140147154161168175182189196203210217224231238245252259266273280287294301308315322329336343350357364371378385392399Copyright ©2012 Pearson Education, Inc.//********************************************************************// Stars.java Author: Lewis/Loftus //// Demonstrates the use of nested for loops.//********************************************************************public class Stars {//-----------------------------------------------------------------// Prints a triangle shape using asterisk (star) characters.//-----------------------------------------------------------------public static void main (String[] args){final int MAX_ROWS = 10;for (int row = 1; row <= MAX_ROWS; row++){for (int star = 1; star <= row; star++)System.out.print ("*");System.out.println();}}}Copyright ©2012 Pearson Education, Inc.//********************************************************************// Stars.java Author: Lewis/Loftus //// Demonstrates the use of nested for loops.//********************************************************************public class Stars{//-----------------------------------------------------------------// Prints a triangle shape using asterisk (star) characters.//-----------------------------------------------------------------public static void main (String[] args){final int MAX_ROWS = 10;for (int row = 1; row <= MAX_ROWS; row++){for (int star = 1; star <= row; star++)System.out.print ("*");System.out.println();}}}Output*******************************************************Quick CheckCopyright ©2012 Pearson Education, Inc.Write a code fragment that rolls a die 100 times and counts the number of times a 3 comes up.Quick CheckCopyright ©2012 Pearson Education, Inc.Write a code fragment that rolls a die 100 times and counts the number of times a 3 comes up.Die die = new Die();int count = 0;for (int num=1; num <= 100; num++)if (die.roll() == 3)count++;Sytem.out.println (count);The for Statement•Each expression in the header of a for loop is optional•If the initialization is left out, no initialization is performed•If the condition is left out, it is always considered to be true, and therefore creates an infinite loop •If the increment is left out, no increment operation is performedCopyright ©2012 Pearson Education, Inc.For-each Loops• A variant of the for loop simplifies the repetitive processing of items in an iterator •For example, suppose bookList is an ArrayList<Book>object•The following loop will print each book:for (Book myBook : bookList)System.out.println (myBook);•This version of a for loop is often called a for-each loopCopyright ©2012 Pearson Education, Inc.For-each Loops• A for-each loop can be used on any object that implements the Iterable interface•It eliminates the need to retrieve an iterator and call the hasNext and next methods explicitly•It also will be helpful when processing arrays, which are discussed in Chapter 8Copyright ©2012 Pearson Education, Inc.Quick CheckCopyright ©2012 Pearson Education, Inc.Write a for-each loop that prints all of the Student objects in an ArrayList<Student>object called roster .Quick CheckCopyright ©2012 Pearson Education, Inc.Write a for-each loop that prints all of the Student objects in an ArrayList<Student>object called roster .for (Student student : roster)System.out.println (student);OutlineThe switch Statement The Conditional Operator The do Statement The for StatementDrawing with Loops and Conditionals Dialog BoxesCopyright ©2012 Pearson Education, Inc.Drawing Techniques•Conditionals and loops enhance our ability to generate interesting graphics •See Bullseye.java•See BullseyePanel.java •See Boxes.java•See BoxesPanel.javaCopyright ©2012 Pearson Education, Inc.Copyright ©2012 Pearson Education, Inc.//********************************************************************// Bullseye.java Author: Lewis/Loftus //// Demonstrates the use of loops to draw.//********************************************************************import javax.swing.JFrame;public class Bullseye {//-----------------------------------------------------------------// Creates the main frame of the program.//-----------------------------------------------------------------public static void main (String[] args){JFrame frame = new JFrame ("Bullseye");frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);BullseyePanel panel = new BullseyePanel();frame.getContentPane().add(panel);frame.pack();frame.setVisible(true );}}Copyright ©2012 Pearson Education, Inc.//********************************************************************// Bullseye.java Author: Lewis/Loftus //// Demonstrates the use of loops to draw.//********************************************************************import javax.swing.JFrame;public class Bullseye {//-----------------------------------------------------------------// Creates the main frame of the program.//-----------------------------------------------------------------public static void main (String[] args){JFrame frame = new JFrame ("Bullseye");frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);BullseyePanel panel = new BullseyePanel();frame.getContentPane().add(panel);frame.pack();frame.setVisible(true );}}Copyright ©2012 Pearson Education, Inc.//********************************************************************// BullseyePanel.java Author: Lewis/Loftus //// Demonstrates the use of conditionals and loops to guide drawing.//********************************************************************import javax.swing.JPanel;import java.awt.*;public class BullseyePanel extends JPanel {private final int MAX_WIDTH = 300, NUM_RINGS = 5, RING_WIDTH = 25;//-----------------------------------------------------------------// Sets up the bullseye panel.//-----------------------------------------------------------------public BullseyePanel (){setBackground (Color.cyan);setPreferredSize (new Dimension(300,300));}continueCopyright ©2012 Pearson Education, Inc.continue//-----------------------------------------------------------------// Paints a bullseye target.//-----------------------------------------------------------------public void paintComponent (Graphics page){super .paintComponent (page);int x = 0, y = 0, diameter = MAX_WIDTH;page.setColor (Color.white);for (int count = 0; count < NUM_RINGS; count++){if (page.getColor() == Color.black) // alternate colorspage.setColor (Color.white);elsepage.setColor (Color.black);page.fillOval (x, y, diameter, diameter);diameter -= (2 * RING_WIDTH);x += RING_WIDTH;y += RING_WIDTH;}// Draw the red bullseye in the center page.setColor (Color.red);page.fillOval (x, y, diameter, diameter);}}Copyright ©2012 Pearson Education, Inc.//********************************************************************// Boxes.java Author: Lewis/Loftus //// Demonstrates the use of loops to draw.//********************************************************************import javax.swing.JFrame;public class Boxes {//-----------------------------------------------------------------// Creates the main frame of the program.//-----------------------------------------------------------------public static void main (String[] args){JFrame frame = new JFrame ("Boxes");frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);BoxesPanel panel = new BoxesPanel();frame.getContentPane().add(panel);frame.pack();frame.setVisible(true );}}Copyright ©2012 Pearson Education, Inc.//********************************************************************// Boxes.java Author: Lewis/Loftus //// Demonstrates the use of loops to draw.//********************************************************************import javax.swing.JFrame;public class Boxes {//-----------------------------------------------------------------// Creates the main frame of the program.//-----------------------------------------------------------------public static void main (String[] args){JFrame frame = new JFrame ("Boxes");frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);BoxesPanel panel = new BoxesPanel();frame.getContentPane().add(panel);frame.pack();frame.setVisible(true );}}Copyright ©2012 Pearson Education, Inc.//********************************************************************// BoxesPanel.java Author: Lewis/Loftus //// Demonstrates the use of conditionals and loops to guide drawing.//********************************************************************import javax.swing.JPanel;import java.awt.*;import java.util.Random;public class BoxesPanel extends JPanel {private final int NUM_BOXES = 50, THICKNESS = 5, MAX_SIDE = 50;private final int MAX_X = 350, MAX_Y = 250;private Random generator;//-----------------------------------------------------------------// Sets up the drawing panel.//-----------------------------------------------------------------public BoxesPanel (){generator = new Random();setBackground (Color.black);setPreferredSize (new Dimension(400, 300));}continueCopyright ©2012 Pearson Education, Inc.continue//-----------------------------------------------------------------// Paints boxes of random width and height in a random location.// Narrow or short boxes are highlighted with a fill color.//-----------------------------------------------------------------public void paintComponent(Graphics page){super .paintComponent (page);int x, y, width, height;for (int count = 0; count < NUM_BOXES; count++){x = generator.nextInt(MAX_X) + 1;y = generator.nextInt(MAX_Y) + 1;width = generator.nextInt(MAX_SIDE) + 1;height = generator.nextInt(MAX_SIDE) + 1;continueCopyright ©2012 Pearson Education, Inc.continueif (width <= THICKNESS) // check for narrow box {page.setColor (Color.yellow);page.fillRect (x, y, width, height);}elseif (height <= THICKNESS) // check for short box {page.setColor (Color.green);page.fillRect (x, y, width, height);}else {page.setColor (Color.white);page.drawRect (x, y, width, height);}}}}OutlineThe switch Statement The Conditional Operator The do Statement The for StatementDrawing with Loops and Conditionals Dialog BoxesCopyright ©2012 Pearson Education, Inc.Dialog Boxes• A dialog box is a window that appears on top of any currently active window •It may be used to:–convey information –confirm an action–allow the user to enter data –pick a color –choose a file• A dialog box usually has a specific, solitary purpose, and the user interaction with it is briefCopyright ©2012 Pearson Education, Inc.Dialog Boxes•The JOptionPane class provides methods that simplify the creation of some types of dialog boxes •See EvenOdd.java•Specialized dialog boxes for choosing colors and files are covered in Chapter 9Copyright ©2012 Pearson Education, Inc.Copyright ©2012 Pearson Education, Inc./********************************************************************// EvenOdd.java Author: Lewis/Loftus //// Demonstrates the use of the JOptionPane class.//********************************************************************import javax.swing.JOptionPane;public class EvenOdd {//-----------------------------------------------------------------// Determines if the value input by the user is even or odd.// Uses multiple dialog boxes for user interaction.//-----------------------------------------------------------------public static void main (String[] args){String numStr, result;int num, again;continueCopyright ©2012 Pearson Education, Inc.continuedo {numStr = JOptionPane.showInputDialog ("Enter an integer: ");num = Integer.parseInt(numStr);result = "That number is " + ((num%2 == 0) ? "even" : "odd");JOptionPane.showMessageDialog (null , result);again = JOptionPane.showConfirmDialog (null , "Do Another?");}while (again == JOptionPane.YES_OPTION);}}continuedo{numStr = JOptionPane.showInputDialog ("Enter an integer: ");num = Integer.parseInt(numStr);result = "That number is " + ((num%2 == 0) ? "even" : "odd");JOptionPane.showMessageDialog (null, result);again = JOptionPane.showConfirmDialog (null, "Do Another?");}while (again == JOptionPane.YES_OPTION);}}Summary•Chapter 6 focused on:–the switch statement–the conditional operator–the do loop–the for loop–drawing with the aid of conditionals and loops–dialog boxesCopyright ©2012 Pearson Education, Inc.Copyright ©2012 Pearson Education, Inc.。

Java第2版第6章.ppt

Java第2版第6章.ppt
默认的友元访问控制符,在同一个包中的其他类可以访问此方法,而其他包 中的类不能访问该方法。 最终修饰符。指定该方法不能被重载。
静态修饰符。指定不需要实例化一个对象就可以激活的方法。
同步修饰符。在多线程程序中,该修饰符用于在运行前,对它所属的方法加 锁,以防止其他线程访问,运行结束后解锁。
语句序列; return [表达式]; } …… }
2020/11/2
11
其中class前面方括号“[]”中的类修饰符是可 选项,用来说明类的特殊性质,类修饰符分为访问控 制符、抽象类说明符、友元类说明符和最终类说明符 四种。各修饰符的含义如表6.1所示。
2020/11/2
12
表6.1类修饰符的含义
第6章 类与对象
陈国君
2020/11/2
1
通过本章的学习,主要掌握以下知识点:
类的基本概念 对象的创建与使用 对象的使用 成员的调用
本章的重点:
创建类
本章的难点:
类修饰符 成员数量与成员方法修饰符
2020/11/2
2
在前面的章节中,对Java的简单数据类型、 数组、运算符和表达式及流程控制的方法作了详细 的介绍。从本章开始将介绍面向对象的程序设计方 法。面向对象的编程思想是力图使在计算机语言中 对事物的描述与现实世界中该事物的本来面目尽可 能的一致。所以在面向对象的程序设计中,类 (Class)和对象(Object)是面向对象程序设计方法 中最核心的概念。
2020/11/2
16
表6.3成员方法修饰符的含义
修饰符 public private protected friendly final static synchronized
含义
公共访问控制符。指定该方法为公共的,它可以被任何对象的方法访问。

Java学习文档第6章

Java学习文档第6章

第六章对象关系研究继承关系(父类和子类)利用继承,可以先创建一个共有属性的通用类(父类),然后根据该通用类来创建具有特殊属性的新类(子类)。

一个子类是一个父类的特定版本,它继承了父类定义的所有实例变量和方法,同时添加了自己特有的元素。

Java不支持多重继承,也就是说子类只能有一个父类。

(单继承,可以通过接口多实现)基本格式:class 子类名extends 父类名{//body}如果一个类的声明中没有使用关键词extends,那么这个类被系统默认为是继承了Object父类。

Object是ng包中的类。

子类的继承性子类继承父类,在两种情况下我们需要注意:1.子类和父类在同包中的,虽然子类可以包括其父类的所有成员,但它不能访问声明为private的父类成员(私有成员).2.子类和父类不同包中时,那么子类只能继承父类声明为protected、public的成员,父类也必须为public(类没有protected),不能继承私有成员和友好成员。

●被继承的父类也必须是public;●子类构造方法时调用父类构造方法,所以父类构造方法也必须是public/protected;●main函数必须放在主类(public类)才能运行(一个java源程序只能有一个类是public的)。

private default protected public 继承同包不允许允许允许允许继承不同包不允许不允许允许允许子类在实例化时调用自己的构造方法的同时也调用父类的(父类的父类)构造方法。

(通过super(),默认有的)如果没有继承在同类中可以通过实例化对象引用,继承可以直接拿过来用,无需引用!!!父类继承基类,子类继承父类,那么基类的方法和变量可直接为子类使用;如果父类不再继承基类,那么子类(此时还是继承父类)不能直接使用基类的方法和变量。

关联关系(同一层次/同一等级)对象和对象之间除了继承关系之外,还存在着关联关系:包括一对一、一对多、多对一和多对多等关系。

java多态性第6章解析

java多态性第6章解析

第6章 多 态 性
多态性提高了程序设计的抽象性和简洁性,是面向 对象程序设计的一个重要特征。本章介绍与实现多态有 关的Java概念和技术,主要内容有多态的概念、抽象类 与多态、接口与多态。
第6章 多 态 性
6.1 多态性的概念
在第5章介绍类的层次结构时我们说过,一个父类的 引用变量可以指向一个子类的实例对象,而一个父类可能 有多个子类。如我们说“狗是一种哺乳动物”,也可以说 “马是一种哺乳动物”,“猫是一种哺乳动物”,等等, 这里的“哺乳动物”是父类(如用Mammal表示),而狗、马、 猫等是“哺乳动物”的子类。
第6章 多 态 性
如下面的程序中定义了一个类A: class A{
… A(){ … } A(int x){ … } A(int x, int y){ … } … }
类A中定义了三个重载的构造方法,则在实例化一个对 象时,会根据构造方法中实参的类型与个数确定调用类A中 的哪个构造方法。如程序中有下面一条语句:
第6章 多 态 性
12 }
13
14 //苹果类
15 class Apple extends Fruit{
16 void eat(){
17
System.out.println("苹果,要削了皮吃!");
18 }
19 }
20
21 //香蕉类
22 class Banana exte12); 则编译时,系统就可以确定该处要调用类A中有一个参 数的构造方法。
第6章 多 态 性
2. 由引用多态引发的运行时多态性 由于子类继承了父类所有的属性,因此子类对象可以作 为父类对象使用。程序中凡是使用父类对象的地方,都可以 用子类对象来代替,因此,如果说明了一个父类的引用,则 这个引用就是多态性的引用。 对于多态性的一个引用,调用方法的原则是:Java运行 时,系统根据调用该方法的实例来决定调用哪个方法。对子 类的一个实例,如果子类重写了父类的方法,则运行时系统 调用子类的方法;如果子类继承了父类的方法(未重写),则 运行时系统调用父类的方法。 编译时多态性比较简单,本章我们主要讨论运行时多态性。

Java简明教程(第二版) 第6章 继承、多态与接口

Java简明教程(第二版)   第6章  继承、多态与接口

Java简明教程(第二版)
第6章 继承、多态与接口
第5页
6.1.1 继承
继承是面向对象程序设计的一个重要特点,通过继承可以实现代码 的复用,使得程序的复杂性呈线性增长,而不是随规模呈几何级数 增长。
在面向对象技术中,继承是指存在于面向对象程序中的两个类之间 的一种关系。当一个类自动拥有另一个类的所有属性(变量和方法) 时,就称这两个类之间具有继承关系。被继承的类称为父类,继承 了父类的所有属性的类称为子类。
//定义方法:显示学号

System.out.println("学号:"+stu_id);

}
}
Java简明教程(第二版)
第6章 继承、多态与接口
第11页
大学生类UniversityStudent
class UniversityStudent extends Student{ 子类
//定义UniversityStudent是Student的
Java简明教程(第二版)
第6章 继承、多态与接口
第7页
类的层次
Java中的类具有层次结构,实质上Java的系统类就是一个 类层次,如图6-1所示。Object类定义和实现了Java系统 所需要的众多类的共同行为,它是所有类的父类。Object 是一个根类,所有的类都是由这个类继承、扩充而来的, 该类定义在ng包中。
Java简明教程(第二版)
第6章 继承、多态与接口
第9页
创建子类
通过在类的声明中加入extends子句来创建一个类的子类,其语法 格式如下:

class 子类名extends 父类名称{

……

}

Java程序设计基础第6章 类的多态性

Java程序设计基础第6章 类的多态性

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内 部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
6.3 内部类
局部内部类
class People{ public People() { } } class Man{ public Man(){ } public People getWoman(){ class Woman extends People{ int age =0; } return new Woman(); } } // 局部内部类
public interface Math { //计算“加”和“减”的接口 abstract void add(int a,int b);// 计算 a+b abstract void sub(int a,int b);// 计算 a-b } public interface Math2 {// 计算“乘”和“除”的接口 abstract void mul(int a, int b);// 计算 a*b abstract void div(int a, int b);//a/b } class Compute implements Math,Math2 {// 继承两个接口 int answer; void show(){ System.out.print("answer"+answer); } public } public } public } void mul(int a, int b) {// 实现接口中的方法 answer = a * b; void sub(int a, int b) {// 实现接口中的方法 answer = a - b; void add(int a, int b) {// 实现接口中的方法 answer = a + b;

java多态性第6章解析

java多态性第6章解析

第6章 多 态 性
52 fruitType = sc.nextInt();
53 if((fruitType == 1)||(fruitType == 2)||(fruitType == 3))
54
break;
55 else System.out.print("请重新选择要吃的第" + i +“
个水果:");
第6章 多 态 性
多态性提高了程序设计的抽象性和简洁性,是面向 对象程序设计的一个重要特征。本章介绍与实现多态有 关的Java概念和技术,主要内容有多态的概念、抽象类 与多态、接口与多态。
第6章 多 态 性
6.1 多态性的概念
在第5章介绍类的层次结构时我们说过,一个父类的 引用变量可以指向一个子类的实例对象,而一个父类可能 有多个子类。如我们说“狗是一种哺乳动物”,也可以说 “马是一种哺乳动物”,“猫是一种哺乳动物”,等等, 这里的“哺乳动物”是父类(如用Mammal表示),而狗、马、 猫等是“哺乳动物”的子类。
72
f[i-1].eat();
73
}
74 }
75
第6章 多 态 性
76
77 public static void main(String[] args){
78
Fruit[] f = new Fruit[6];
79
chooseFruit(f);
80
startEating(f);
81 }
82 }
第6章 多 态 性
第6章 多 态 性
6.1.1 多态的基本知识 在Java语言中,多态性分为两种类型。 1. 由方法多态引发的编译时多态性 编译时多态性是由方法重载实现的。前面介绍过,

Java的多态性

Java的多态性

Java的多态性
关于Java的多态性
多态性有两种:
1)编译时多态性
对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性.
2)运行时多态性
如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态性.
方法覆盖表现出两种多态性,当对象获得本类实例时,为编译时多态性,否则为运行时多态性,例如:
XXXX x1 = new XXXX(参数列表); //对象获得本类实例,对象与其引用的实例类型一致
XXX xx1 = new XXX(参数列表);
x1.toString(); //编译时多态性,执行XXX类的方法.
xx1.toString(); //编译时多态性,执行XXXX类覆盖的.方法.
XXXX为XXX的父类.
由于子类对象既是父类对象,父类对象与子类对象之间具有赋值相容性,父类对象能够被赋值为子类对象.例如,
XXXX x2 = new XXX(参数列表); //父类对象获得子类实例,子类对象即是父类对象
x2.toString(); //运行时多态
x2声明为父类对象却获得子类XXX的实例,那么x2.toString()究竟执行父类方法还是执行子类覆盖的方法呢?
这分为两种情况:
取决于子类是否覆盖父类方法.如果子类覆盖父类方法,则执行子类方法;
如果没有覆盖,则执行父类方法.
在编译时,仅仅依据对象所属的类,系统无法确定到底应该执行那个
类的方法,只有运行时才能确定,因此这是运行时多态.
父类对象并不能执行所有的子类方法,只能执行那些父类中声明子类覆盖的子类方法.
【关于Java的多态性】。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第6章 多 态 性
6.1.1 多态的基本知识 在Java语言中,多态性分为两种类型。 1. 由方法多态引发的编译时多态性 编译时多态性是由方法重载实现的。前面介绍过, 重载是指在同一个类(也可以是子类与父类)中,同一个方
法名被定义多次,但所采用的形式参数列表不同(可能是
参数的个数、类型或顺序不同)。在重载方法的编译阶段, 编译器会根据所调用方法参数的不同,具体来确定要调 用的方法。
第6章 多 态 性
第 6章
多态性
6.1 多态性的概念 6.2 抽象类 6.3 接口 6.4 JAR文档
第6章 多 态 性
第 6章 多 态 性
学习目标 理解Java语言多态性的概念; 掌握抽象类的概念和定义方法; 理解接口和接口的实现技术。 从字面意思来说,多态(polymorphism)就是指“多种形 态”。那么,在Java中什么量可以有多种形态呢?前面我们 介绍的方法重载中,同一个方法名根据需要在程序中可以定
case 3: f[i-1] = new Coconut(); break; }
第6章 多 态 性
68 69 70 71 static void startEating(Fruit[] f){ System.out.println("------------------------------------"); for(int i = 1; i <= f.length; i++){ System.out.print("第" + i + "个水果 f[i-1].eat(); }
是");
72 73
ห้องสมุดไป่ตู้74
75
}
第6章 多 态 性
76 77 78 79 80 public static void main(String[] args){ Fruit[] f = new Fruit[6]; chooseFruit(f); startEating(f);
81
82 }
}
第6章 多 态 性
中根据所选择水果的不同,分别创建了Apple类、Banana
类或Coconut类的对象。
第6章 多 态 性
在EatFruit类中,最关键的是68~74行定义的吃水果的 方法startEating,正是该方法根据所选择水果的不同,调用 了不同的吃水果的方法,完成了所谓多态性方法的调用。程 序中70~73行是一个for循环语句,其循环体中的“f[i1].eat()”语句,会根据数组元素f[i-1]中存放的引用对象是 Apple类、Banana类或Coconut类的实例,来调用其相应子类 中定义的eat()方法。这就是本节要重点介绍的内容。一个父 类的引用,会根据当前所指向对象的不同,调用相应子类中 被重写的方法,这就是所谓由引用多态引发的运行时多态性。 运行时多态性在程序被编译时,不能确定一个多态引用所要 调用的方法,只有在程序运行时才能根据引用所指向对象的 类来确定被调用的方法。
第6章 多 态 性
在本程序中,定义了一个吃水果的类EatFruit。该类
的代码显得比较复杂些,其中39~65行定义了一个选择
所要吃水果的方法chooseFruit,通过该方法可以将所选 择要吃的水果存放在一个数组中。该数组的每个元素是
一个对象,具体根据所选择水果种类的不同可以是Apple
类、Banana类或Coconut类的实例对象,这个过程是由程 序59~63行的一个switch语句来实现的。在该switch语句
第6章 多 态 性
12 }
13
14 //苹果类 15 class Apple extends Fruit{
16
17 18 19 } 20
void eat(){
System.out.println("苹果,要削了皮吃!"); }
21 //香蕉类 22 class Banana extends Fruit{
第6章 多 态 性
6.1 多态性的概念
在第5章介绍类的层次结构时我们说过,一个父类的 引用变量可以指向一个子类的实例对象,而一个父类可能
有多个子类。如我们说“狗是一种哺乳动物”,也可以说
“马是一种哺乳动物”,“猫是一种哺乳动物”,等等, 这里的“哺乳动物”是父类(如用Mammal表示),而狗、马、 猫等是“哺乳动物”的子类。
56
57 58 59
}
//根据所选择的水果,创建相应的实例 switch(fruitType){
第6章 多 态 性
60
case 1: f[i-1] = new Apple(); break;
61
62 63 64 65 66 67 //开始吃水果 } }
case 2: f[i-1] = new Banana(); break;
第6章 多 态 性
如下面的程序中定义了一个类A: class A{ … A(){ … } A(int x){ … } A(int x, int y){ … } … } 类A中定义了三个重载的构造方法,则在实例化一个对 象时,会根据构造方法中实参的类型与个数确定调用类A中 的哪个构造方法。如程序中有下面一条语句: A a = new A(12); 则编译时,系统就可以确定该处要调用类A中有一个参 数的构造方法。
第6章 多 态 性
当数组中的元素类型为对象时,会令初学者比较困惑。 下面对这个问题进行说明。程序中78行的语句是“Fruit[] f = new Fruit[6]”,该语句执行后的情况如图6-2所示。 该语句中的“Fruit[] f”声明只完成图6-2(a)所示的内容, 即只创建了一个数组型引用变量f。“new Fruit[6]”完成图62(b)所示的内容,即为引用f在内存中创建6个指向Fruit型的 数组元素,每个数组元素是一个Fruit型的对象。程序中60~ 62行的语句为创建每个数组元素对象(即下标变量)所指向的 对象实例,如图6-2(c)所示。 EatFruit类中的方法为了在程序中不实例化对象就可以调用, 所以都声明成了静态方法(static)。
第6章 多 态 性
4. 程序解析 下面是该案例的程序代码: 01 //****************************************** 02 //案例:6-1 03 //程序名:EatFruit.java 04 //功能: 模拟吃水果的程序 05 //****************************************** 06 07 import java.util.Scanner; 08 09 //水果类 10 class Fruit{ 11 void eat(){}
System.out.print("请选择要吃的第" + i +"个水果:"); //如果选择的水果不正确,要重新选择 while(true){
第6章 多 态 性
52 53 54 55 else fruitType = sc.nextInt(); if((fruitType == 1)||(fruitType == 2)||(fruitType == 3)) break; System.out.print("请重新选择要吃的第" + i +“ 个水果:");
animal时: Mammal animal; animal可能在程序运行的不同时刻指向了Mammal子 类的不同对象。例如,在某个时刻可能指向的是一个狗 类(Dog)的实例对象,而在另外一个时刻可能指向的是猫 类(Cat)的实例对象或马类(Horse)的实例对象。像animal 这样在不同时段内可以指向不同类型对象的引用,就是 多态性的引用。 Java的多态性就是指方法的多态和引用的多态。下面介 绍有关多态的基本知识。
义多个不同的方法体,这就是Java语言中多种形态的方法。
因此,简单地说,多态就是指同名但形态(即功能)不同的方 法。
第6章 多 态 性
多态性提高了程序设计的抽象性和简洁性,是面向 对象程序设计的一个重要特征。本章介绍与实现多态有
关的Java概念和技术,主要内容有多态的概念、抽象类
与多态、接口与多态。
第6章 多 态 性
2. 案例效果 案例程序的执行效果如图6-1所示。
第6章 多 态 性
图6-1 案例6-1的执行效果
第6章 多 态 性
3. 技术分析
该问题域中,香蕉(Banana)、苹果(Apple)和椰子
(Coconut)是不同种类的水果(Fruit),它们都是水果里的一
个子类,因此这里的父类是水果类(Fruit),子类是香蕉类 (Banana)、苹果类(Apple)和椰子类(Coconut)。水果都可以 吃,所以水果类中要定义一个“吃”水果(eat)的方法。
第6章 多 态 性
有如下的类定义: public class Mammal{ … } class Dog extends Mammal{ … } class Horse extends Mammal{ … } class Cat extends Mammal{ … }
第6章 多 态 性
当我们说明了如下的一个“哺乳动物类”的引用
第6章 多 态 性
6.1.2 【案例6-1】 吃水果
1. 案例描述 一天,小明的妈妈买了一篮子水果(Fruit),有香蕉 (Banana)、苹果(Apple)和椰子(Coconut)。小明在吃这些 水果时,如果拿到了一个香蕉就要“剥了皮吃”,如
果拿到了一个苹果就要“削了皮吃”,如果拿到了一
个椰子就要“钻一个孔来喝”。现要求设计一个程序, 模拟小明选择水果和吃水果的过程。
该程序中,第10~12行定义了一个水果类Fruit,在其后
面定义的Apple类、Banana类和Coconut类都继承了Fruit类,
相关文档
最新文档