第3章面向对象程序设计基础详解_第1页
第3章面向对象程序设计基础详解_第2页
第3章面向对象程序设计基础详解_第3页
第3章面向对象程序设计基础详解_第4页
第3章面向对象程序设计基础详解_第5页
已阅读5页,还剩136页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第3章 面向对象程序设计基础2015-9-153.1 类与对象3.1.2 类的定义和使用1.类的定义Java类的基本语法类的基本语法: class 可以是任何合法的可以是任何合法的标识符,并且是所声明类标识符,并且是所声明类的名字。的名字。有几种可使用的有几种可使用的,但现在只使用但现在只使用public,声明,声明类可被任意访问。类可被任意访问。类的正文声明了与类相关的类的正文声明了与类相关的数据属性、构造器和方法的数据属性、构造器和方法的集合。集合。BirthDayBirthDay类class BirthDay int year,month,day;2.2.类的使用定义某变量为该类型创建对

2、象:new 类名()赋值成员变量的使用请看例请看例3-13.1.3 3.1.3 源文件构成及命名(1)一个程序中由一个或多个类构成,这些类可以放在同一个源文件中,也可以放在不同文件中,编译后每个类都会对应一个class文件,该class文件主名与类名相同。(2)如果一个源文件中各个类前面都没有public修饰符修饰,源文件主名可以任意取。(3)如果一个源文件中某个类前面有public修饰符,则文件名必须与public修饰的类同名,但一个源文件中最多只能有一个类被public修饰。(4)对于可以独立运行的Java Application程序,在命令行中通过 “java 主类名”执行,这里主类是包

3、括main()方法的类,该方法是程序的入口,且类名后不能带后缀“.class”。3.1.4 3.1.4 基本类型与参考类型变量的区别1. 1. 基本数据类型int x,y;x=10;y=20;y=x;3.1.4 3.1.4 基本类型与参考类型变量的区别2. 2. 参考数据类型BirthDay Tombth,Marybth;Tombth=new BirthDay();Marybth=new BirthDay();Tombth.year=1999;Tombth.month=9;Tombth.day=10;Marybth.year=2000;Marybth=Tombth;3.2 方法方法的基本语法方

4、法的基本语法: () 可以是任何合法的可以是任何合法的标识符,但限制使用那些标识符,但限制使用那些已经在使用的名称。已经在使用的名称。是可选项,并可有很多不是可选项,并可有很多不同的修饰符,包括同的修饰符,包括public、protected和和private等。等。public访问访问修饰符表明可从其他代码调用该方法。修饰符表明可从其他代码调用该方法。private表明方法只能在由该类中其表明方法只能在由该类中其他方法调用。他方法调用。请看例请看例3-3请看例请看例3-43.2.3 3.2.3 方法的重载要构成方法的重载必须满足如下条件:(1)重载的方法在同一个类中,方法名相同(2)方法的参

5、数类型、个数、顺序至少有一个不同修改例修改例3-33.3 3.3 封装class BirthDay int year,month,day;public class BirthTest public static void main (String argsp) BirthDay Tombth,Marybth; Tombth=new BirthDay(); Marybth=new BirthDay(); Tombth.year=1999; Tombth.month=9; Tombth.day=10;.容易产生问题3.3 3.3 封装实现封装的步骤(1)修改属性的可见性,如private修饰重要的

6、成员变量(2)创建访问属性的方法,如set、get方法等(3)在方法中,加入属性的存取限制3.4 构造器3.4.1 构造器的特点构造器的基本语法:构造器的基本语法: () 3.4.1 构造器的特点构造器作用:完成类对象的构造器作用:完成类对象的初始化初始化工作工作构造器的名称必须与构造器的名称必须与类名类名相同相同构造器构造器没有返回值没有返回值并且不可被继承并且不可被继承一般将构造器的修饰符声明为一般将构造器的修饰符声明为public构造构造器器中不能有中不能有return语句语句3.4.1 构造器的特点l参数表与方法声明中的一样。可以象方法一样向构参数表与方法声明中的一样。可以象方法一样向

