面向对象 程序设计语言基础 马骏 majun@nju.edu.cn
面向对象程序设计
面向对象程序设计语言 支持面向对象程序设计思想的编程语言 simula 67,Smalltalk… C++,JAVA,C#,Python…
Machine Level Language Code 编译执行VS解释执行 效率高 平台相关 Machine Level Language Code Source Code Interpret Each Instruction Line by Line 效率低 平台无关 PASCAL,C/C++,C#... RUBY,MATLAB,JavaScript…
两者的结合 兼顾编译执行与解释执行的优点: 平台无关 “高效率”
Java的诞生和发展 前身 诞生 JDK版本 三个平台(JDK1.3开始) 1995-1997,JDK1.0-JDK1.1 1991年,Sun公司的Green项目,Oak,James Gosling 诞生 1994年,改名Java JDK版本 1995-1997,JDK1.0-JDK1.1 1998年,JDK1.2(JAVA2) 2010年,Sun公司被Oracle收购 Now,JDK 10 三个平台(JDK1.3开始) J2ME(嵌入式平台) J2SE(标准平台) J2EE(企业级平台)
Java语言的特点及优势 简单性和完全面向对象 平台无关性 有选择的继承了C++的语法规则和面向对象的基本机制 结构,指针,#define语句,多重继承,全局变量和函数,GOTO语句 ,操 作符重载 平台无关性 Java虚拟机:JVM “Write once,run anywhere”
JVM、JRE、 JDK Java虚拟机(java virtual machine , JVM) 一个应用程序,运行于实际的物理计算机之上 定义了指令集、寄存器集、栈、垃圾收集堆、内存区域等五个逻辑部分,提供了跨平台能力的基础框架 实现了统一的计算机,是java程序运行的平台 Java运行时环境(Java Runtime Environment,JRE) 运行、测试和传输应用程序的 Java 平台 包括 Java 虚拟机、Java 平台核心类和支持文件 不包含开发工具 — 编译器、调试器和其它工具 JDK即Java Develop Kit,Java开发工具包 包括: java类库 java编译器 java解释器 JRE java命令行工具
JVM、JRE、 JDK JDK与JRE的简单的区别: JDK可以编译java源文件;jre只能执 行class字节码,不能编译java源文件 JRE是JAVA运行环境,只能运行被编 译好的字节码文件而已,它没有编 译工具;而JDK含有开发程序所需的 调试、编译、运行的基本工具。例 如: javac.exe是包含在jdk中,jre中没有,只 是执行环境。 如果仅仅是为了运行Java程序,而不 是从事Java开发,可以直接下载JRE
JVM、JRE、 JDK
面向对象程序设计
HelloWorldApp.Java 类方法 程序入口 包名 定义类
Java的package 从逻辑概念看,包(package)是类 的集合,一个包中包含多个类 从存储概念看,包是类的组织方式 一个包对应一个文件夹,一个文件夹中 包含多个字节码文件; 包与类的关系,就像文件夹与文件的关 系 包中还可以再有子包,称为包等级,子 包对应一个子文件夹
Java的package 一个.java文件中可以定义多个class 但最外层class只能有一个申明为public 内部类 同一个.java文件中的所有类,经过编 译后分别生成对应的.class文件,处 于相应package所对应的文件夹中
类的定义(Java) 声明类 类声明 { 成员变量的声明; 成员方法的声明及实现; } [修饰符] class 类<泛型> [extends 父类] [implements 接口列 表] 例子 public class Date1 //类声明 int year, month, day; //声明成员变量 public abstract
类的定义(Java) 构造函数,创建对象时刻自动调用,完成初始化 一个类可以定义多个构造函数(具有不同的参数个数、参数类型…)
类的定义(C++) 构造函数,完成初始化 一个类可以定义多个构造函数(具有不同的参数个数、参数类型…) 析构函数, 对象销毁时自动调用;、参数类型…)
构造函数 没有返回值、函数名为类名的函数 用于初始化对象的各个成员 一个类可以定义多个构造函数(具有不同的参数个数、参数类型…) 如果不显式定义构造函数,系统会自动提供一个不带任何参数的默认构 造函数 一旦显式定义了一个构造函数,系统不再提供默认构造函数
类的定义(C++)
类的定义(C++)
创建实例(Java VS C++) Point p3; ?
对象的生命周期(Java) 所有对象均通过new 创建,无 需显示调用 delete Garbage Collection 静态对象:在第一次进行作用域时 被创建,在main退出后被销毁(若 程序不进入其作用域,则不会被创 建)。 局部对象:在进入作用域时被创 建,在退出作用域时被销毁。 所有对象均通过new 创建,无 需显示调用 delete
Java的析构函数 public void finalize() //析构方法 { 语句序列; } GC在进行垃圾收集的时候会自动调用对象的finalize方法,用来进行一些用户自定义的 非内存清理工作,因为垃圾收集器不会处理内存以外的东西。 GC以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时, 它才开始运行释放对象的内存。 可以调用System.gc() 方法建议垃圾回收器来释放这些对象的内存,但不是命令 除非垃圾回收器认为你的 应用程序需要额外的内存,否则它不会试图释放不再使用的 对象的内存 不像C++析构函数会自动调用父类析构函数
Java的析构函数
C++的析构函数 形如“~A()”的成员函数,A为 类名 对象销毁时,系统自动调用 用于释放对象所占有的各种资 源
Example-1
对象的生命周期(C++) 作用域由{}定义。 全局对象:在main开始前被创建,main退出后被销毁。 局部静态对象 静态成员对象 局部对象:在进入作用域时被创建,在退出作用域时被销毁。 new创建:的对象会一直存在,即使指向该对象的指针已被销毁,容 易造成内存泄漏。(对象会一直存在直到程序退出时才会销毁,但不 是“优雅”地销毁) 需要显式调用delete并释放对象所占有的其他资源(析构函数)
对象的生命周期(C++) 静态成员对象 局部静态对象 局部对象 全局对象
成员函数的声明和定义