第6章 面向对象程序设计2
面向对象程序设计(二)
面向对象程序设计(二)引言概述:面向对象程序设计是一种广泛应用于软件开发的编程范式。
在面向对象程序设计(一)中,我们介绍了面向对象的基本概念和特征。
本文将进一步探讨面向对象程序设计的相关主题,包括继承、多态、抽象类、接口和设计模式等。
正文内容:一、继承(Inheritance)1. 定义和基本原理2. 继承的优点和适用场景3. 单继承和多继承的区别4. 继承关系的建立和维护5. 继承的注意事项和常见问题二、多态(Polymorphism)1. 定义和基本原理2. 多态的实现方式和机制3. 多态的优势和应用场景4. 接口和抽象类在多态中的作用5. 多态的局限性和解决方案三、抽象类(Abstract Class)1. 抽象类的概念和特点2. 抽象类的定义和使用3. 抽象类与具体类的关系4. 抽象类的继承和多态中的应用5. 抽象类的设计原则和最佳实践四、接口(Interface)1. 接口的定义和作用2. 接口的实现和使用3. 接口与类之间的关系4. 接口与多继承的区别和优势5. 接口的设计原则和利用接口解耦的实例五、设计模式(Design Patterns)1. 设计模式的概念和分类2. 创建型设计模式:工厂模式、单例模式、原型模式3. 结构型设计模式:适配器模式、装饰器模式、代理模式4. 行为型设计模式:观察者模式、策略模式、命令模式5. 设计模式在面向对象程序设计中的应用和实例分析总结:面向对象程序设计(二)进一步深入探讨了继承、多态、抽象类、接口和设计模式等面向对象的重要主题。
通过学习这些内容,我们能够更好地利用面向对象的思想和方法来进行软件开发,提高代码的复用性、可扩展性和可维护性。
对于软件开发人员来说,掌握面向对象程序设计是非常重要的一项技能。
第6讲 面向对象程序设计(2)PPT教学课件
Java不支持多继承,但支持多接口;
子类的对象也是其超类的对象,反之未必(instanceof);
继承语法: class className extends superClassName
{
各实例变量和方法的定义
}
3
8 方法的覆盖(override) 9 变量的隐藏
在子类中定义一个与父类同名、返回类型、参数类型均相 同一个方法,称为方法的覆盖。
2
7 继承(extends)
继承是软件重用的一种形式 ,可以提高系统的性能;
通过关键字extends继承一个已有的类,被继承的类称为父类 (超类,基类),新的类称为子类(派生类)。
继承具有传递性。
子类可以继承父类的属性和行为,并且还可以根据自己的特点增 加新的属性和行为.
子类在调用自己的构造函数前,先调用其父类的构造函数
在子类中定义一个与父类同名的变量时那么在子类及其对象中该父类同名的变量就被隐藏了这种现象称为变量的隐藏
2020/12/11
面向对象程序设计
4#401 88222096
1
第6 讲 面向对象程序设计(2)
二 Java面向对象程序设计
7 继承(extends) 8 方法的覆盖(override) 9 变量的隐藏(hide) 10 super
覆盖发生在子类与父类之间。 注意与方法的重载的区别。 在子类中定义一个与父类同名的变量时,那么在子类及其
对象中,该父类同名的变量就被隐藏了,这种现象称为变量 的隐藏。
4
10 super
特殊变量super,提供了对父类的访问。
访问父类被隐藏的变量;super.variable 调用父类被覆盖的方法;super.method(); 调用父类的构造函数;super([paramlist]);
第六章面向对象程序设计
本章要点
面向对象的基本概念 类的定义与对象的声明 构造函数和析构函数 类的静态成员和实例成员 类的继承与多态性的编程实现 接口的实现
第6章 面向对象程序设计
6.1面向对象程序设计概述 6.2类和对象 6.2.1类的声明 6.2.2对象和类成员 6.2.3 域与属性 6.2.4 静态方法和非静态方法 6.2.5 构造函数和析构函数 6.3 方法的重载 6.4 类的继承 6.5 接口
6.1面向对象程序设计概述
方法的覆盖是指子类重新定义父类的同名函数. 方法的重载与方法的覆盖不同,方法的重载不是 子类对父类同名方法的重新定义,而是同一类中 若干同名方法的重新定义.这些函数的参数表不 同(或许参数个数不同,或许参数类型不同,或 许两者都不同).方法名称一样,但如果参数不 同,就会有不同的具体实现.系统仅通过参数列 表选择匹配的方法定义.
6.2.1类的声明 类的声明
(2)Shadows :可选项.指示此类隐藏基类中 的同名编程元素.可以用其他任何类型的 元素来隐藏任何类型的被声明元素.被隐 藏的元素在隐藏它的派生类内不可用,除 非隐藏元素不可访问,例如,如果元素声 明为 Private. (3)MustInherit :可选项.指示只能通过派生类 访问 Class 的非共享成员.不能创建必须 继承的类的实例. (4)NotInheritable:可选项.指示 Class 是不允 许进一步继承的类.
6.2.1类的声明 类的声明
(5)类名:必选项.Class 的名称;符合标准 变量命名规则. (6)Inherits:可选项.指示该类继承了另一个 类的成员.类可以只继承一个其他类. (7)Implements :可选项.指示该类实现了接 口的成员.如果使用 Implements 语句,那 么它必须在 Class 语句之后并紧靠 Inherits 语句的后面,而且必须实现由接口定义的 所有成员.
第06章 面向对象程序设计PPT课件
3
面向对象的基本概念2-1
• 类和对象
– 通常把具有相同性质和功能的事物所构成的整体称为 类
– 属于一个类的某个具体的事物称为该类的一个对象
• 属性、方法和事件
– 属性是指一个类的性质 – 方法是指一个类的功能 – 事件是对象能够识别和响应的某些操作
• 封装
– 封装是指将用来描述客观事物的一组数据和操作包装 在一起,形成一个类
• namespace Ns1 • { class A {…} • class B {…} •}
10
使用命名空间5-4
• 命名空间可以嵌套使用,例如
– namespace Ns1 –{ – namespace Ns2 –{ – class B {…} –} –}
11
使用命名空间5-5
• 在C#开发中,每个项目会自动附加一个默 认的命名空间
方法
方法定义类可以执行的操作。方法可以接受提供输入数据的参数, 并且可以通过参数返回输出数据。方法还可以不使用参数而直接返 回值
事件
事件是向其他对象提供有关事件发生(如单击按钮或成功完成某个 方法)通知的一种方式
索引器 索引器允许以类似于数组的方式为对象建立索引
运算符 运算符是对操作数执行运算的术语或符号,如 +、*、< 等
• 析构函数具有如下性质
– 析构函数在类对象销毁时自动执行 – 一个类只能有一个析构函数,而且析构函数没有参数,
即析构函数不能重载 – 析构函数的名称是“~”加上类的名称(中间没有空
格)。 – 与构造函数一样,析构函数也没有返回类型 – 析构函数也不能被继承
24
析构函数示例
using System;
4
面向对象的基本概念2-2
VFP第6章面向对象的程序设计
03
Visual FoxPro中的事件 驱动编程
事件驱动编程的概念
事件驱动编程是一种编程范式,它通 过事件来触发程序的执行。在事件驱 动的程序中,事件是由用户操作或其 他系统事件触发的,例如点击按钮、 键盘输入等。
在事件驱动的程序中,程序的状态由 事件和事件处理程序来管理。当某个 事件发生时,相应的事件处理程序会 被调用,以响应该事件。
什么是对象
对象是面向对象程序设计的基本单元,代表了现实世界中的 事物或概念。
对象由属性和方法组成,属性描述对象的状态,方法定义对 象的行为。
对象的属性、方法和事件
属性
描述对象特性的数据元素,如颜色、大小等。
方法
定义在对象上的操作,用于实现特定的功能 或行为。
事件
由用户或系统触发,导致对象状态改变或执 行特定操作。
根据项目需求选择合适的数据访问方式,如直接访问数据 库、使用ORM框架等。
01
数据流控制
设计合适的数据流控制结构,如顺序、 循环、条件等,实现数据的处理和流转。
02
03
数据验证
对输入数据进行验证,确保数据的合 法性和准确性。
THANKS FOR WATCHING
感谢您的观看
为控件编写事件处理程序,以响应用户的操 作或系统事件。
调用方法
通过调用控件的方法来执行特定的操作,如 显示或隐藏控件。
05
面向对象程序设计在 Visual FoxPro中的应用
数据库应用程序的设计
数据库模型选择
根据项目需求选择合适的数据库模型,如关系 型、层次型或网络型。
数据结构设计
定义数据库中的表、字段、主键、外键等,以 及表之间的关系。
事件处理程序
面向对象的程序设计
第六章面向对象的程序设计6.1 面向对象程序设计概述1. 基本概念面向对象的程序设计是经过对类、子类和对象等的设计来体现的类是面向对象程序设计技术的核心。
类: 定义了对象特征以及对象外观和行为的模板。
类的特征:封装性: 隐藏了类中对象的内部数据或操作细节, 只看到外表信继承性:任何类都能够从其它已有的类中派生, 新类保持了父类中的行为和属性, 但增加了新的功能。
体现了面向对象设计方法的共享机制。
多态性: 相同的操作可作用于多种类型的对象上, 并获得不同的抽象性: 提取一个类或对象与众不同的特征, 而不对该类或对象的所有信息进行处理。
基类:系统本身提供的类称为基类。
基类包括容器类和控件类。
容器类是其它对象的集合, 如表格、选项按钮组; 控件类是单一的对象, 不包含其它对象, 如命令按钮、文本框。
子类:以其它类定义为起点, 对某一对象所建立的新类。
新类将继承任何对父类所做的修改。
类库:存储类的文件, 每一个以可视方式设计的类都存储在一个类库中。
类库文件的扩展名为.VCX 。
对象: 是类的一个实例, 包括了数据和过程。
具有所在类所定义的全部属性和方法。
VFP有两种对象:容器对象和控件对象。
属性: 控件、字段或数据库对象的特性。
事件:由对象识别的一个动作。
方法:与对象相联系的由程序执行的一个处理过程, 即处理事件的一组代码用户不能够为对象创立新的事件, 但能够创立新的方法程序。
2. Visual FoxPro 基类从下述Visual FoxPro 基类中, 能够派生子类或创立对象。
容器命令组控件微调标签表单命令按钮复选框OLE 容器控制线条表单集选项组列表框OLE 绑定型控制分隔符#表格选项按钮#文本框自定义形状标头#页框组合框工具栏图象列#页面#编辑框计时器注: # 这些类是父容器的集成部分, 在类设计器中不能子类化基类事件的最小集合事件说明Init 当对象创立时激活。
Destroy 当对象从内存中释放时激活。
《C++面向对象程序设计》 谭浩强 第六章
C++
先声明基类point类,并调试之; 再声明派生类circle类,调试之; 最后声明cylinder类,调试之。
6- 5
① 先声明基类point
#include <iostream.h> class point //声明类point {public: point (float x=0, float y=0 ); //有默认值的构造函数 void setPoint (float, float); //设置点坐标 float getX ( ) const { return x; } // 读x 值 float getY ( ) const { return y; } // 读y 值 friend ostream & operator << ( ostream &, const point &); protected: float x,y; }; // 下面定义 point类的成员函数 point :: point (float a, float b) // point的构造函数 { x = a; y = b; } void point :: setPoint (float a, float b) { x =a; y = b; } ostream &operator << (ostream &output, const point &p) { // 重载运算符<< output<<“[x=“<<p.x<<“, y=“<<p.y<<“]”<<endl; return output; }
6Hale Waihona Puke 7③ 最后声明cylinder类
C面向对象程序设计第二章
C++
2- 6
2.1 面向对象程序设计方法概述
什么是对象封装(encapsulation )?
就是把对象的不想让外界知道的属性和功能屏蔽起来, 让外界看不见。封装有两个含义,一是将有关的数据和操作 函数封装成一个基本单位,即对象内。各对象之间相互独立, 互不干扰;二是将对象中的部分属性或功能对外隐蔽,只留 少数接口向外公布,以接收外界信息。
就是对象的“属性”,函数就是用来对数据进行的“操作”, 以便实现某种功能。这种操作就是对象的“行为”,也叫 “方法”。我们点击一下鼠标,按动键盘的一个按钮,就是 给某个对象一个消息,系统会调用该对象中的函数进行操作。
比如长方形对象,其长和宽就是它的属性,调用该对象 的一些函数,即向该对象传送一些消息,可以用来对其长、 宽值进行加工计算,以实现求出面积、周长等功能。
C++中,所谓多态性是指,由继承而产生的相关的不同 的类,其对象对同一消息会作出不同的响应。
显然,多态性能增加程序的灵活性,它是面向对象程序 设计的重要特征。
C++
2- 10
填空题
1.面向对象的系统最突出的特性是
、
、
。
2.C++语言是一种计算机编程语言,利用它编写的程序并不能
直接在计算机上运行,而是要经过 、 和
C++ 语言设计
第二章 类和对象
第一章 C++的初步知识 第二章 类和对象 第三章 再论类和对象 第四章 运算符重载 第五章 继承与派生 第六章 多态性与虚函数 第七章 输入输出流 第八章 C++工具
ቤተ መጻሕፍቲ ባይዱ
C++
《面向对象程序设计》第二章教学
友元类
其他类可以访问该类的私有成员。
继承和派生的概念
1
继承
从现有类派生出新的类,子类继承父类的数据和方法。
2
多重继承
一个类可以从多个父类派生而来,拥有多个父类的特性。
3
派生
子类通过继承父类,可以扩展和修改父类的功能。
虚函数和多态性
多态性
同一种行为具有不同的表现形式,通过虚函数实 现运行时的多态性。
虚函数
允许子类重新定义和扩展父类的行为,实现动态 绑定。
运算符重载和类型转换
运算符重载பைடு நூலகம்
重新定义现有的运算符,使其适用于用户自定 义的数据类型。
类型转换
将一个类型的值转换为另一个类型的值,以适 应不同的需求。
《面向对象程序设计》第 二章教学
掌握面向对象编程的核心概念,包括类和对象、成员函数和数据成员,以及 构造函数和析构函数的重要性。
类和对象
理解类
通过抽象和封装数据和方法,类是面向对象编程 的基本组成单元。
创建对象
利用类的模板,实例化对象并为其分配内存,以 运行程序。
类和对象之间的关系
类是对象的蓝图,而对象是类的实际实例。
类的成员函数和数据成员
成员函数
类中的函数,用于操作和处理数据成员。
数据成员
类中的变量,用于存储对象的状态和属性。
类的构造函数和析构函数
1 构造函数
2 析构函数
在创建对象时调用,用于初始化对象的数 据成员。
当对象不再使用时调用,用于释放对象占 用的内存。
友元函数和友元类
友元函数
可以访问类的私有成员,但并不属于类的成员。
第6章面向对象程序设计
第6章面向对象程序设计第6章面向对象程序设计基础程序设计人员在进行面向对象的程序设计时,不再是单纯地从代码的第一行一直编到最后一行,而是考虑如何创建类和对象,利用对象来简化程序设计,并提高代码的可重用性。
6.1 面向对象编程概述面向对象的编程(object oriented programming, OOP)是编程的科学与艺术。
在20世纪70年代,为了提高程序员的编程效率和简化程序的结构,出现了面向过程编程。
但是,在面向过程编程的实践中,仍然存在许多问题,于是又逐渐演变发展到了OOP。
在面向过程的程序设计中,程序代码被分为模块和函数,并由它们组成“黑盒”。
这些黑盒用于隐藏信息以防止无用的或非授权的访问,而使程序员无须了解它们内部的复杂性。
在理论上,黑盒不应越出它的边界而修改不属于它管辖范围内的数据,也不应该将任何副作用引入程序。
不幸的是,在现实中很难做到这一点。
被引入系统的副作用在数目上通常随着程序的规模的扩大而成比例增大,程序越大,在代码中出现的错误也就越多。
面向过程的程序设计通常采用把现实问题转化为计算机语的办法来编写程序。
然而,面向对象编程则试图识别再现实世界中可能存在的对象,依此构造出相应的数据模型,展示对象间的相互关系,并编写相应的程序。
在面向对象编程中,对象是由叫做类的数据结构来定义的。
下面简单解释对象和类这两个概念。
1.对象(object)对象仅是类(class)的运行实例,它可以是任何具体事物。
例如现实生活中的计算机、电话机、电视等。
如在hello项目中创建的表单、标签和命令按钮,均为对象。
2.类(class)类是一种对象的归纳和抽象。
类就像是一张图纸或一个模具,所有对象均是由它派生出来的,它确定了由它生成的对象所具有的属性、事件和方法。
例如,电话就是一个类,它抽取了各种电话的共同特性,与此同时一个对象就是具体的一部电话。
又如在hello项目中,表单对象是表单类的实例,所以创建表单对象后。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
继承,指以原有的类为基础来创建一个新类,从而达到代码复用的 目的。 利用继承,可以来创建一个具有公共属性的类,然后根据需要创建 具有特有属性的新类以适用于不同的情况。如彩色电视与液晶电视的 关系。 Java语言只支持单继承,被继承的类称为父类,继承而来的类则称 Java语言只支持单继承,被继承的类称为父类,继承而来的类则称 为子类。 继承是在原有父类基础上添加程序代码建立新类,而这个新类既能 够运行自己定义的方法,也可以运行父类中定义的方法,从而复用代 码。
1)final标记的类不能被继承
final class Person { … } class Student extends Person //非法 { … } Student类不能在继承Person类
2)final标记的方法不能被子类重写
class Person { public String name; public int age; final public void getInfo() { } } class Student extends Person { public String name; public int age; public void getInfo() //非法 { } public void study() { } }
继承的实现
定义继承的形式为: [访问权限] class 类名 [extends 父类] 访问权限] 父类] { } 其中,“访问权限”指public、private,“extends” 其中,“访问权限”指public、private,“extends” 为继承关键字,后面跟父类名。 ……
1.子类对父类成员的继承 1.子类对父类成员的继承
2 最终类
• 最终类是指不能被继承的类,即不能再用最终类派生 子类。如果不希望某个类被继承,可以声明这个类为 最终类。最终类用关键字final来说明。例如: public final class C • 如果创建最终类似乎不必要,而又想保护类中的一些 方法不被覆盖,可以用关键字final来指明那些不能被 子类覆盖的方法,这些方法称为最终方法。例如: public class A { public final void M(); }
• 在子类中定义了与父类同名的变量,从而隐藏 了父类成员变量,这种隐藏变量可加super前 缀来访问。
class A{ int x = 100; } class B extends A{ int x = 200; void print(){ System.out.println("Subclass : " + x); System.out.println("Superclass : " super.x); } public static void main(String args[]){ (new B()).print(); } }
程序运行结果: Subclass : 200 Superclass : 100
+
方法覆盖
Java允许子类对父类的同名方法进行重定义,也就是子类中 Java允许子类对父类的同名方法进行重定义,也就是子类中 定义的方法与父类中已定义的方法名称相同,但方法的内容 不同,这种多态就称为方法覆盖。 举例:父类有骂人的习惯,子类继承父类后,更改父类的方 法,不再具有骂人的习惯。
多态性
1 抽象类
类中允许定义抽象方法。所谓抽象方法是指只有方 法的定义,没有方法的实现体的方法。用关键字 abstract来声明抽象方法。例如: abstract void run() • 包含抽象方法的类称为抽象类。换句话说,任何包 含抽象方法的类必须被声明为抽象类。例如: abstract class Runner 需要说明的是: •
3、类的成员覆盖
• 在类的继承中,若子类新增的成员名称与 父类成员相同,则称为成员覆盖 (overriding)。其目的是修改父类的属性 和行为。 • 若子类声明了与父类同名的变量,则父类 的变量被隐藏起来,直接使用的是子类的 变量,但父类的变量仍占据空间,可通过 super或父类名来访问。
类的成员覆盖
7.3.2 继承的实现 方法覆盖 继承的实现--方法覆盖
class FuGaiTest { public static void main(String[] args) { ZiLei zl = new ZiLei(); zl.maRen(); } }
பைடு நூலகம்
继承的实现—终止覆盖 继承的实现 终止覆盖
有时出于安全考虑,需要防止黑客用属于系统重 要信息的类来创建其子类,在子类中覆盖原有的类 的方法。 为保证父类方法不会被子类中定义的方法替代, 就要在方法之前使用“final”关键字来修饰该方 就要在方法之前使用“final”关键字来修饰该方 法。 举例:级上例添加一个final方法,演示终止覆盖。 举例:级上例添加一个final方法,演示终止覆盖。
2. 构造方法的调用
子类可以继承父类的非私有成员变量和方法,但 不能继承父类的构造方法,但可调用父类构造方法: 不能继承父类的构造方法,但可调用父类构造方法: (1)子类可以无条件地调用父类不含参数的构造方 法; (2)对于父类中包含有参数的构造方法,子类可以 通过在自己的构造方法中使用super关键字来引用, 通过在自己的构造方法中使用super关键字来引用, 而且必须是子类构造方法中的第一条语句。
super
• super引用。使用关键字super可以引用被子类隐藏的父类的成员变量或 或被子类重写的方法,这称为super引用。super引用的语句格式为: super.〈成员变量名〉 super.〈方法名〉 • 特别注意: (1)在子类构造方法中,使用super调用父类构造方法的语句必须为构 造方法中的第一个语句。 (2)当父类中没有构造方法或只有无参构造方法时,系统会为子类构 造方法自动加上super语句,相当于显示在构造方法中调用super()。 (3)子类构造方法的第一个语句是使用this关键字来调用本类的另一个 构造方法,那么,Java系统就不会默认该子类的构造方法隐含调用父 类的构造方法。
接口
• Java语言只支持单继承机制,不支持多继承。一般情况下,单 继承就可以解决大部分子类对父类的继承问题。但是,当问题 复杂时,若只使用单继承,可能会给设计带来许多麻烦。Java 语言解决这个问题的方法是使用接口 • 接口和抽象类非常相似,都是只定义了类中的方法,没有给出 方法的实现 • Java语言不仅规定一个子类只能直接继承自一个父类,同时允 许一个子类可以实现多个接口。由于接口和抽象类的功能类同, 因此,Java语言的多继承机制是借助于接口来实现的
3)final标记的变量
final标记的变量(成员变量和局部变量)即成为常量,只能赋值一次,赋值的位置: (a)初始化位置 (b)构造方法中 class Person { public final String x= "abc" ; public String name; public int age; public Person() { x= "abc" ; } public Person(String name,int age) { x= "abc" ; } … } 要在每一个构造方法中做相同的工作。
构造方法不能被声明为抽象的 abstract和static不能同时存在,即不能有abstract static方法
• •
抽象类不能直接用来定义对象。抽象类主要用于定 义为若干个功能类同的类的父类 抽象类的子类必须覆盖所有的抽象方法后才能被实 例化,否则这个子类还是抽象类
abstract class A { int x; int y; abstract int aa(int x,int y); void A() { x=0; y=0; } } class B extends A { int aa(int x,int y) { return x+y; } }
• 在进行覆盖时,应该注意以下三点: • 子类不能覆盖父类中声明为final或static 的 方法; • 子类必须覆盖父类中声明为abstract 的方法, 或者子类也声明为abstract; • 子类覆盖父类中同名方法时,子类方法声 明必须与父类被覆盖方法的声明一样。
覆盖和重载的区别
• 覆盖和重载的区别 • (1)方法的覆盖是子类和父类间的关系, 而方法的重载是同一类内部多个方法间的 关系。 • (2)方法的覆盖一般是两个方法间的,而 重载时可能有多个重载方法。 • (3)覆盖的方法有相同的方法名和形参表, 而重载的方法只能由相同的方法名,不能 有相同的形参表。
子类继承父类所有的非私有属性的成员变量和成员 方法,但不继承父类的构造函数,在子类的构造函 数中可以使用super()调用父类的构造函数。 。 举例:设计一个学生类,属性有姓名(name)、 举例:设计一个学生类,属性有姓名(name)、 年龄(age)、私房钱(money)。由学生类派生出 年龄(age)、私房钱(money)。由学生类派生出 本科生类Undergraduate和研究生类Graduate,本 本科生类Undergraduate和研究生类Graduate,本 科生类增加属性:专业(specialty),研究生类 科生类增加属性:专业(specialty),研究生类 增加属性:研究方向(studyDirection)。每个类 增加属性:研究方向(studyDirection)。每个类 都有相关数据的输出方法。
class Student {
//学生类 //学生类 //姓名 //姓名 //年龄 //年龄 //私房钱 //私房钱 //本科生类 //本科生类
public String name; public int age; private int money;
} class Undergraduate extends Student { } class Graduate extends Student { public String studyDirection; } //研究方向 //研究方向 //研究生类 //研究生类 public String specialty; //专业 //专业