1、Java面向对象程序设计 第3章 Java面向对象任务目的掌握Java类的定义掌握Java类的成员变量和成员方法的定义掌握对象的创建和使用掌握构造方法创建和使用掌握类的继承掌握类的访问控制修饰符掌握类的对象转型掌握类的多态掌握抽象类和接口面向对象语言的特征计算机编程语言经历了由低级到高级语言的转变过程,包括机器语言、汇编语言、高级语言,其中高级语言包括面向过程的语言和面向对象的语句,典型的面向过程的语言C语言,面向对象语言是Java语言,对象是Java语言的核心,Java语言中体现了“万事万物皆对象”。面向对象语言有三大特征:封装、继承和多态。封装性将数据和数据的操作放在一起形成一个封装体,这
2、个封装体它可以提供对外部的访问,同时对内部的具体细节也实现了隐藏,也能控制外部的非法访问。封装体的基本单位是类,对象是类的实例,一个类的所有对象都具有相同的数据结构和操作代码。继承性是面向对象的第二个特性,它支持代码重用,继承可以在现有类的基础上进行扩展从而形成一个新的类,它们之间成为基类和派生类的关系,派生类不仅具有基类的属性特征和行为特征而且还可以添加新的特征。采用继承的机制来组织、设计系统中的类,可以提高程序的抽象程度,使之更接近于人类的思维方式,同时也通过继承能较好地实现代码重用,可以提高程序开发效率,降低维护的工作量。多态性使得多个不同的对象接收相同的消息却产生不同的行为,它大大提高
3、了程序的抽象程度和简洁性,更重要的是,它最大限度地降低了类和程序模块之间的耦合性,提高了类模块的封闭性,使得它们不需了解对方的具体细节,就可以很好地共同工作。这个优点对于程序的设计、开发和维护都有很大的好处。类客观世界物以类聚,将一些具有共同特征的的实体放在一起,形成类,如“学生”类、“教师”类、“玩具”类等。面向对象的程序是用来解决实际问题的,要求程序和现实世界中的实体具有一致性,那怎样将客观世界的实体转变为计算机程序设计语言,这涉及到“具体”到“抽象”的过程,将实现世界中的物体类的共性的特征和行为抽取出来,用计算机的程序设计语言class类来表示。类是用于描述同一类型的对象的一个抽象的概念
4、,类中定义了这一类对象所具有的静态(成员变量)和动态(成员方法)属性。它是一种新的数据类型,具有封装性。类的定义类是Java程序的基本单位,在Java中定义一个类,一般包括类的声明和类体两个部分。其一般格式为:类声明/类体1、类声明:一般格式为:修饰符 class 类名 extends 基类名 implements 接口名其中 部分是可选的,修饰符包括访问控制符和非访问控制符,class是Java的关键字,表示这是一个类的定义,类名必须是合法标识符,且首字母一般约定为大写字母,类名指定一个有意义的名称,extends表示继承,该类要继承基类名,implements表示该类还要实现其他接口。2、
5、类体:类体就是类声明后 里面的部分,一般包括类的成员变量和类的成员方法的定义。3、最简单的类的定义形式如下:class 类名/成员变量定义部分;/成员方法定义部分;定义一个学生类:class Student/定义成员变量String strName;/学生姓名String strNo;/学生学号int iAge;/学生年龄double dScore;/学生成绩/定义成员方法void display()System.out.println(学生的姓名:+strName+的成绩+dScore);类的成员变量与成员方法3.3.2.2类的成员变量与成员方法定义一个类时,在类体中可以有成员变量和成员方法
6、。成员变量,它体现的是对象的静态属性,而成员方法体现的是对象的动态行为。1、成员变量:在类中定义的变量,也称为属性。成员变量定义的格式:修饰符 数据类型 成员变量;1)修饰符可以使访问控制符,也可以是static、final等关键字,数据类型可以是基本数据类型,也可以是引用数据类型。2)在定义类的成员变量时可以对其初始化,如果不对其初始化,Java使用默认值对其初始化。其结果如表3.1所示:表3.1 Java类的成员的变量默认初始值成员变量类型成员变量类型默认取值默认取值bytebyte0 0shortshort0 0intint0 0longlong0L0Lcharcharu0000u000
7、0floatfloat0.0F0.0Fdoubledouble0.00.0booleanbooleanfalsefalse所有引用类型所有引用类型nullnull3)成员变量的作用范围为整个类体2、成员方法:1)成员方法的定义:Java的类的成员方法类似于其他语言的函数,是一段完成特定功能的代码段。成员方法的定义格式:修饰符 返回值类型 方法名(形式参数列表)/方法体;方法定义的第一行称为方法的声明,里面称为方法体。修饰符可以使访问控制符,也可以是static、final等关键字,在定义方法时要指明返回类型,返回值类型可以基本数据类型,也可以引用数据类型,如果方法不返回值,则应显示式声明返回类
8、型为void,如果一个方法需要接受外界输入的数据,则要定义形式参数,如果不需要外界输入数据,形式参数列表可以为空。2)形式参数列表的定义格式:数据类型1 变量名1,数据类型2 变量名2,数据类型n 变量名n例如:public void setName(String Name)strName=Name;public void display()System.out.println(学生的姓名:+strName+的成绩+dScore);3)方法的返回值语句 return语句方法体采用return语句终止方法的运行并指定要返回的数据,该值会返回给调用者。语法格式:return 表达式;return关
9、键字用于结束方法以及返回方法指定的类型的值,当方法的返回值为void时,return及其返回值可以省略。4)成员方法的使用:成员方法的调用一般通过对象来调用,调用的语法格式为:对象名.方法名(实参列表);方法调用中实参列表数据类型和个数和形参列表数据一一对应。【例3-1】:通过案例掌握类的方法的定义和调用。class Student/定义成员变量String strName;/学生姓名String strNo;/学生学号int iAge;/学生年龄double dScore;/学生成绩/定义成员方法void display()System.out.println(学生姓名:+strName+,
10、学号:+strNo+,年龄:+iAge+,成绩+dScore);public class Demo3_01 public static void main(String args)Student s1=new Student();s1.strName=余华;s1.strNo=1001;s1.iAge=18;s1.dScore=90.2;s1.display();程序输出结果:对象 从类是一种新的数据类型,封装了对象的静态属性和行为,类可以看成某一类对象的模板,对象可以看成类的一个具体实例。对象的创建由类创建对象,创建对象一般分为两个部分:1、声明对象名类名 对象名;2、给对象实例化:对象名=n
11、ew 类名(参数列表);用new来创建对象并实例化,为对象申请空间,分配内存。类名(参数列表)是调用类的构造方法,给对象进行初始化。以上1、2两个部分可以合并:类名 对象名=new 类名(参数列表);为学生类创建对象yuhua Student yuhua=new Student();对象的使用创建对象后,对象就拥有自己的成员变量和成员方法,对象通过“.”号来调用成员变量和成员方法。对象名.成员变量名;对象名.成员方法名(实参);实参调用方法时实际传给方法的数据。【例3-2】:通过案例掌握类的定义和对象的创建。class Person/成员变量的定义private int id;private
12、int age=20;/成员方法的定义public void setId(int ParaId)id=ParaId;public int getID()return id;public void setAge(int ParaAge)age=ParaAge;public int getAge()return age;public void display()System.out.println(id+:+age);publicclass Demo3_02 public static void main(String args)Person p1=new Person();p1.setId(10
13、01);p1.setAge(25);p1.display();程序输出结果:例3-3】:通过案例掌握类的成员变量和成员方法的调用。定义一个点类,在该类里定义二个方法,一个实现实现点到原点之间的距离,另一个实现任意两个点之间的距离,创建对象调用该方法并输出结果。class PointClassint x;int y;PointClass(int _x,int _y)x=_x;y=_y;public double disO()return Math.sqrt(x*x+y*y);public double dis(PointClass p2)return Math.sqrt(x-p2.x)*(x-p
14、2.x)+(y-p2.y)*(y-p2.y);public class Demo3_03 public static void main(String args)PointClass p1=new PointClass(3,4);double d1=p1.disO();System.out.println(p1到原点的距离:+d1);PointClass p2=new PointClass(5,9);double d2=p1.dis(p2);System.out.println(p1到p2的距离:+d2);程序运行的结果:类的构造方法在类体中有一种特殊的方法,即构造方法,它在创建对象时自动调用
15、,构造方法的作用对对象进行初始化。构造方法具有如下特点:1)构造方法名与类名相同。2)构造方法没有返回值,返回值类型为空,即使void也不写。3)构造方法可以有多个形式参数,也可以无参。4)一个类中可以同时定义多个构造方法,调用构造方法时,系统会根据参数个数及类型寻找匹配的构造方法。5)如果类中没有定义构造方法,系统会提供默认一个无参的构造方法,其方法体为空,形式如下:类名()6)如果类中已经定义构造方法,系统不再提供默认无参构造方法。7)构造方法的调用与成员方法的调用不同,它是在创建对象时自动调用,即格式:new 类名(参数);【例3-4】:通过案例掌握构造方法的定义和调用。class Pe
16、rsonString name;int age;Person()name=Lisi;age=20;Person(String strName,int iAge)name=strName;age=iAge;Person(String strName)name=strName;age=20;publicclass Demo3_04 publicstaticvoid main(String args)Person p1=new Person();/调用第一个构造方法 Person p2=new Person(zhao,20);/调用第二个构造方法 Person p3=new Person(zhao)
17、;/调用第三个构造方法 方法的重载方法重载通常用于完成一组任务相似,但参数的不同的方法。Java中方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择相应的方法。方法的重载具有的特点:1、方法名相同2、方法的参数不同,参数不同包括:参数的个数或者类型不同3、跟方法的返回值无关,返回值类型可以相同也可以不相同【例3-5】:通过案例掌握方法重载的定义和调用。class Person private int id;private int age;Person()id=1001;age=25;Person(int _id,int _age)id=_id;ag
18、e=_age;public int getAge()return age;public void setAge(int i)age=i;public int getId()return id;void info()System.out.println(my id is:+id);void info(String t)System.out.println(t+id +id);public class Demo3_05 public static void main(String args)Person p=new Person();Person p2=new Person(2,500);p.in
19、fo();p.info(ok);程序输出的结果:方法的重载在调用时,根据实参和形参的对应关系找到类型相匹配的关系,如果没有找到类型相匹配的方法,Java编译器会找可以兼容的类型来调用(根据数据类型转换原则,自动转换的数据类型可以来调用)。例如:【例3-6】:通过案例掌握方法重载,如果没有找到类型匹配的方法,通过兼容的类型来调用。class Area double getArea(double r)return 3.14*r*r;double getArea(float x,int y)return x*y;float getArea(int x,float y)return x*y;publi
20、c class Demo3_06public static void main(String args)Area a1=new Area();System.out.println(a1.getArea(2);/调用第一个getArea方法 System.out.println(a1.getArea(2.5f,3);/调用第二个getArea方法 System.out.println(a1.getArea(3,2.5f);/调用第三个getArea方法 程序运行的结果:a1对象调用getArea的三个方法,其中a1.getArea(2)调用第一个getArea方法,根据数据类型转换原则,2数值默
21、认是int整型常量,将整型常量转换为double型数据类型,属于自动转换。如果将a1.getArea(2.5f,3)中的2.5后面的f去掉,则编译不成功,因为2.5数值属于double型数据,将double型数据赋给float型数据,需要强制转换。this关键字this是Java的一个关键字,表示当前对象的引用,主要应用在:1、this调用本类的成员变量:this可以调用本类的成员变量,其语法格式:this.成员变量 类的成员变量和方法中的形式参数重名的情况下,采用this关键字来区别。class Rectangleprivate double length;private double wi
22、dth;Rectangle(double length,double width)this.length=length;this.width=width;this.length表示当前对象this访问成员变量length,而不是形式参数变量length。2、使用、使用this调用本类的其他构造方法调用本类的其他构造方法在构造方法中用在构造方法中用this调用本类中的其他构造方法,此时调用本类中的其他构造方法,此时this指代本类类名,调用时要放在构造方法的首行。其指代本类类名,调用时要放在构造方法的首行。其语法格式:语法格式:this(参数列表参数列表);此处的参数列表和被调用的构造方法参数列
23、表是匹配的,如下例:此处的参数列表和被调用的构造方法参数列表是匹配的,如下例:class Person intage;String name;public Person()public Person(intage)this.age=age;public Person(int age,String name)this(age);/调用了第二个构造方法调用了第二个构造方法this.name=name;3、this可以看作一个变量,它的值是当前对象的引用可以看作一个变量,它的值是当前对象的引用【例【例3-7】:通过案例掌握】:通过案例掌握this关键字的使用。关键字的使用。publicclass D
24、emo3_07 int i=0;Demo3_07(int i)this.i=i;Demo3_07 increament()i+;return this;/返回的是当前的对象返回的是当前的对象 void display()System.out.println(i=+i);public static void main(String args)Demo3_07 demo07=new Demo3_07(100);demo07.increament().increament().display();程序运行结果程序运行结果:static关键字static是Java的关键字,static表示“全局”或者
25、“静态”的意思,可以用来修饰类的成员变量和类的成员方法。1、修饰类的成员变量:在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。语法格式:static 数据类型 变量名;2、修饰类的成员方法:用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可以访问非static的成员。可以通过对象引用或类名(不需要实例化)访问静态成员。3、语法格式:修饰符 static 返回值类型 方法名(参数列表)/方法体4、static的使用【例3-8】:通过案例掌握
26、static关键字的使用。public class Demo3_08 private static int sid=0;private String name;int id;Demo3_08(String name)this.name=name;id=sid+;public void info()System.out.println(My name is+name+No.+id);public static void main(String arg)Demo3_08.sid=100;Demo3_08 demo08_1=new Demo3_08(demo08_1);demo08_1.sid=20
27、00;Demo3_08 demo08_2=new Demo3_08(demo08_1);demo08_1.info();demo08_2.info();程序运行的结果:包 如何有效组织管理Java程序中的涉及到各个类,Java 提供了包机制,用于区别类名的命名空间。包的概念包(package)是Java类的管理机制,包的作用:1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。2、包采用了层次结构,如同文件夹一样,采用了树形目录的存储方式。3、同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避
28、免名字冲突。4、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。import语句import语句是引入语句,用户在编写程序时,通过import语句导入包中的类,用户程序才可以直接使用该类。import语句导入包中的类,有两种情况:1、语法格式为:import 包名.子包名.*;“*”表示本层次的所有类。import java.util.*;/将java.util包下所有的类都引入进来import java.awt.*;/将java.awt包下所有的类都引入进来2、语法格式为:import 包名.子包名.具体的类名;import java.util.Scanner;/只引入java.
29、util包下Scanner类注:JDK中java.lang包下所有的类自动引入,不要采用import语句引入。package语句package语句作为Java源程序的第一条语句,指明该文件中定义的类所在的包,若缺省该语句,则指定为无名包。包语句的语法格式为:package pkg1pkg2pkg3;package是Java的关键字,pkg1是包名,pkg2是子包名,pkg3是子包中的子包。Java编译器把包对应于文件系统的目录管理,package语句中,用“.”来指明包的层次,包的层次和操作系统的文件夹是一一对应的。例如语句:package net.ahiec.www;则该程序通过编译后所有的
30、类位于.netahiecwww目录下。【例3-9】:通过案例掌握package、import关键字的使用。求判断一个点是否在圆内,并求圆的面积。package net.ahiec.www;class PointClassint x;int y;PointClass(int _x,int _y)x=_x;y=_y;class CircleClass PointClass o;int r;CircleClass(PointClass _o,int _r)o=_o;r=_r;boolean contains(PointClass p)int x=p.x-o.x;int y=p.y-o.y;if(x*
31、x+y*yr*r)return false;elsereturn true;public double CircleArea()return 3.14*r*r;public class Demo3_09 public static void main(String args)PointClass o=new PointClass(0,0);PointClass p=new PointClass(2,3);int r=4;CircleClass c1=new CircleClass(o,r);if(c1.contains(p)System.out.println(p点在圆内);else Syst
32、em.out.println(p点在圆外);System.out.println(c1.CircleArea();该程序编译:在dos命令提示符下输入:javac d.TestPackage.java其中d 是指设置编译生成的.class放到哪一个目录,“.”号表示当前文件夹。如果编程成功,则在当前文件夹下形成三个子文件夹.netahiecwww下形成三个class文件。如下图:程序运行的结果:在dos命令提示符下输入:java net.ahiec.www.TestPackage注意:如果在其他程序中引用PointClass和CircleClass类,有一下几种方法:1、采用引入的方法:1)引
33、入具体类名:import net.ahiec.www.PointClass;import net.ahiec.www.CircleClass;2)采用“*”import net.ahiec.www.*;2、在程序中写全名net.ahiec.www.PointClass p1=new net.ahiec.www.PointClass();net.ahiec.www.CircleClass c1=new net.ahiec.www.Circle(p1,3);3、访问位于同一个包中的类不需要引入。常用包JDK给程序开发人员提供了丰富的类,这些类都在相关的包中,下面列举出一些常用的包,如表3.2所示,
34、这些包我们有的已经接触,有的会在后续的学习中会用到。表3.2 常用的包包名包名说明说明java.langlang提供利用提供利用 Java 编程语言进行程序设计的基础类。编程语言进行程序设计的基础类。java.util.utilJAVAJAVA的一些实用工具包,如的一些实用工具包,如Date,Calendar,ArrayListDate,Calendar,ArrayListjava.awtjava.awt包含用于创建用户界面和绘制图形图像的所有类。包含用于创建用户界面和绘制图形图像的所有类。java.awt.eventjava.awt.event提供处理由提供处理由 AWT 组件所激发的各类事
35、件的接口和类。组件所激发的各类事件的接口和类。javax.swingjavax.swing提供一组提供一组“轻量级轻量级”(全部是(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方语言)组件,尽量让这些组件在所有平台上的工作方式都相同。式都相同。java.iojava.io输入流和输入流相的类。输入流和输入流相的类。java.sqljava.sql提供访问并处理存储在数据源中的数据的提供访问并处理存储在数据源中的数据的 API。提供用于网络应用程序的类。提供用于网络应用程序的类。访问权限Java的访问权限是指能够控制类、成员变量、方法的使用权限的关键字。分为类的成员访问权限和类
36、的访问权限。1、类的成员访问权限在一个类的内部,其成员(包括成员变量和成员方法)能否被其他类所访问,取决于该成员的修饰词。Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public。其权限控制如表3.3所示:表3.3 成员的访问权限 同一个类中同一个类中同一个包中同一个包中不同包中的子类不同包中的子类不同包中的非子类不同包中的非子类private可以访问可以访问 默认默认可以访问可以访问可以访问可以访问 protected可以访问可以访问可以访问可以访问可以访问可以访问 public可以访问可以访问可以访问可以访问可以访问可以访问可以访问可以访问2
37、、类的访问权限对类的访问权限只有两种,一种是加public修饰符的访问权限,另一种不加任何访问权限修饰符,默认的访问权限。1)加public修饰符的类访问权限例如:public class BB/类体用public修饰的类称为公共类,公共类可以被任何包中的类访问。2)不加任何访问权限修饰符例如:class BB /类体 Java类前面不加任何访问权限修饰符,称为友好类(friendly),只能在同一个包中类才可以访问。【例3-10】:通过案例掌握访问权限修饰符的使用。class Studentprotected String school;private String name;/仅限于Stu
38、dent类访问。public int age;Student(String name,int age,String school)this.name=name;this.age=age;this.school=school;public class Demo3_10 public static void main(String args)Student s=new Student(li,25,chc);System.out.println(s.name);/name定义时的权限是private,在Monitor中不能访问。System.out.println(s.age);/可以访问age成员
39、 System.out.println(s.school);/可以访问school成员 在上例中System.out.println(s.name);会发生编译错误,如图3.18所示,因为在Monitor中不能访问name,它是private,只能在Student类中访问。继承前面介绍了类的第一大特性,类的封装性,这一节讲类的继承性,继承是面向对象设计的又一个重要特性,继承产生类的层次,通过继承能够方便地复用代码,提高开发的效率。如下图所示:交通工具的类层次。n上图交通工具类属于基类,它有三个子类,分别是汽车类、飞机类和轮船类,而汽车类又分为三个子类:公交车类、小汽车类和卡车类,小汽车类也有三
40、个子类构成,分别是轿车类、跑车类和面包车类。n拥有子类的类称为父类或称基类,一个父类可以拥有多个子类,比如小汽车类拥有三个子类:轿车类、跑车类和面包车类,Java实现的是单继承,也就是一个子类只能属于一个父类。n继承使描述事物更加抽象化、简单。跑车具有小汽车所有的属性,同时还有自己特有的属性,跑得快。在跑车类里面添加“跑得快”属性就可以了,其他属性通过继承父类的小汽车而获得。继承的引入定义一个Wife和Husband类,两个类具有共同的特性,姓名、年龄和身份证号,定义如下:class Wifeprivate String name;private int age;private long ID
41、;private Husband husband;class Husbandprivate String name;private int age;private long ID;private Wife wife;从Wife和Husband两个类除了各自的husband、wife属性不同外其它都相同,这样会产生程序代码冗余,类的继承可以去除代码冗余,实现代码复用。将Wife和Husband两个类共同特性抽取出来,形成一个新类Person类,如下:class Personprivate String name;private int age;private long ID;再让Wife和 Hu
42、sband类继承Person类,只要在Wife和Husband类写上自己独有的特性就可以,共有的特性从Person继承过来。class Wife extends Personprivate Husband husband;class Husband extends Personprivate Wife wife;对于Wife、Husband使用继承后,除了代码量的减少,还能够非常明显地看到他们之间的关系。继承的语法格式:类修饰符class 子类 extends 父类 /类体extends是关键字,表示“继承”的意思,子类又称派生类,父类又称基类(超类),类修饰符可以是public,也可以是默认
43、。子类继承父类具有以下特点:1)子类继承父类,子类拥有父类非private的属性和方法2)子类可以拥有自己属性和方法,即子类可以对父类进行扩展。3)子类可以用自己的方式实现父类的方法(重写)。4)一个子类只能属于一个父类,一个父类拥有多个子类。类的继承【例3-11】:通过案例掌握类的继承的定义和特性。class Person private String name;private int age;public void setName(String name)this.name=name;public void setAge(int age)this.age=age;public String
44、 getName()return name;publicint getAge()return age;class Student extends Person private String school;public String getSchool()return school;publicvoid setSchool(String school)this.school=school;public class Demo3_11 public static void main(String arg)Student student=new Student();student.setName(Jo
45、hn);student.setAge(18);student.setSchool(SCH);System.out.println(student.getName();System.out.println(student.getAge();System.out.println(student.getSchool();程序运行的结果:成员变量的隐藏继承中,子类定义了与父类相同的成员变量时,就会发生子类对父类变量的隐藏。对于子类对象来说,父类中的同名成员变量被隐藏起来,子类优先使用自己的成员变量。如下例:【例3-12】:通过案例掌握类继承中的变量隐藏特性。class TestAint n=10;pu
46、blic class Demo3_12 extends TestAint n=100;public static void main(String args)Demo3_12 demo12=new Demo3_12();System.out.println(demo12.n);程序运行的结果:子类TestB从父类TestA继承了成员变量n,但在子类类体中又定义了成员变量n,此时实际上子类它拥有两个同名的成员变量n,通过子类创建的对象引用该成员时,引用的是子类类体中定义的成员,从父类继承的成员被隐藏,运行结果输入是100。继承方法的重写在实际开发过程中,经常遇到在子类中要重新定义父类的某一个方法
47、,也就是子类根据需要对父类中继承来的方法进行重写。方法一旦重写后,对于子类对象,调用的是自己的成员,覆盖父类的成员方法。方法重写也就方法覆盖。子类对父类的方法重写满足:1)方法名相同2)方法的参数列表相同3)方法的返回值相同4)重写方法不能使用比被重写方法更严格的访问权限【例3-13】:通过案例掌握类继承中的方法重写特性。class Person private String name;private int age;public void setName(String name)this.name=name;public void setAge(int age)this.age=age;pu
48、blic String getName()returnname;public int getAge()returnage;public String getInfo()return Name:+name+n+age:+age;class Student extends Person private String school;public String getSchool()return school;public void setSchool(String school)this.school=school;public String getInfo()return Name:+getNam
49、e()+nage:+getAge()+nschool:+school;public class Demo3_13 public static void main(String args)Student student=new Student();Person person=new Person();person.setName(none);person.setAge(1000);student.setName(John);student.setAge(18);student.setSchool(SCH);System.out.println(person.getInfo();System.ou
50、t.println(student.getInfo();程序运行的结果:在子类中重写了父类的getInfo方法,当子类对象调用getInfo方法时,优先运行子类的getInfo方法。super关键字如果子类和父类有相同的成员变量和成员方法时,子类会隐藏或覆盖父类的成员变量和成员方法,使用子类自己的成员变量和成员方法,但这时如果子类想访问父类的成员变量和成员方法,采用super关键字。语法格式:super.父类的成员变量名;super.父类成员方法名;【例3-14】:通过案例掌握类继承中的super关键字的使用。class Country String name;void value()name