Download presentation
Presentation is loading. Please wait.
1
1 Department of Computing
2
上讲回顾 类的编写方法 对象的创建方法 成员变量的初始化 类名 对象名=new 类名() 定义变量时初始化
class 类名{ 属性 行为 } 对象的创建方法 类名 对象名=new 类名() 成员变量的初始化 定义变量时初始化 构造方法初始化,构造方法的方法名与类名相同 2 Department of Computing
3
实例化一个教师,并对其初始化(构造方法) 输出该教师的自我介绍
上讲课堂练习 编写一个类,代表教师,要求: 具有(私有)属性:姓名、年龄 具有行为:自我介绍 编写一个测试类,要求: 实例化一个教师,并对其初始化(构造方法) 输出该教师的自我介绍 3 Department of Computing
4
上讲课堂练习(续) class Teacher{ private String name; private int age;
Teacher(String n,int a){ name=n; age=a; } String introduction() { return "大家好!我是" + name + ",我今年"+ age+"岁"; public class TeacherTest { public static void main(String[ ] args) { Teacher teacher = new Teacher("李芳",20); System.out.println(teacher.introduction()); 4 Department of Computing
5
编程题 定义狗类,属性有名字、颜色和体重。 class Dog{ String name; String color;
int weight; void info(){ System.out.print("我的名字叫"+name+",毛发是"+color+",我有"+weight+"斤"); } } Dog(String n,String c,int w){ //构造方法 name=n; color=c; weight=w; } public class Dog1 { public static void main(String[] args) { Doggg d1=new Doggg("阿黄","黄色",30); Dog d2=new Dog("石头","白色",10); d1.info(); d1.bark(); d2.info(); d2.bark(); } void bark(){ System.out.println("汪汪汪汪"); } 5 Department of Computing
6
第4讲 使用类和对象编程(2) 6 Department of Computing
7
本讲内容和教学目标 本讲内容: 静态变量和实例变量 静态方法和实例方法 this的用法 封装 包的创建和应用 教学目标:
理解静态变量和实例变量区别 理解静态方法和实例方法区别 掌握this的用法 掌握包的创建和应用方法 7 Department of Computing
8
静态和实例变量的区别 引例 运行结果:对象创建之前staticVar=0 创建第一个对象staticVar=1,instanceVar=1
public class Test { public static int staticVar = 0; public int instanceVar = 0; public Test(){ staticVar++; instanceVar++; } public static void main(String args[]){ System.out.println("对象创建之前 staticVar="+Test.staticVar); Test t=new Test(); System.out.println("创建第一个对象 staticVar="+t.staticVar+",instanceVar="+t.instanceVar); Test t1=new Test(); System.out.println("创建第二个对象 staticVar="+t1.staticVar+",instanceVar="+t1.instanceVar); }} 运行结果:对象创建之前staticVar=0 创建第一个对象staticVar=1,instanceVar=1 创建第二个对象staticVar=2,instanceVar=1 思考:staticVar 与instanceVar 的区别? 8 Department of Computing
9
实例变量和静态变量的区别 类有用关键字static修饰的成员变量称为静态变量,而没有用关键字static修饰的成员变量称为实例变量。主要区别为: ① 在内存分配的空间上。不同对象的同名实例变量之间的取值互不影响;不同对象的同名静态变量分配相同的内存空间,也就是说多个对象共享静态变量。 ② 在内存分配的时间上。当类的字节码文件被加载到内存时,静态变量就分配了相应的内存空间;实例变量是当类的对象创建时才会被分配内存。 ③ 访问方式不同。实例变量必须用对象名访问;静态变量可以用类名访问,也可以用对象名访问。 9 Department of Computing
10
成员变量实例 例3.3 编写一个矩形类,用静态变量统计所创建的矩形对象的个数。文件名Jpro3_3.java
public class Jpro3_3 { public static void main(String args[]) System.out.println(“当前矩形对象的个数 为:"+Rectangle.number); Rectangle r1=new Rectangle(1.0f,2.0f); System.out.println("当前矩形对象的个数为:"+r1.number); Rectangle r2=new Rectangle(2.0f,2.5f); System.out.println("当前矩形对象的个数为:"+r2.number); System.out.println("当前矩形对象的个数为:"+Rectangle.number); } class Rectangle { private float length; private float width; static int number=0; Rectangle(float l, float w) length=l; width=w; number++; } 10 Department of Computing
11
(1)变量所包含的对象体积较大,占用内存较多。 (2)变量所包含的对象生命周期较长。 (3)该类的对象实例有对该变量所包含的对象的共享需求。
静态变量适用范围 (1)变量所包含的对象体积较大,占用内存较多。 (2)变量所包含的对象生命周期较长。 (3)该类的对象实例有对该变量所包含的对象的共享需求。 11 Department of Computing
12
思考:staticOutPut与outPut的区别?
静态和实例方法区别 引例 public class Test2 { static String staticstr = "静态的变量"; String str = "非静态的变量"; public static void staticOutPut(){ System.out.println("静态方法"); } public void outPut(){ System.out.println("非静态的方法"); public static void main(String[] args) { Test2.staticOutPut(); Test2 test = new Test2(); test.outPut(); 思考:staticOutPut与outPut的区别? 12 Department of Computing
13
实例 例3.5 定义静态方法访问静态变量 问题:静态方法中可以访问实例变量吗? public class Jpro3_5
{ public static void main(String args[]) Rectangle.print(); Rectangle r1=new Rectangle(1.0f,2.0f); Rectangle r2=new Rectangle(2.0f,2.5f); r1.print(); } class Rectangle { private float length; private float width; private static int number; Rectangle(float l, float w) length=l; width=w; number++; } public static void print() System.out.println("当前矩形对象的个数为:"+number); 问题:静态方法中可以访问实例变量吗? 13 Department of Computing
14
静态方法和实例方法的区别 类中用关键字static修饰的成员方法称为静态方法,否则为实例方法。主要区别为:
① 在内存分配的时间上。当类的字节码文件被加载到内存时,静态方法就分配了相应的入口地址;实例方法是当类的对象创建时才会被分配入口地址。 ② 访问方式不同。实例方法必须用对象名访问;静态方法一般用类名访问,也可用对象名访问。 ③ 操作的对象不同。静态方法只能操作静态变量,不能操作实例变量;而实例方法既可操作静态变量也可操作实例变量。 ④ 调用方法不同。实例方法中可以调用实例方法和静态方法,而静态方法中只能调用静态方法,不能调用实例方法。 14 Department of Computing
15
改错题 public class ComputeAverageValue { double chinese=85.5;
public static void main(String args[]) int math=90,english=88; double total=chinese+math+english; double average=(chinese+math+english)/3; System.out.println("average="+ average); } 找出程序中的错误 15 Department of Computing
16
关键字this 1.使用this区分成员变量和局部变量 class Rectangle { private double length;
private double width; Rectangle(double length,double width) { this.length= length; //成员变量被隐藏 this.width=width; } public class Jpro3_5_0 { public static void main(String args[]) Rectangle r1=new Rectangle(1.0f,2.0f); Rectangle r2=new Rectangle(2.0f,2.5f); } 16 Department of Computing
17
关键字this 2.用this调用本类中的其他构造方法 class Rectangle{ private float length;
private float width; public Rectangle() { this(5.5f,3.5f); //调用了带参构造方法 } public Rectangle(float length, float width) this.length=length; this.width=width; public class Jpro3_5_ { public static void main(String args[]) { Rectangle r1=new Rectangle(); } 17 Department of Computing
18
包的含义和作用 包(package)是Java提供的类的组织方式。 包的组织方式和表现方式与Windows中的文件和文件夹完全相同。
包=文件夹 类=文件 一个包中可以放置许多类文件和子包。 包的作用 Java语言可以把类文件存放在不同层次的包中,其目的是方便软件的维护、资源的重用和防止类的重名。 Java语言规定:同一个包中的文件名必须唯一,不同包中的文件名可以相同。 18 Department of Computing
19
包的创建和应用 1.创建包 定义包语句的格式为:package <包名>;
如:package china.anhui.hefei; 2. 使用包 import语句的使用分两种情况: ① 导入某个包中的所有类,如: import mypackage.*; ② 导入某个包中的一个类,如: import mypackage.Student; 注意:当用方式①导入类时,如包中还有子包,则子包中的类不会被导入。 19 Department of Computing
20
生活中的事例 电视机、遥控机、电路板、生产线上工作人员照片 把复杂的事情包起来,让其完整
21
启示: 1.信息隐藏 2.以完整形式呈现出来 3.信息保护 隐藏实现细节,用户不可见 类似由两种或多种化学药品组成一个胶囊
将方法和属性一起包装到一个单元中,单元以类的形式实现 3.信息保护 举例,电视 胶囊 类,把属性方法集成在一起
22
封装 封装的概念 封装的优点 封装的实现 访问权限的设定 封装的应用 小结
23
什么是封装?
24
封装 电路板 电视机背面接口 抽象,把共同的特征拿出来,把关心的项拿出来。是从实到虚的过程。面向对象会把对数据和对数据的操作放在一起。
定义 封装:将对象的属性和行为组合成一个独立的单位或部件,并尽可能隐蔽对象内部细节,只保留必要的对外接口,使之与外部发生联系。 抽象,把共同的特征拿出来,把关心的项拿出来。是从实到虚的过程。面向对象会把对数据和对数据的操作放在一起。 学生类:姓名、学号、班级 汽车类:品牌、轮子、速度、油耗 电路板 电视机背面接口
25
电话号码 电子邮箱 产品种类 备件库存 查询产品价格 配件的制造方法 计算备件的制造成本
机械制造厂 电话号码 电子邮箱 产品种类 备件库存 查询产品价格 配件的制造方法 计算备件的制造成本
26
电话号码 电子邮箱 产品种类 备件库存 查询产品价格 配件的制造方法 计算备件的制造成本
机械制造厂 电话号码 电子邮箱 产品种类 备件库存 查询产品价格 配件的制造方法 计算备件的制造成本 查询库存 查询库存
27
软件包 把多个类收集在一起成为一组,称作软件包。 软件包也是一种类库的封装机制。 用包来有序组织类和接口。
软件包对应着文件系统的目录层次结构。 如2万首MP3歌曲,分为爱情歌曲、外国歌曲 包把类封装起来
28
封装的好处 有哪些呢?
29
封装的优点 电话号码 电子邮箱 产品种类 备件库存 查询产品价格 配件的制造方法 计算备件的制造成本 隐藏类的细节 能够保护隐私 机械制造厂
方便加入控制语句 类的可重用性高 查询产品价格 配件的制造方法 计算备件的制造成本 以自己为例,手机号码是对外的,家庭财产为隐私 胶囊 教室里放着大家的考试成绩,如为隐私属性,必须是本班同学成绩,不给其他班级查询;或只给姓王的查询,不给姓李的查询 查询库存
30
如何实现封装?
31
创建“库存查询方法”用于对备件库存的读取
封装的步骤 将“备件库存”设为私有 修改属性的可见性 创建“库存查询方法”用于对备件库存的读取 创建访问属性的方法 在访问属性的方法中加入控制语句 对“备件库存量”的访问控制进行细化
32
如何定义类中属性和方法的访问权限呢?
33
生活中的事例 公共:面向所有人,电话号码、电子邮箱、产品种类 单位内部:面向本单位的所有人,内部电话、轮班表
部门内部:面向部分人,备件库存、备件的制造成本 隐私:面向极少的人,专利配方参数、生产工艺、设计图纸
34
对应关系 公共 public 单位内部 protected 部门内部 default 隐私 private
35
public pretected default private public 可以被本类和其他任何类的方法访问 pretected
可以被子类和相同软件包中的类访问 default default 允许同一软件包中的类和本类访问 Public 全部公开 private private 只允许本类中的方法访问
36
public:公共的 pretected: default: default: 可以理解为一个人的外貌特征,是谁都能看到的。
对于家族内部是非隐私的,对于外界确是隐私的。 default: 在自己家庭中不是秘密,对于其他人来说就算是隐私了(只能在本包中能看到,挎包就没办法看到了。 default: 完全的隐私,除了自己别人都不能知道的。
37
√ √ √ √ √ √ √ √ √ √ 修饰符 类成员修饰符 同一个类 同一个包 不同包的子类 不同包非子类 private default
protected public 同一个类 同一个包 不同包的子类 不同包非子类 √ √ √ √ √ √ √ 请同学回答 √ √ √
38
如何在实践中应用呢?
39
问题提出: 机械制造厂 电话号码 电子邮箱 产品种类 备件库存 如何访问? 查询产品价格 配件的制造方法 计算备件的制造成本 查询库存
40
解决的过程: 如何访问? 电话号码 电子邮箱 产品种类 备件库存 查询产品价格 配件的制造方法 计算备件的制造成本 机械制造厂
通过公有方法来访问类中的私有属性 查询库存
41
解决的过程: 定义工厂类的属性和方法 设置各个属性和方法的访问权限 定义某个私有属性的访问方法 实例化工厂类的一个对象
根据访问权限访问所需属性
42
解决的过程: 定义工厂 定义公有属性电话号码 机械制造厂 定义公有属性电子邮箱 电话号码 定义公有属性产品种类 电子邮箱
定义私有属性备件库存 定义公有属性查询产品价格 定义私有属性配件的制造方法 定义私有属性计算备件的制造成本 定义公有属性查询库存 机械制造厂 电话号码 电子邮箱 产品种类 备件库存 查询产品价格 配件的制造方法 计算备件的制造成本 查询库存
43
定义工厂 public class factory{ public String teleNo; 定义公有属性电话号码
public String ; public String category private int storage; private void prouce() { …… }; private void queryCost(){ pubic void queryStorage() { public void queryPrice(); { 定义工厂 定义公有属性电话号码 定义公有属性电子邮箱 定义公有属性产品种类 定义私有属性备件库存 定义私有属性配件的制造方法 定义私有属性计算备件的制造成本 定义公有属性查询库存 定义公有属性查询产品价格 public String teleNo; public String ; public String category; private int storage; private void prouce(); private void queryCost(); Pubic void queryStorage(); Public void queryPrice();
44
√ √ 程序验证: ╳ 验证一 验证二 验证三 本类其他方法对私有属性的访问。 其他类对本类私有属性的访问。
其他类通过本类公开方法对本类私有属性的访问。 √
45
案例 public class Dog { private String name; void setName(String n){
name=n; } String getName(){ return name; void info(){ System.out.println("汪汪"); import s0514.Dog; public class DogTest { public static void main(String[] args) { Dog d1=new Dog(); d1.setName("阿黄"); System.out.println(d1.getName()); } 45 Department of Computing
46
封装 封装就是把对象的属性、方法结合成为一个独立的系统单位,并尽可能的隐藏对象的内部细节。
由private修饰的成员变量只能被本类访问。用private修饰成员变量可以实现数据隐藏(封装)机制. 售报亭 属 性 方法 报刊A 报刊B … 钱箱 报刊零售 款货清点 顾 客 公有数据 数据 私有数据 方法 方法 对象A 对象B 修改Jpro3_1.java 46 Department of Computing
47
封装举例 public class Jpro3_1_3 { class Rectangle
public static void main(String args[]) Rectangle r1=new Rectangle(); r1.setLength(5.5f); r1.width=3.5f; float len= r1.getLength(); System.out.println("修改后的length为:"+len); } class Rectangle { private float length=1.1f; float width; double perimeter() return 2*(length+width);} double area() return length*width; } void setLength(float l){ length=l; } float getLength(){ return length; 47 Department of Computing
48
自定义包应用实例 例3.9 修改例3.2,将Point类放到point包中,并用文件名Point.java保存;将Circle类放到circle包中,并用文件名Circle.java保存;将Jpro3_2类用文件名Jpro3_9.java保存。修改后的程序如Jpro3_9.java 48 Department of Computing
49
本讲小结 实例变量和静态变量 实例方法和静态方法 this的用法 包的创建和应用 49 Department of Computing
50
课堂练习 设计并实现一个Person类,能够显示人的姓名和年龄,该类中包括有两个私有属性,姓名(name)和年龄(age)。定义构造方法,用来初始化数据成员。再定义Display方法,用于打印姓名和年龄。 创建一个名称为StaticDemo的类,并声明一个静态变量和一个普通变量。对变量分别赋予10和5的初始值。在main()方法中输出变量值。 50 Department of Computing
Similar presentations