7、构造器传递参数。造器传递参数。l构造器可以有构造器可以有0 0个、个、1 1个或者多个参数。个或者多个参数。(1)无参数的构造器p没有构造器使用默认的构造器(没有参数,没有方法体)p如果使用没有参数的构造器,则创建的对象具有相同的初始值class BirthDayint year,month,day;BirthDay()year = 2015;month = 9;day = 15;(2)带参数的构造器class BirthDayint year,month,day;BirthDay(int y,int m,int d) year = y; month = m; day = d;class Bi

8、rthDayint year,month,day;BirthDay(int year, int month,int day)this.year = year;this.month = month;this.day = day;3.4.2 构造器的使用u不能由编程人员显式调用。u在创建一个类的新对象的同时,系统会自动调用该类的构造器为新对象初始化。u构造器只能和new运算符一起使用。格式:类名 对象名=new 构造器名称(成员变量的初始值)请看例请看例3-103.4.3 构造器的重载一个类可以有多个构造器,叫做构造器的重载。条件(满足其一)p 参数的个数不同p 参数的类型不同请看例请看例3-11

9、3.4.4 多个构造器的相互调用在一个构造器中只能通过this关键字来调用重载的另一个构造器请看请看43页例子页例子默认构造器每个类至少有一个构造器。如果不编写构造器,则自动添加默认构造器:p 默认构造器不带参数p 默认构造器函数体为空不必编写构造器就能使用new Xxx()创建 对象实例找错误?class Person private String name = model; private int age=20; private double height = 1.7; private double weight = 60; public Person(String name,int ag

10、e,double height,double weight) =name; this.age=age; this.height=height; this.weight=weight; class test public static void main(String args) Person p1=new Person(); Person p2=new Person(“jerry”,20,1.9,100);哪个语句有错?哪个语句有错?为什么?为什么?【上机作业1】定义一个人类,描述人类的姓名、年龄、身高、体重,定义一个方法用来检验人的体重是否在正常范围之内,定义一个方法用于得

11、到是否肥胖的结论。 (需要定义构造器)计算标准上机作业2 2定义一个圆类,类中包含圆心x坐标、y坐标和半径等属性,有计算圆面积和周长的方法。(要求:定义构造器)【09160916上机情况总结】工程名的命名问题(不要命名为*.java)src下的文件都是.java文件类的构成找问题1 1class PersonString name;int age;double height,weight;double bmi = weight/(height*height);if(bmi19.8) System.out.println(偏瘦);找问题2 2class PersonString name;int

12、 age;double height,weight;void setAge(int a)this.age = a;void printAge()System.out.println(a);找问题3 3class Circleint x,y,radius;public Circle(int x, int y, int radius) this.x = x;this.y = y;this.radius = radius;void print()System.out.println(周长是:+2*3.14*radius);System.out.println(面积是:+3.14*radius*rad

13、ius);【上节内容复习】如何实现封装?构造器的作用?何时调用构造器?【书面作业的问题】书写雷同3.5 3.5 变量的作用域和初始化(1)局部变量:要先赋值再使用方法内部定义作用域是整个方法方法的代码块中定义作用域是代码块【找问题】void print() double pi; System.out.println(周长是:+2*pi*radius); System.out.println(面积是:+pi*radius*radius);3.5 3.5 变量的作用域和初始化(2)参数由实参赋值方法或构造器的参数作用域是方法或构造器内部【举例】public class test public st

14、atic void main(String args) Circle c1 = new Circle(1,2,5);class Circleint x,y,radius;public Circle(int x, int y, int radius) this.x = x;this.y = y;this.radius = radius;3.5 3.5 变量的作用域和初始化(3)成员变量对象创建时有默认值在类内、方法外定义整个类3.3.7 7 父类、子类和继承继承在继承关系中,被继承的类为父类,由继承得到的类为子类。子类可以继承父类中的属性和方法,也可以在子类中添加新的属性和方法,也可以修改定义原

