




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章 面向对象程序设计 信息类专业课程西北农林科技大学2主要内容3.1 类和对象的基本概念3.2 类的设计3.3 实例对象的创建和使用3.4 封装性3.5 继承性3.6 多态性3.7 修饰词abstract、static和final3.8 接口3.9 包3.10 内部类33.1 类和对象的基本概念对象是客观世界中的某个具体事物,对象的概念是面向对象技术的核心。面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现,它可以是有形的,也可以是无形的。比如:电视是一个具体存在的,拥有外形、尺寸、颜色等外部特性(或称属性)和开、关、设置等功能的实体。4对象的基本概念从程序设计
2、的角度来看,事务的属性或特性可以用变量来表示,行为或功能则用方法来反映面向对象的程序设计方法就是将客观事物抽象成为“类”,并通过类的“继承”实现软件的可扩充性和可重用性5类(class)类是同种对象的集合与抽象。 在面向对象的程序设计中,定义类的概念来表述同种对象的公共属性和特点。类是一种抽象的数据类型,它是具有一定共性的对象的抽象,而属于类的某一对象则被称为是类的一个实例,是类的一次实例化的结果。6例如:日常接触的电视有很多,如松下电视、长虹电视等都属于电视的范畴,这些实体在面向对象的程序设计中将被映射成不同的对象。不难看出,这些代表不同的电视实体的对象之间存在着很多实质性的共同点。 类是抽
3、象的概念,如“电视”,那么对象就是某一个具体的电视,如“小王的那台2008年出产的创维牌42吋液晶电视”。7用面向对象程序设计解决实际问题的基本思想首先将实际存在的实体抽象成概念世界的抽象数据类型,这个抽象数据类型里面包括了实体中与需要解决的问题相关的数据和属性;然后再用面向对象的工具,如java语言,将这个抽象数据类型用计算机逻辑表达出来,即构造计算机能够理解和处理的类;最后将类实例化就得到了现实世界实体的面向对象的映射对象,在程序中对对象进行操作,就可以模拟现实世界中的实体上的问题并解决之。8对象、实体与类关系图抽象数据类概念世界实体现实世界对象类计算机逻辑的实现映射9案例:学生成绩查询系
4、统 教师登录系统后可输入授课课程的成绩供学生查询,并可统计学生的平均成绩和各等级的学生人数;学生登录系统后可查询自己的各门课程成绩;10系统分析(1):确定对象找出问题描述领域中的主要名词对象可能是: 简单的或复杂的(如学生,课程) 真实的或概念的(如课程成绩)对象有: 属性 操作(或功能行为)11确定学生成绩查询系统中的对象学生成绩查询系统对象可能有学生教师JAVA程序设计课程Lee 80John 75Mark 90Henry 65Flank 82成绩12测试对象与问题域的相关性对象是否在问题陈述的界限之内?系统是否必须有此对象才能完成任务?在用户与系统的交互中是否必须有此对象?独立存在性对
5、象之间可以是相关的,但仍是独立存在的评估一个可能的对象是否有此特征时,应考虑此对象是否需要独立存在,而不是作为另外一个对象的属性而存在要有属性和操作13系统分析(2):确定对象属性和操作属性:是对象的特征,属性知道某些事情。可以是数据或对象对学生对象来说,可能包括学号和选修课程操作:是对象执行的动作,操作根据所知道的来做某些事情。可以是对象做出的或施加给对象的动作,往往会影响对象的属性对教师对象来说,可能是上报成绩和修改成绩14学生成绩查询系统案例研究中的对象可能的属性和操作学生属性有姓名、性别、学号、班级、专业、院系、学校、登录名和密码等操作有登录、查询成绩和聊天等教师属性有姓名、性别、工号
6、、院系、学校、登录名和密码等操作有登录、上报成绩、统计成绩、查询成绩、修改成绩等15学生成绩查询系统案例研究中的对象可能的属性和操作(续)课程属性课程名、课程编号、学时、学分、学期、授课教师和选修学生等操作有设置授课教师、获取授课教师、设置选修学生和获取选修学生等成绩属性有课程、学生和分数等操作有设置课程编号、获取课程编号、设置学生编号、获取学生编号、设置分数和获取分数等16系统分析(3):为对象建模CoursenamecourseIDtermclassHourcreditHourteacherstudentssetTeacher()getTeacher()setStudent()getStu
7、dent()ScorecourseIDstudentIDscoressetScore()getScore()setStudentIDgetStudentIDsetCourseIDgetCourseIDStudentnamesexstuIDclassnamemajorcollegeSchoolloginNamepasswordlogin()searchScore()chat()TeachernamesexteacherIDcollegeSchoolloginNamepasswordlogin()reportScore()statisticsScore()inquireScore()modifyS
8、core()chat()对象属性操作17作业:简单图书管理系统分析3.1简单图书管理系统功能包括读者可以借书和还书以及查询个人借阅信息和查询图书信息,图书管理员可管理书籍基本信息和读者基本信息、更新图书借阅或归还信息以及更新图书状态等。 请分析该系统,给出对象,并为对象建模。183.2 类的设计类的格式 类首声明定义类的名字、访问权限以及与其它类的关系等。类主体定义类的成员,包括变量(数据)和方法(行为)19 类首声明 class extends implements class: 类定义的关键字; extends: 表示类和另外一些类(超类)的继承关系; implements: 表示类实现了
9、某些接口; 修饰符: 表示类访问权限(public、缺省方式等)和一些其它特性(abstract、final等);一个类可以同时有多个修饰符(任意排序),但不能有相同的修饰符。20类的修饰符缺省方式:class没有修饰符,只能被同一个包名中的类访问public:能被所有的类访问abstract:修饰的类被称为抽象类。抽象类就是没有具体对象的概念类。final:不能被继承,即类不能有子类21类主体 /类首,以下为类主体 成员变量即类的数据,反映了类的属性和状态。成员方法即类的行为(对数据的操作)成员方法可以是普通方法、构造方法、main方法22例:声明一个学生类public class Stud
10、ent String name;char sex;int stuID; public Student() public Student(String stuName,char sex,int stuID) name=stuName; this.sex=sex; this.stuID=stuID; public void setName(String stuName)name=stuName;public void setSex(char sex)this.sex=sex;public void setStuID(int stuID)this.stuID=stuID;23staticfinalt
11、ransient static: 表示是一个类成员变量(静态变量); final: 表示是一个常量(最终成员变量); 例:final double PI=3.1415926; transient: 表示一个临时变量 修饰符: 表示变量的访问权限(缺省访问、public、protected和private) 作用域:整个类。 成员变量的声明格式24 () throws 方法体 修饰符:方法的访问权限(缺省的、public、protected和private)static: 类方法(静态方法);abstract: 抽象方法(无方法体的方法);final: 最终方法(不能被子类改变)。throws:
12、 表示抛出异常成员方法的声明格式25构造方法类的构造方法是一种特殊方法,作用是在创建对象时Java系统调用构造方法去初始化新建对象的成员变量; 例:Student s1=new Student(“张三”,男,20080301);如果没有自定义构造方法,则Java调用类的默认构造方法。Java将使用缺省值来初始化成员变量。 例:Student s2=new Student();26构造方法的特性类的构造方名必须和类名相同;构造方法没有返回值(在构造方法名字前连void也不要加);可以有public, protected, private等任何访问的修饰者没有修饰。 但不能有以下非访问性质的修饰:
13、 abstract, final, native, static 或 synchronized。273.3 实例对象的创建和使用创建对象的两种方式:(1)先声明对象,然后实例对象例:Student s; /声明对象 s=new Student(); /实例化对象(2) =new (参数);例: Student s=new Student(); 28实例化(创建对象)实例化就是为对象分配存储空间,并同时对对象进行初始化。用new运算符和类的构造方法Student( )来完成。29例: Shirt.javapublic class Shirt char size; float price; boo
14、lean longSleeved; public static void main (String args) Shirt myShirt= new Shirt(); Shirt anotherShirt=new Shirt(); myShirt.size = M; myShirt.price = 22.99F; myShirt.longSleeved = false; anotherShirt.size = L; anotherShirt.price = 29.99F; anotherShirt.longSleeved = true; anotherShirt=myShirt; anothe
15、rShirt.size= S; 30堆栈内存(在程序空间内)堆内存(附加内存在程序空间外)执行下列代码的内存分配10X99F31244myShirt0X99F03312anotherShirtu00000.0falsesizepricelongSleevedShirtu00000.0falsesizepricelongSleevedShirtShirt myShirt = new Shirt();Shirt anotherShirt = new Shirt();31堆栈内存(在程序空间内)堆内存(附加内存在程序空间外)执行下列代码的内存分配20X99F31244myShirt0X99F0331
16、2anotherShirtM22.99FfalsesizepricelongSleevedShirt myShirt.size = M; myShirt.price = 22.99F; myShirt.longSleeved = false;u00000.0falsesizepricelongSleevedShirt32堆栈内存(在程序空间内)堆内存(附加内存在程序空间外)执行下列代码的内存分配30X99F31244myShirt0X99F03312anotherShirtL29.99FtruesizepricelongSleevedShirt anotherShirt.size = L; a
17、notherShirt.price = 29.99F; anotherShirt.longSleeved = true;M22.99FfalsesizepricelongSleevedShirt33堆栈内存(在程序空间内)堆内存(附加内存在程序空间外)执行下列代码的内存分配40X99F31244myShirt0X99F033120X99F31244anotherShirtL29.99FtruesizepricelongSleevedShirt15. anotherShirt=myShirt;M22.99FfalsesizepricelongSleevedShirt34堆栈内存(在程序空间内)堆
18、内存(附加内存在程序空间外)执行下列代码的内存分配50X99F31244myShirt0X99F033120X99F31244anotherShirtL29.99FtruesizepricelongSleevedShirt16. anotherShirt.size=S;M22.99FfalsesizepricelongSleevedShirtS35练习:仔细阅读下面的程序,输出结果是什么?class ValHold public int i = 10;ObParmpublic class public static void main(String argv) ObParm o = new O
19、bParm(); o.amethod(); public void amethod() int i = 99; ValHold v = new ValHold(); v.i = 30; another(v , i); System.out.print(v.i); public void another(ValHold v, int i) i = 0; v.i = 20; ValHold vh = new ValHold(); v = vh; System.out.print(v.i); System.out.print(i); 输出结果:10020363.4 封装性目的限制在类的外部对类内部成
20、员进行访问,只通过公共接口来访问类的成员数据。屏蔽细节:这是程序设计的基本思想方法,便于程序功能的扩展和程序的维护。封装类大多数变量都是私有的,变量通过他们自己类的方法修改,其它类都只与一个类中很少的几部分接口;若变量或方法为公有,它就是接口的一部分,其它类可以访问它;若为私有,它是实现的一部分,只有类自己的成员可以访问它37访问权限的设置权限同一类同一包不同包的子类所有类public允许允许允许允许protected允许允许允许不允许默认允许允许不允许不允许private允许不允许不允许不允许38类的访问权限的设置类的权限有两种:默认和public。如果在一个源程序文件中,声明了若干个类的话
21、,只能有一个类的权限关键字是public。这个类的名字应该和程序文件同名,main方法也应该在这个类中。39类的成员的访问权限设置用权限关键字设置类的成员的权限,以此决定是否允许其类外部的代码访问这些成员。例: private int name,sex,age,stuID; public void setName(String name);40访问控制方式:public被修饰为public的类是公共类,它可供所在包的其他类使用,也可供其他包中的类使用,在程序中可以用import语句引入其他包中的public类。被public定义的类中成员变量或方法可以供其他类访问,表明对外开放的方式;一般类的
22、定义中,含有少量(或者没有) public 变量,部分 public 方法。41访问控制方式:private设置private访问权限,则该类的成员只能被同一类中的成员访问,而不让其他类进行访问。目的: 隐藏具体的实现细节变量常常是private 采用 public “get” 方法读取数据采用 public “set”方法写数据42访问控制方式:protected同一个包内的所有类的所有方法都能访问该成员如果不在同一个包内的类的方法要访问该成员,则该类必须是该成员所在的类的子类43访问控制方式: 默认 (缺省方式)默认的权限,该类的成员能被同一包中的类访问。44封装性的可以带来的优点基本思想
23、: 提供对外的通讯方式,封装内部的实现机制增加内部实现部分的可替换性减小类之间的耦合关系,方便模块划分容易保证类内部数据间的一致性,从而提高软件的可靠性45何时为public或private?基本思想类常常是public成员变量常常是private. 构造方法一般是public. 方法“get”与“set”是 public. 其它方法需要根据实际的需要而定上面的思想可以用于大部分的程序设计(也许90%)46例子:根据以下的设计要求编写java源代码。类名: Student变量(访问权限均为private): name(String) /姓名 age(int) /年龄方法: 构造方法(没有参数,
24、设置姓名为“无名氏”,年龄为20) setName(有一个名为name的String型参数,将name的值设为这个新值), getName (没有参数,返回姓名) setAge(有一个名为age的int型参数,将age的值设为这个新值), getAge (没有参数,返回年龄) isSameAge(有一个参数s,是另一个Student对象的引用,如果两个Student对象的age相同,则返回true,否则返回false)47public class Studentprivate String name;private int age;public Student()name=无名氏;age=20
25、;public void setName(String name)=name;public String getName()return name;public void setAge(int age)this.age=age;public int getAge()return age;48public boolean isSameAge(Student s)if(s.age-this.age=0) return true;return false;public static void main(String args)Student s1=new Student();Stu
26、dent s2=new Student();s2.age=20;System.out.println(s1.isSameAge(s2);Student类(续)49作业3.2、根据以下的设计要求编写java源代码。类名: Teacher实例数据(均为private): name(String) /姓名 teacherID(int) /工号方法: 构造方法(没有参数,设置姓名为“无名氏”,年龄为20) setName(有一个名为name的String型参数,将name的值设为这个新值), getName (没有参数,返回姓名) setTeacherID (有一个名为tID的int型参数,将teac
27、herID的值设为这个新值), getTeacherID (没有参数,返回工号)50作业3.3、创建一个名为Rectangle的类来表示一个使用宽度和高度来改变量的矩形,矩形的宽度和高度由构造方法来确定。为Rectangle类创建下列方法:getArea返回矩形的面积,要求长和高的范围为1050;getPerimeter返回矩形的周长;drawRect使用星号(*)作为描绘字符画出该矩形的形状(假设宽度和高度为整数); 在另一个类TestRectangle中编写main方法来测试Rectangle类。51作业3.4、请编写2类第一个类RootPrime包含下面两个方法:int getRootN
28、um(double a, double b, double c)返回ax2+bx+c=0的不重复实数根的个数,要求讨论a,b,c的系数情况int isPrime(int x)判断x是否为正素数,是返回1,否则返回0;第二个类TestRootPrime,调用第一个类中的两个方法,计算并输出getRootNum (1,2,3)、 getRootNum(0,2,1)、 isPrime(46)、 isPrime(-23)、 IsPrime(191)的值523.5继承性继承是复用程序代码的有力手段,当多个类(Sub1,Sub2)之间存在相同的属性和方法时,可从这些类抽象出父类SuperClass。被继承
29、的类称为超类(父类)。从超类派生出来(继承超类)的新类称子类。Java只支持单重继承,不支持多重继承53继承的层次结构一个子类成为另一个子类的超类。人学生行政人员教师本科生研究生54继承的基本语法 class extends 子类体 例:public class SubClass extends SuperClass 55Student和Teacher继承People56例:Student和Teacher继承Peoplepublic class People String name;char sex;int age;public String getName()return name;publ
30、ic char getSex()return sex;public int getAge()return age;public void printInfo()System.out.println(“name:”+name+“ sex:”+sex+“ age:”+age);57例:Student和Teacher继承Peoplepublic class Student extends PeopleString studentID;String major;public String getMajor()return major;public String getStudentID()return
31、 studentID;58例:Student和Teacher继承Peoplepublic class Teacher extends PeopleString teacherID;String department;public String getDepartment()return department;public String getTeacherID()return teacherID;59子类继承超类的成员变量继承原则:子类只继承超类中非private的成员变量隐藏原则:子类的成员变量和超类的成员变量同名时,超类的 成员变量被隐藏(不能继承)60子类继承超类的成员方法继承原则:子类
32、只继承超类中非private的成员方法。覆盖原则:子类的成员方法和超类的成员方法同名时,超类的成员方法被子类的成员方法覆盖(不能继承)。61super关键字super表示对某个类的超类的引用。如子类和超类有同名的成员变量或方法,则:super.super. 表示引用超类的成员(如无super则表示子类中的同名成员)62this关键字在类定义中的方法中需要引用正在使用该方法的对象时,可以用“this”表示。用this引用的使用方法如下:用this指代对象本身访问本类的成员: this. this.调用本类的构造方法: this(参数列表)63继承关系中的构造方法构造方法不存在继承关系。如果子类没
33、有构造方法,则它默认调用超类无参数的构造方法;如果子类有构造方法,那么在创建子类的对象时,则将先执行超类的构造方法,然后再执行自己的构造方法。对于超类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必须是子类构造方法中的第一条语句。用super调用超类的构造方法:super(参数列表)64例:通过super关键字访问父类构造方法与成员方法class People private String name ;private char sex;private int age;public People(String name,char sex,int age)t
34、 = name;this.sex=sex;this.age = age;public String getDetails( )return Name:+name+nsex:+sex+nage: +age;65例:通过super关键字实现对父类构造方法与成员方法的访问class Student extends People private String studentID;private String major;public Student(String name,char sex,int age,String stuID,String major)super(name,sex
35、,age);this.studentID=stuID;this.major=major;public String getDetails( )return super.getDetails( )+nStudentID:+ studentID+nMajor:+major;public class TestSuperpublic static void main(String srgs)Student s = new Student(TOM,男,20,20070308017,Computer);System.out.println(s.getDetails();66子类对象的创建与实例化过程1、分
36、配对象所需的全部内存空间,并初始化为“0”值2、按继承关系,自顶向下显式初始化3、按继承关系,从顶向下调用构造方法注意:一般子类构造方法的第1行通过super来调用父类的构造方法,若不使用supper关键字指定,则自动调用父类的无参数构造方法。如果父类中没有无参数的构造方法,则将产生错误。6768练习:阅读下面的程序,经编译后,运行结果是什么class Super public int i=0; public Super() i=1; public class Sub extends Super public Sub() i=2; public static void main(String
37、args) Sub s=new Sub(); System.out.println(s.i); 运行结果:269练习:阅读下面的程序,经编译后,运行结果是什么class Person public Person() System.out.println(hi!); public Person(String s) this(); System.out.println(I am +s); public class Who extends Person public Who() this(I am Tony); public Who(String s) super(s); System.out.pr
38、intln(How do you do?); public static void main(String args) Who w = new Who(Tom); 70继承关系中对成员的访问(最近匹配原则) (1)在子类中访问属性和方法时将优先查找自己定义的属性和方法。如果该成员在本类存在,则使用本类的,否则,按照继承层次的顺序到其祖先类查找。(2)this关键字特指本类的对象引用,使用this访问成员则首先在本类中查找,如果没有,则到父类逐层向上找。(3)super特指访问父类的成员,使用super首先到直接父类查找匹配成员,如果未找到,再逐层向上到祖先类查找71终止继承出于安全性方面的考虑
39、,要避免子类继承超类的某个方法,可以使用“final”关键字来使继承终止。 这样使此方法不会在子类中被覆盖(即子类中不能有和此方法同名的方法)不能被继承的类称为最终类。 如:final class Last; 用final说明的成员方法为最终方法。 如:public final void printsuper( )72测试类的继承关系在java中,类一次只能继承一个超类使用“是一个(is a)短语验证继承” 例如:Person和Student继承是正确的,因为一个Student是一个Person,即Studen is a Person注:类只有用public、final或缺省定义,如果用fin
40、al定义的类则不能被继承。73测试继承相关类public class Shirt char size; String material; float price; int numberOfButtons; / and so onpublic class Skirt char size; String material; float price; int length; / and so on74测试继承错误的例子public class Shirt char size; String material; float price; / and so onpublic class Skirt ex
41、tends Shirt int length; / and so on 验证该继承的有效性:“子类是超类”如果这句话有意义,则该继承正确。 本示例的验证短语是“裙子是衬衣”,显示不符合现实,所以这个继承是无效的。75测试继承public class Clothing char size; String material; float price; / and so onpublic class Shirt extends Clothing int numberOfButtons; / and so onpublic class Skirt extends Clothing int length
42、; / and so on76作业3.5 请为管理学校中教师的工作证和学生的学生证设计一个类体系结构,尽可能保证代码的重用率。假设工作证包括编号、姓名、姓名、出生年月、部门、职务和签发工作日期;学生证包括编号、姓名、姓名、出生年月、学院、专业、入校时间及每学年的注册信息等。 773.6多态性多态性是指同一个名字的若干个方法,有不同的实现(即方法体中的代码不一样)。多态的两种表现形式:(1) 同一类中的方法多态,称为方法重载overloading:同一类中允许多个同名方法,通过参数的数量、类型的差异进行区分。(2) 子类对父类方法的重新定义,称为方法覆盖overriding:方法名、返回值和参数
43、形态完全一样。78方法的重载一个类中,有若干个方法名字相同,但方法的参数不同,称为方法的重载。在调用时, Java执行方法名、参数个数和参数类型完全相同的方法体。 79Java标准输出方法的重载80例:下面程序中第4行调用哪一行的show方法?public class Test public static void main(String argv) Test t = new Test(); t.show(1+3); public void show(int Val1,int Val2) System.out.println(Val1+Val2); public void show(int V
44、al1) System.out.println(Val1); public void show(int Val1,int Val2,int Val3) System.out.println(Val1+Val2+Val3); 81方法重载的原则方法名相同。方法的参数类型、个数、顺序只要有一项不相同。返回类型、修饰符可相同或不相同。 public int area(int r) public float area(int h,float r) public float area(float h,int r)是正确的方法重载,而下面的则不是正确的方法重载: public int area(float
45、 h,float r) public float area(float h,float r)构造方法也能重载82练习:选择题下述哪一组方法,是一个类中方法重载的正确写法? A) int addValue( int a, int b )return a+b; float addValue ( float a, float b) return a+b;B) int addValue (int a, int b )value=a+b; float addValue ( int a, int b) return (float)(a+b);C) int addValue( int a, int b )r
46、eturn a+1; int addValue ( int a, int b) return a+b;D) int addValue( int a, int b ) return a+b; int addValue ( int x, int y ) return x+y;83激活重载的构造方法在一个构造方法中可以利用另一个构造方法。class Peopleprivate String name;private int age;public People(String n, int age)name = n ;this.age = age;public People( String n) thi
47、s(n,0); public People( ) this(“Unknown”); 84一般地,重载的方法应当具有相似的行为(功能)public class ShapeArea public double area(float r) return Math.PI*r*r; public double area(float a,float b) return a*b; public double area(float a,float b,float c) float d; d=(a+b+c)/2; return Math.sqrt(d*(d-a)*(d-b)*(d-c); public stat
48、ic void main(String args) ShapeArea s=new ShapeArea(); System.out.println(The area of circle : +s.area(3); System.out.println(The area of rectangle : +s.area(7,4); System.out.println(The area of triangle : +s.area(3,4,5); 例:在类ShapeArea中声明三个同名方法area,求圆、矩形和三角形的面积85方法的覆盖(重写)在子类和超类中有同名的方法(参数也相同),子类中的方法覆
49、盖超类的方法。如果超类和子类有同名且参数相同的方法,那么超类的对象调用超类的方法,子类的对象调用子类的方法。通过覆盖可以使同名的方法在不同层次的类中有不同的实现86方法覆盖的原则(1)1、子类方法的名称、参数签名和返回类型必须与其父类的方法的名称、参数签名和返回类型一致public class Basepublic void method().public class Sub extends Base public void method(). public int method(int a) return 0; 87方法覆盖的原则(2)2、子类方法不能缩小父类方法的访问权限public cl
50、ass Basepublic void method().public class Sub extends Base protected void method()./编译错误,子类方法缩小 /了父类方法的访问权限88方法覆盖的原则(3)3、子类方法不能抛出比父类方法更多的异常4、方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。5、父类的静态方法不能被子类覆盖为非静态的方法,反之亦然;6、子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。7、父类的私有方法不能被覆盖8、父类的抽象方法可以被子类覆盖:子类实现父类的方法或
51、重新声明父类的抽象方法。89练习:阅读下面的程序,运行结果是?public class TestDemo int m=5;public void some(int x) m=x; public static void main(String args ) new Demo().some(7);class Demo extends TestDemo int m=8;public void some(int x) super.some(x);System.out.println(m);A5 B8 C7 D无任何输出 E编译错误 答案:CSystem.out.println(super.m);答案:
52、B90练习:选择题对于下列代码: public class SupperClass public int sum( int a, int b) return a+b; class SubClass extends SupperClass 下述哪个方法可以加入类SubClass? ( ) A) int sum ( int a, int b ) return a+b; B) public void sum (int a, int b ) return ; C) public float sum ( int a, int b) return a+b; D) public int sum ( int
53、a, int b ) return a+b;答案:D对于方法的重载,在程序编译时,根据调用语句中给出的参数,就可以决定在程序执行时调用同名方法的版本,称为编译时的绑定(静态绑定)。对于方法的覆盖,要在程序执行时,才能决定调用同名方法的版本,称为运行时的绑定(动态绑定)。当子类对象赋给超类对象或作为参数传递给超类对象时,超类对象调用子类中的同名方法。 静态绑定和动态绑定子类对象赋值给父类对象(情形1) class Supclass public void print() System.out.println(this is 父类print()方法+此时对象+this.toString(); pu
54、blic class Subclass extends Supclass public static void main(String args) Supclass sup=new Subclass(); sup.print(); System.out.println(此时对象+sup.toString(); 输出结果 this is 父类print()方法此时对象是Subclass11b86e7 此时对象是Subclass11b86e7说明:Supclass sup=new Subclass();虽然声明的对象是父类对象,但实际的内存空间是子类对象的。继承父类的方法public void p
55、rint()被调用,输出的是子类对象名字解析。结论:编译时声明的对象是父类对象,但运行时却是子类对象。子类没有重写父类的方法,则此时的对象调用继承父类的方法。子类对象赋值给父类对象(情形2) class Supclass public void print() System.out.println(this is 父类print()方法+此时对象+this.toString(); public class Subclass extends Supclass public void print() System.out.println(this is 子类print()方法+此时对象+this.
56、toString(); public static void main(String args) Supclass sup=new Subclass(); sup.print(); System.out.println(此时对象+sup.toString(); 输出结果 this is 子类print()方法此时对象是Subclass11b86e7 此时对象是Subclass11b86e7说明:子类重写了父类的print()方法,此时的调用的是子类的print()方法。 结论:此时对象运行时确实是子类对象,如果子类没有重写父类的方法,则此时的对象调用继承父类的方法;否则,此时的对象调用子类方法
57、 问题:将子类对象赋值给父类对象(即Supclass sup=new Subclass(),得到的就是子类对象,即sup就是子类对象?子类对象赋值给父类对象(情形3) class Supclass protected String className=父类属性; public void print() System.out.println(this is 父类print()方法+此时对象+this.toString(); public class Subclass extends Supclass protected String className=子类属性;public void prin
58、t() System.out.println(this is 子类print()方法+此时对象+this.toString(); public static void main(String args) Supclass sup=new Subclass(); System.out.println(此时的属性是:+sup.className); 输出结果此时的属性是:父类属性说明:给父类添了一个属性className,子类重写了这个属性。 但输出此时对象的属性时,却是父类的属性。结论:将子类对象赋值给父类对象,方法和属性和我们正统的继承关系很不一样。子类对象赋值给父类对象(情形4)class
59、Supclass protected String className=父类属性; public void print() System.out.println(this is 父类print()方法+此时对象+this.toString(); public class Subclass extends Supclass protected String className=子类属性;protected String otherClassName=其它子类属性;public void print() System.out.println(this is 子类print()方法+此时对象+thi
60、s.toString(); public void println() System.out.println(this is 子类println()方法+此时对象+this.toString(); public static void main(String args) Supclass sup=new Subclass(); sup.println(); System.out.println(此时的属性是:+sup.otherClassName); 编译出错第16行编译出错:找不到符号println();第17行编译出错:找不到符号className说明:给子类扩展了其它的属性和方法(子类中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年清明节踏青心得体会感悟(4篇)
- 后勤人员工作总结(15篇)
- 车辆质押借款合同(16篇)
- 三年级数学复习计划(8篇)
- 寒假集训心得体会(3篇)
- 新工业产品购销合同(19篇)
- 小学教学教学工作计划(15篇)
- 绿色城市交通规划的咨询合同
- 2025年世界地球日活动演讲稿(20篇)
- 蔬菜代销合同范本(3篇)
- 2024年铁总服务有限公司招聘笔试真题
- 广东省清远市2025届普通高中毕业年级高三教学质量检测物理试卷及答案(二)清远二模
- 2025届“皖南八校”高三第三次大联考物理试卷(含答案解析)
- 2025年4月广西壮族自治区贺州市中考二模语文试题(含答案)
- 教师资格笔试教育数字化转型的挑战与对策分析试题及答案
- 2025年保温杯抛光机项目可行性研究报告
- 2024年河北省中等职业教育对口高考畜牧兽医类真题试卷及参考答案-
- 2024年9月28日福建省事业单位统考《行政职业能力测试》真题及答案
- 2025-2030中国医药冷链物流行业市场发展分析及竞争格局与投资前景研究报告
- 心血管-肾脏-代谢综合征患者的综合管理中国专家共识(2025版)解读
- 2025年数据安全法及个人信息保护法培训试题
评论
0/150
提交评论