OOP with Java Yuanbin Wu cs@ecnu
OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票
复习 创建对象 构造函数 函数重载 : 函数 = 函数名 + 参数列表 public class MyType { int i; double d; char c; void set(double x) { d = x; double get() { return d; MyType(double x) { set(x); ; MyType() { System.out.println( mytype create ); ; public static void main(string [ ]args) { MyType m = new MyType(); MyType n = new MyType(2.0); public class Printer { void print(int x) { System.out.println( print an integer: + x); void print(mytype m) { System.out.println( print a MyType: + m.get());
复习 this 关键字 在类的非静态方法中, 返回调用该方法的对象的引用 销毁对象 public class MyType { int i; double d; char c; void set(double x) { this.d = x; double get() { return d; public static void main(string [ ]args) { MyType m = new MyType(); m.set(1); 垃圾回收不等于销毁对象 仅回收 new 创建的内存 是否回收, 何时回收由 Java 虚拟机控制.
OOP with Java Java 包 访问控制 封装
Java 包 程序代码的组织方式 表达式 a+b, x = 1, 语句 int a = 1, b = 2; 控制结构 If-else, loops 方法 ( 函数 ) 类 程序库 ( 多个类 ) 包
Java 包 包 (package) 由多个类组成 这些类共享同一个名字空间 (namespace)
Java 包 例子 :java.util 包的名字 : java.util 包含 java 提供的常用工具 java.util.linkedlist java.util.date java.util.random.
Java 包 使用包 直接使用 import 语句 import java.util.linkedlist; import java.util.date; import java.util.random; import java.util.*;
Java 包 创建包 package 语句.java 文件首行 创建文件目录结构 一致 : 包的名称与文件目录结构 Let try
Java 包 package mypackage; public class MyType { int i; double d; char c; public void set(double x) { d = x; public double get() { return d; public MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; public static void main(string []args){ MyType m = new MyType(1, 1.0, 'a'); System.out.println(m.get()); javac mypackage/mytype.java java mypackage/mytype java mypackage.mytype
Java 包 包结构与目录结构 将 java 文件放入不同的子目录中 Let s try restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class - Table.class import restaurant.people.cook; import restaurant.tools.fork; import restaurant.tools.*; import restaurant.*;
Java 包 使用包 classpath javac, java 的参数 (-cp), CLASSPATH 环境变量 指定使用包的位置 Let s try
Java 包 类共享同一个名字空间 (namespace) 同一个包中, 类的名字不能相同 不同包中, 类的名字可以相同 包结构 = 目录结构 例如 restaurant/ - people/ - Cook.class - Waiter.class - A.class - tools/ - Fork.class - Table.class - A.class import restaurant.people.a; import restaurant.tools.a; import restaurant.*;
Java 包 jar 包 打包 包 (packed package) 将包 ( 目录 ) 变成文件 方便发布, 使用 c: create f: output to fle jar cf restaurant.jar restaurant
访问控制 访问控制 类 : 数据 + 方法 公开的数据和方法 提供服务 所有用户都可以使用 需要保持稳定, 不经常变化 隐藏的数据和方法 细节的, 辅助性的方法和数据 不向用户公开 易变
访问控制 例子 public class Refrigerator{ Refrigerator() { open() { close() { put() { get() { enginestart() { enginesleep() { lighton() { lightof() {
访问控制 访问控制 控制类的数据 / 方法 : 是否能被访问? 能被哪些用户访问 package access public private protected
访问控制 package access 一个类的成员被标识为 package access 同一个包中的类可以访问 其他包中的类不能访问 没有标识符
访问控制 package access 例子 package mypackage; public class MyType { int i; double d; char c; void set(double x) { d = x; double get() { return d; MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; package mypackage; public class AnotherType { public static void main(string [ ]args){ MyType m = new MyType(1, 1.0, a ); int i = m.i; double d = m.d; char c = m.c; m.set(2); System.out.println(m.get());
访问控制 package access 默认包 (Default Package) //package mypackage; public class MyType { int i; double d; char c; void set(double x) { d = x; double get() { return d; MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; //package mypackage; public class AnotherType { public static void main(string [ ]args){ MyType m = new MyType(1, 1.0, a ); int i = m.i; double d = m.d; char c = m.c; m.set(2); System.out.println(m.get());
访问控制 package access 默认包 (default package) 如果没有 package 语句, java 默认当前目录中的 java 文件属于同一个包
访问控制 public 类的成员标识为 public, 则所有用户都能访问该成员 package mypackage; public class MyType { public int i; public double d; public char c; public void set(double x) { d = x; public double get() { return d; public MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; import mypackage.mytype; public class AnotherType { public static void main(string [ ]args){ MyType m = new MyType(1, 1.0, a ); int i = m.i; double d = m.d; char c = m.c; m.set(2); System.out.println(m.get());
访问控制 public package mypackage; public class MyType { int i; double d; char c; void set(double x) { d = x; double get() { return d; public MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; import mypackage.mytype; public class AnotherType { public static void main(string [ ]args){ MyType m = new MyType(1, 1.0, a ); int i = m.i; double d = m.d; char c = m.c; m.set(2); System.out.println(m.get());
访问控制 private 类的成员被标识为 private, 则除了该类自身外, 任何类不能访问改成员
访问控制 private package mypackage; public class MyType { private int i; private double d; private char c; private void set(double x) { d = x; private double get() { return d; public MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; public static void main(string []args){ MyType m = new MyType(1, 1.0, 'a'); m.i = 2; System.out.println(m.get()); import mypackage.mytype; public class AnotherType { public static void main(string [ ]args){ MyType m = new MyType(1, 1.0, a ); int i = m.i; double d = m.d; char c = m.c; m.set(2); System.out.println(m.get()); Access Denied!
访问控制 private 同一类的不同对象 class B { private int i; public B(int k) {i = k; public class A{ private int i; public A(int k) {i=k; public static void main(string args[]){ A a1 = new A(10); A a2 = new A(11); B b1 = new B(10); B b2 = new B(11); System.out.println(a1.i+a2.i); System.out.println(b1.i+b2.i);
访问控制 private 构造函数 无法创建该类的对象 package mypackage; public class MyType { private int i; private double d; private char c; private void set(double x) { d = x; private double get() { return d; private MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; public static void main(string []args){ MyType m = new MyType(1, 1.0, 'a');
访问控制 private 构造函数 : 统计该类有多少对象 package mypackage; public class MyType { private int i; private double d; private char c; private void set(double x) { d = x; private double get() { return d; private MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; public static int count = 0; public static MyType makemytype(int i1, double d1, char c1){ count++; return new MyType(i1, d1, c1); import mypackage.mytype; public class AnotherType { public static void main(string [ ]args){ //MyType m = new MyType(1, 1.0, a ); MyType m = MyType.makeMyType(1, 1.0, a ); MyType n = MyType.makeMyType(1, 1.0, a ); System.out.println(MyType.count);
访问控制 private 构造函数 : 该类只有一个对象 package mypackage; public class MyType { private int i; private double d; private char c; public void set(double x) { d = x; public double get() { return d; private MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; private static MyType instance= null; public static MyType getinstance(){ If (instance == null) Instance = new MyType(1, 1.0, a ); return instance; import mypackage.mytype; public class AnotherType { public static void main(string [ ]args){ MyType m = MyType.getInstance(); m.set(2); MyType n = MyType.getInstance(); System.out.println(n.get()); 单件模式 (Singleton) 设计模式
访问控制 protected 继承 Shape draw(); erase(); move(); getcolor(); setcolor(); class Shape { private int width; private int hieght; protected int data; public void draw() { public void earse() { public void move() {. class Triangle extend Shape{ public void flipvertical() { data public void fliphorizontal() { data Triangle Circle Square flipvertical(); fliphorizontal(); draw();
访问控制 类成员的访问控制 package access, private, public protected 类的访问控制 package access, public
访问控制 public class 每个.java 文件包含一个 public class 该 class 的名字等于.java 文件名 package access class 每个.java 文件中除去 public class 外, 其他的 class 为 package access
访问控制 package mypackage; public class MyType { int i; double d; char c; public void set(double x) { d = x; public double get() { return d; public MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; class PAClass{ public PAClass() { System.out.println( PA class ); package mypackage; public class AnotherType { public static void main(string [ ]args){ MyType m = new MyType(1, 1.0, 'a'); PAType p = new PAType();
MyType Revisited 访问控制 package mypackage; public class MyType { private int i; private double d; private char c; public void set(double x) { d = x; public double get() { return d; public MyType(int i1, double d1, char c1){ i = i1; d = d1; c = c1; public static void main(string []args){ MyType m = new MyType(1, 1.0, 'a'); System.out.println(m.get());
封装 封装 (Encapsulation) 访问控制的设计 Public 提供服务, 稳定 修改 public 成员将影响用户程序 Private 提供辅助, 易变 修改 private 成员是安全的 Separate things that change from things that stay the same.
封装 封装 (Encapsulation) 在满足需求的情况下, 接口尽量简单 在可能的情况下尽量使用 private
封装 C 语言的封装 Header fle static and extern