15、有(从父类继承得到的)的变量成员,重写原有的方法。 在Java中,所有的类都是直接或间接地继承类Object,也就是说在Java的类树中,Object是这棵树的根。【例3-153-15】StudentStudent类Student+studentNo : String+name : String+showInfo() : voidclass Student String studentNo,name; void showInfo() System.out.println(学号:学号:+studentNo); System.out.println(姓名:姓名:+name); 【例3-153-15

16、】子类化Collegian +major : Stringclass Student String studentNo,name; void showInfo() System.out.println(学号:学号:+studentNo); System.out.println(姓名:姓名:+name); class Collegian extends Student String major;Student+studentNo : String+name : String+showInfo() : void单继承(Java(Java只支持单继承) )当类只从一个类继承时,称为单继承当类只从一个

17、类继承时,称为单继承Java中类的继承结构为树状中类的继承结构为树状语法:语法: class extends * 【例3-153-15】class Student String studentNo,name; void showInfo() System.out.println(学号: +studentNo); System.out.println(姓名: +name); class Collegian extends Student String major;class sttest0 public static void main (String args) Collegian cst=n

18、ew Collegian(); cst.studentNo=0810123; =张三; cst.major=计算机; cst.showInfo();【对例3-153-15的说明】大学生是学生的一种类型,所以把Collegian定义为Student的子类是合乎它们之间的逻辑关系的另一方面,通过继承可以避免程序的冗余。通过运行结果可以看到,子类Collegian从父类Student中继承了成员变量studentNo、name和方法showInfo()将父类属性改为privateprivate,结果如何呢?class Student private String studentNo,

19、name; void showInfo() S y s t e m . o u t . p r i n t l n ( 学 号 :+studentNo); System.out.println(姓名:+name); class Collegian extends Student String major;class sttest1 public static void main (String argsp Collegian cst=new Collegian(); cst.studentNo=0810123; =张三; cst.major=计算机; cst.showInfo(

20、); 【说明】子类可以继承父类中子类可以继承父类中非非private的方法和属性的方法和属性不不必重新定义必重新定义子类中可以增加新的属性和方法子类中可以增加新的属性和方法继承的目的:程序代码继承的目的:程序代码重用重用,减少冗余,减少冗余3.7.2 方法的覆盖(override)覆盖方法覆盖:覆盖:在子类中定义了与父类中同名的方法,在子类中定义了与父类中同名的方法,且方法的且方法的l 参数(个数、类型、排列顺序)参数(个数、类型、排列顺序)l 返回类型返回类型完全一致完全一致【分析例3-153-15的问题】在Collegian中有三个属性值要输出,但是在通过继承得到的方法showInfo()

21、只能输出两个属性值,在子类中新添加的属性major的值没有被输出【思考】如何解决?【对例3-153-15的修改】class Student String studentNo,name; void showInfo() System.out.println(学号:+studentNo); System.out.println(姓名:+name); class Collegian extends Student String major; void showInfo() System.out.println(学号:+studentNo); System.out.println(姓名:+name);

22、 System.out.println(专业:+major);【对例对例3-153-15的修改的修改】class sttest public static void main (String argsp) Student st=new Student(); st.studentNo=0810123; =张三; st.showInfo(); Collegian cst=new Collegian(); cst.studentNo=“1110101; =“李四; cst.major=“计算机”; cst.showInfo(); 【思考:分析该例是覆盖还是重载?】cla

23、ss Base public void amethod(int i)System.out.println(i=+i); class Scope extends Base public void amethod(int i,float f) System.out.println(i=+i); System.out.println(f=+f); class test1 public static void main (String argsp) Scope s1; s1=new Scope(); s1.amethod(10); s1.amethod(10,2.3f); 【分析】在这个例子中,父类B

24、ase和Scope中分别定义了方法amethod,看起来似乎是覆盖,但是这两个方法的参数不相同,因此不能形成覆盖。又因为子类Scope把父类定义的方法amethod(int i)继承了下来,然后又新定义了一个同名但参数不相同的方法amethod(int i,float f),因此在子类Scope中有两个同名方法,而且它们的参数不相同,满足方法重载的条件,因此,形成了重载,而不是覆盖。 【改进例1 1】加上构造器class Student String studentNo,name; Student(String sn,String nm) studentNo=sn; name=nm; void

25、 showInfo() System.out.println(学号:+studentNo); System.out.println(姓名:+name); 【改进例1 1】加上构造器class Collegian extends Student String major; Collegian(String sn,String nm,String mj) super(sn,nm); major=mj; void showInfo() super.showInfo(); System.out.println(专业:+major); 【改进例1 1】加上构造器class sttest public s

26、tatic void main (String argsp) Student st=new Student(651003,王五); st.showInfo(); st.studentNo=0810123; Collegian cst=new Collegian(0810123,张三,计算机); cst.showInfo(); supersuper关键字往往在覆盖方法时,真正的目标不是往往在覆盖方法时,真正的目标不是代替代替现有的行现有的行为,而是在某些方面为,而是在某些方面扩展扩展那个行为那个行为类中使用类中使用super来指向父类的成员,包括数据和方来指向父类的成员,包括数据和方法法3.7.

27、3 3.7.3 supersuper的三种使用方式super.方法名方法名(参数表参数表); 调用父类的方法调用父类的方法super(参数表参数表); 调用父类的构造函数调用父类的构造函数super.成员变量名成员变量名 访问父类的成员变量访问父类的成员变量构造函数不能继承子类从父类继承非私有的方法和变量子类不能继承父类的构造函数有两种方法获得构造函数p使用默认构造函数p编写一个或多个构造函数调用父类构造函数要要调用父类构造函数调用父类构造函数,必须在子类构造函数的第一,必须在子类构造函数的第一行使用行使用super关键字关键字要调用特定的父类构造函数,必须为要调用特定的父类构造函数,必须为s

28、uper提供参提供参数数如果没有如果没有this或或super调用,编译器会插入一个对父调用,编译器会插入一个对父类无参数构造函数的隐含调用:类无参数构造函数的隐含调用:super()【supersuper的第三种用法】class FatherString var=Fathers variable;class Son extends Father String var=Sons variable; void test() System.out.println(var is +var); System.out.println(super.var is +super.var); public st

29、atic void main (String argsp) Son s=new Son(); 【分析】哪儿有问题?class Student String studentNo,name; Student(String sn,String nm)studentNo=sn; name=nm; class Collegian extends Student String major; Collegian(String sn,String nm,String mj) super(sn,nm); major=mj; Collegian(String nm,String mj) super(“10010”

30、,nm); major=mj; Collegian(String mj) major=mj; 上机作业1 1根 据 类 图 编 写 E m p l o y e e 、 W o r k e r 和HourlyWorker三个类。要求三个类要有相应的构造函数。编写main方法进行测试。Employee+getFirstName():String+getLastName():String+toString():String /得到姓名得到姓名+earnings():double /计算收入计算收入+setSalary():void+setCommission():void+setQuantity()

31、:void+toString():String /得到姓名得到姓名+earnings():double /计算收入计算收入Worker /普通员工普通员工-salary:double /底薪底薪-commission:double /奖金奖金-quantity:int /销售额销售额HourlyWorker /计时工人计时工人-wage:double /每小时工资每小时工资-hours:double /工作时间工作时间-firstname:String /姓姓-lastname:String /名名+setWage():void+setHours():void+toString():Strin

32、g /得到姓名得到姓名+earnings():double /计算收入计算收入上机作业2定义一个形状类定义一个形状类CShape,在此基础上派生出,在此基础上派生出矩形类矩形类CRectangle和圆类和圆类CCircle, ,两者都有两者都有GetArea()函数计算对象的面积。试编写一个函数计算对象的面积。试编写一个完整的程序。完整的程序。类图类图CShape+GetArea() : double+GetArea() : doubleCRectangle+x : double+y : double+GetArea() : doubleCCircle+r : double3.8 3.8 包为

33、了更好的组织类,Java提供了包机制一个包相当于一级或者多级目录Java采用了.来分隔目录需要掌握的两个语句(1 1)创建包package pkg1.pkg2.pkg3.;源文件的第一条语句一个文件中最多只能有一条package语句需要掌握的两个语句(2 2)加载包import pkg1.pkg2.classname|*;如果需要从一个包中加载一个类时,则在包名后跟着要加载的类名如果需要从一个包中加载多个类时,则在包名后跟着*指代包中所有的类import语句可以有多个,放在package语句之后Java SE API Java SE API 文档http:/ 声明对象Person p;未初始化

34、地址未初始化地址p栈内存栈内存堆内存堆内存示例示例(2) 创建对象p=new Person();未初始化地址未初始化地址p栈内存栈内存堆内存堆内存null00.00.0nameageweightheight0 x30000 x3000注意二者的区别注意二者的区别栈stack连续的内存区域,大小固定,编译时确定所需空间大小,效率高堆heap不连续的内存区域,运行时确定所需空间大小(支持面向对象的多态性,如:运行时才能确定是哪个类的对象),效率低,但灵活3.2.4 3.2.4 静态变量静态变量补充实例补充实例 public class Person private int person_No; p

35、ublic static int nextperson_No=1000; public Person() person_No=+nextperson_No; 补充实例补充实例 class Test public static void main(String args) Person c1=new Person(); Person c2=new Person(); 补充实例补充实例 public class Person private int person_No; public static int nextperson_No=1000; public Person() person_No=

36、+nextperson_No; public int getPerson_No() return person_No; 补充实例补充实例 class Test public static void main(String args) Person c1=new Person(); Person c2=new Person(); System.out.println(“c1:nextperson_No”); System.out.println(c1. nextperson_No); System.out.println(“c1:person_No”); System.out.println(c

37、1. getPerson_No(); Person+nextperson_No:int=1000-person_No:intc1:Clerkperson_No=1001c2:Clerkperson_No=1002实例实例实例实例在这个示例中,为创建的每个对象分配了一个唯一的序列号,在这个示例中,为创建的每个对象分配了一个唯一的序列号,从从10001000开始向上递增。变量开始向上递增。变量nextperson_No在所有实例间共在所有实例间共享,因此当一个对象的构造器增加享,因此当一个对象的构造器增加nextperson_No的值时,的值时,下一个创建的对象就可接收到这个增加的值。下一个创建的

38、对象就可接收到这个增加的值。类属性说明类属性说明使用static来标记的变量是共享于类的所有实例的变量。例如:可以使用该变量作为实例间通信的基础,或者跟踪已创建的实例数。如果static变量未被标记为private,那么可从类外访问它。这样,不需要类的实例,就可通过类名引用它。 public class OtherClass public void incrementNumber() Person.nextperson_No+; 类属性的使用类属性的使用API中:如Math.PI(不用创建Math类的对象就可以使用PI这个类属性)作为全局变量,即只想用一个存储区域来保存特定的数据。无论创建多少

39、个对象,甚至不创建对象都可以使用。思考:1.银行卡的年费2.排队机银行卡举例银行卡举例 public class BankCard private String CardNO; /卡号 public static double annual_fee; /年费 补充实例补充实例 class Person private int person_No; private double person_salary; public static int nextperson_No=1000; public static double person_lowsalary=280; /最低工资 public P

40、erson(double salary) person_No=+nextperson_No; person_salary=person_lowsalary+salary; public int getPerson_No() return person_No; 2.4 static2.4 static方法方法类方法示例类方法示例 class Person private int person_No; public static int nextperson_No=1000; public Person() person_No=+nextperson_No; public int getPerso

41、n_No() return person_No; public static int getNextperson_No() return nextperson_No; 使用类名访问静态方法使用类名访问静态方法public class Test public static void main(String args ) System.out.println(“Number of person is”+Person. getNextperson_No(); Person c1=new Person(); System.out.println(“Number of person is”+Person

42、. getNextperson_No(); staticstatic方法说明方法说明main()方法是static方法,因为执行main方法时,JVM并不创建类的实例。因此如果有成员数据,必须创建对象来访问它。如:Math类的运算方法都定义为static,可以直接通过Math.方法名()来访问。staticstatic方法说明方法说明除了局部变量、static属性及其参数外,static方法不能访问任何变量。如果试图访问非static属性会引起编译器错误。非static属性绑定到一个实例上并且只有通过实例引用才能访问。错误的例子错误的例子 class Person private int pe

43、rson_No; public static int nextperson_No=1000; public Person() person_No=+nextperson_No; public int getPerson_No() return person_No; public static int getNextperson_No() return person_No; /编译错误 判断哪些语句错误?判断哪些语句错误? class Test static int num; int c; public static void main(String args ) num=100; c=100;

44、 static void ss() num=100; c=100; void tt() num=100; c=100; 正确的写法正确的写法 class Test static int num; int c; public static void main(String args ) num=100; Test t=new Test(); t.c=100; 分析该例,找出错在哪儿?分析该例,找出错在哪儿?class InstanceTest int Variable; static public int method() return Variable; static public void

45、method2(int variable) this.Variable=variable; 补充:静态初始化器补充:静态初始化器静态初始化静态初始化一个类可以在“静态块”中(而非方法体内)包含代码静态块代码仅在加载类时执行一次如果类中包含多个静态块,它们将被按照在类中出现的顺序执行示例示例1 1 class Count public static int counter; static counter=10; public class Test public static void main(String args ) System.out.println(“counter=”+Count.c

46、ounter); 示例示例2 2 class ss static System.out.println(“hi”); public class Test public static void main(String args) ss t1=new ss(); ss t2=new ss(); ss t3=new ss(); 初始化初始化实例变量的初始化构造函数类变量(static变量)的初始化静态初始化器3.4 3.4 多态多态1.1.变量多态变量多态类型为X的参考变量,其指向的对象类型既可以是X,也可以是X的子类如:Student x=new Collegian();Student y=new

47、 Student();【多态例1.11.1】class Student String studentNo,name; Student(String sn,String nm) studentNo=sn; name=nm; void showInfo() System.out.println(学号:+studentNo); System.out.println(姓名:+name); class Collegian extends Student String major; Collegian(String sn,String nm,String mj) super(sn,nm); major=m

48、j; void showInfo() super.showInfo(); System.out.println(专业:+major); 【多态例1.11.1】class test public static void main (String argsp) Student s1,s2; s1=new Student(651003,王五); s1.showInfo(); s2=new Collegian(0810123,张三,计算机); System.out.println(姓名:+); System.out.println(专业:+s2.major); s2.showInfo()

49、; 【分析例1.11.1的问题】出错的语句: System.out.println(专业:+s2.major); 改为: System.out.println(专业:+(Collegian)s2).major); 原因: 通过对象名访问成员变量时,取决于该对象声明时的类型,因此s2声明时是Student类型,因此访问major会出错; 而通过对象名调用方法时,则取决于该对象实际的类型,因此s2.showInfo()是调用的子类的方法。2.2.补充几个实例补充几个实例理解覆盖和隐藏的区别理解覆盖和隐藏的区别(2.(2.1)1)实例方法能够被覆盖实例方法能够被覆盖class Super Strin

50、g name() return “mother; class Sub extends Super String name() return “baby; (2.(2.1)1)实例方法能够被覆盖实例方法能够被覆盖 class Test public static void main(String args) Super s = new Sub(); System.out.println((); 输出输出:baby(2.2)(2.2)静态方法不能被覆盖静态方法不能被覆盖class Super static String name() return “mother; class Sub

51、extends Super static String name() return “baby; (2.2)(2.2)静态方法不能被覆盖静态方法不能被覆盖 class Test public static void main(String args) Super s = new Sub(); System.out.println((); 输出输出:mother原因原因静态方法在编译时根据调用该方法的类或对象所属的类决定实例方法在运行时根据对象所属的类决定例如: Super s = new Sub();编译时s是Super类的对象,而运行时s指向Sub类的对象(2.3)(2.3)属性

52、的隐藏属性的隐藏class Base int x = 1; static int y=2;class Subclass extends Base int x = 4; int y=5;(2.3)(2.3)属性的隐藏属性的隐藏public class Test public static void main(String args) Subclass s=new Subclass(); System.out.println(s.x + + s.y);输出什么? 4 5修改修改(2.3)(2.3):(2.(2.3)3)public class Test public static void mai

53、n(String args) Base s=new Subclass(); System.out.println(s.x + + s.y);输出什么? 1 2原因:编译时根据类或对象类型决定总结总结父类的实例方法被子类的同名实例方法覆盖父类的静态方法被子类的同名静态方法隐藏父类的实例变量和类变量(static)可以被子类的实例变量和类变量隐藏(2.4)(2.4)class Base int x = 1; static int y=2; String name() return mother; static String staticname() return static mother; cl

54、ass Subclass extends Base int x = 4; int y=5; String name() return baby; static String staticname() return static baby; (2.4)(2.4)public class Test public static void main(String args) Subclass s=new Subclass(); System.out.println(s.x + + s.y); System.out.println((); System.out.println(s.stati

55、cname(); Base ss=s; System.out.println(ss.x + + ss.y); System.out.println((); System.out.println(ss.staticname(); 隐藏和覆盖的区别隐藏和覆盖的区别将子类对象转换为父类对象(直接赋值)后,可以访问被隐藏的变量和方法(编译时根据类型决定),但是不能访问被覆盖的变量和方法(运行时根据类型决定)。3.instanceof3.instanceof操作符操作符修改修改(2.4)(2.4)可以根据对象所属的类进行不同的处理: public static void main(Stri

56、ng args) Base ss=new Subclass(); if (ss instanceof Subclass) System.out.print(ss.x + + ss.y); System.out.print((); System.out.print(ss.staticname(); 还存在问题?还存在问题?class Base int x = 1; static int y=2;class Subclass extends Base int x = 4; int y=5; int z=9;编译出错编译出错public static void main(String

57、args) Base ss=new Subclass(); if (ss instanceof Subclass) System.out.print(ss.z); 解决方法解决方法对象类型转换对象类型转换public static void main(String args) Base ss=new Subclass(); if (ss instanceof Subclass) System.out.print(Subclass)ss).z); 对象类型转换对象类型转换对对(2.2)(2.2)的修改的修改class Super static String name() return mothe

58、r; class Sub extends Super static String name() return baby; 对象类型转换对象类型转换对对(2.2)(2.2)的修改的修改class Test public static void main(String args) Super s = new Sub(); System.out.println(Sub)s).name(); 对象类型转换对象类型转换对对(2.3)(2.3)的修改的修改class Base int x = 1; static int y=2;class Subclass extends Base int x = 4;

59、int y=5;对象类型转换对象类型转换对对(2.3)(2.3)的修改的修改public class Test public static void main(String args) Base s=new Subclass(); System.out.println(Subclass)s).x + + (Subclass)s).y);对对(2.4)(2.4)的修改的修改public static void main(String args) Base ss=new Subclass(); if (ss instanceof Subclass) System.out.print(ss.x +

60、+ ss.y); System.out.print((); System.out.print(ss.staticname(); 将红色的ss都改为(Subclass)ss),才可以得到子类的x和y,调用子类的静态方法staticname()4.4.多态的应用多态的应用4.14.1异类收集异类收集class Animal public void eat()class Dog extends Animal public void eat()System.out.println(狗吃骨头);class Cat extends Animal public void eat()System

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论