




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
旅游信息学院 JAVA语言程序设计 软件技术教研室JAVA语言程序设计JAVA程序设计讲义模块三-类和对象一、教学章节 模块三 类和对象二、教学知识点1:类2:对象3:封装4:对象与类之间的关系5:定义和使用类的方法6:变量的作用域三、教学目的和要求 任务一:理解类的概念、掌握类的创建任务二:理解对象的概念、掌握对象的创建任务三:理解对象和类之间的关系任务四:掌握变量的作用域任务五:掌握this关键字和static关键字任务六:掌握封装的特性,掌握封装的使用四、主要仪器设备1、笔记本电脑及相应的Windows Operating Systems.2、已安装的JDK7.0和jcreator或MyEclipse软件。五、教学内容任务一:理解类的概念、掌握类的创建1:面向对象的三大特征 (1)封装(Encapsulation) 对外部看不见 (2)继承(Inheritance) 扩展类的功能 (3)多态(Polymorphism) 方法的重载 方法的多态性 封装:对外部不可见。保护类中的操作不被外部直接访问。 继承:你老子有100000000000000000000000000000000,之后将这些资金留给你。 20000000000000000000000或者10000000000000000000000 多态:之前学习的方法重载:不同的方法名称根据传入的参数类型或个数不同调用的方法也不同多态是在整个java中最重要的概念,而且一个好的面向对象设计中肯定要大量的使用多态性 实际上最早的面向对象语言是有smalltalk提出的,实际上java只是实现了所有面向对象语言所应该具备的各个功能,当然现在的面向对象的语言也不例外。 2:类的基本概念 类和对象是面向对象中两个最重要的概念: 类:类是一组具有相同特性(属性)与行为(方法)的事务集合。 对象:对象就是一个个性的体现。 日常生活中把众多事物进行归纳、划分,然后分类是人类在认识客观世界时经常采用的思维方法。换句话说“类”是从日常生活中抽象出来的具有共同特征的实体。因此我们把具有相同特征及相同行为的一组对象称为类(Class of Object),使用第一个英文单词Class作为描述类的Java关键字,Java语言中类是为了描述具体对象而存在的。例如:张三同学是一个对象,李四同学也是一个对象,并且全班的同学都有学号、姓名、出生年月、家庭住址,具有上课、做作业、休息等行为。从整个班级所有的对象中抽象出共同特征和行为就可以形成我们常说的“学生”类,此时,学生就是一个类。 3:类与对象的关系类表示一个共性的产物,是一个综合的特征,而对象,是一个个性的产物,是一个个体的特征。例如,“学生”是一个类,它可以表示班级中所有的学生;而“张三”、“李四” 则是实际存在的单个对象,或者说它们是“学生”这个类的一个个实例。在 Java 中,我们可以定义类,然后创建类的对象。 4:类的定义类是一个独立的单位,它有一个类名,其内部包括成员变量,用于描述属性;还包括类的成员方法,用于描述行为。因此,类也被认为是一种抽象数据类型,这种数据类型不但包括数据,还包括方法。类定义的格式: public class 类名 /定义属性部分 属性1的类型 属性1; 属性2的类型 属性2; 属性n的类型 属性n; /定义方法部分 方法1; 方法2; 方法m; 注解:1. 修饰符。修饰类的修饰符有public、abstract和final,这些修饰符将在后面的任务中介绍。包含main方法的主类必须定义为public。2. class关键字。class为Java定义类的关键字,必须写在修饰符和类名中间,使用空格隔开,并且不能改变任何一个字符的大小写,如:Class是错误的。3. 类名。类的名字要符合Java的命名规范,同时名字要有意义能够反映出这个类的内容,第一个字母一般为大写。5:定义类的基本步骤:(1) 定义类名。编写类的最外层框架public class 类名 程序体;(2) 编写类的属性属性即该类所具有的特征(3) 编写类的方法。类的方法描述类所具有的行为,是类的方法成员。 案例演示:用Java类的定义描述人类public class Person/定义属性 String name; /姓名 int age; /年龄 /定义方法 public void hello() System.out.println(“喂,你好,我的名字叫”+name+”,今年”+age+”岁!”);任务二:理解对象的概念、掌握对象的创建 1:对象:对象就是一个个性的体现 Java中使用new关键字来创建类的一个对象。它有两种方式完成。第一种方式:类名 对象名称=null;对象名称=new 类名();第二种方式:类名 对象名称=new 类名();2:方法的定义和访问类的每个方法定义一个功能,定义了类的对象之后就可以调用这些方法了。方法的定义方法的定义共有4个部分,具体为 方法的名称 方法的返回值的数据类型 参数列表 方法的主体定义方法的两个步骤: 定义方法名、参数以及返回值的数据类型 编写方法体定义类的方法时要注意一下几点有一对花括号括起来的语句是方法的主体,它包含一段程序代码,执行时完成一定的功能。方法名主要是在调用此方法时使用,其命名方法应遵守标识符命名的规则。方法就像“黑匣子”,完成一个功能。并且在执行后可能返回一个结果。如果没有结果返回,则使用void进行限制,如果有返回值,则必须使用return返回。属性和方法的调用访问属性:对象名称.属性名;访问方法:对象名称.方法名();案例演示:class Person/定义属性 String name; /姓名 int age; /年龄 /定义方法 public void hello() System.out.println(“喂,你好,我的名字叫”+name+”,今年”+age+”岁!”); public class TestPersonpublic static void main(String args) Person person=new Person(); =李丽; person.age=18; person.hello(); 案例演示: class AutoLionString color=黄色;public void run()System.out.println(正在以0.1/ 秒的速度向前奔跑!);public String bark()String sound=吼;return sound;public String getColor()return color;public String showLion()return 这是一个+getColor()+的玩具狮子!;public class TestLion public static void main(String args) AutoLion lion=new AutoLion();System.out.println(lion.showLion();lion.run();System.out.println(lion.bark(); 3:内存划分(1)new关键字深入 new关键字表示创建一个对象 new关键字表示实例化对象 new关键字表示申请内存空间 注意:如果使用一个没有申请内存空间的对象,会报空指针异常: Java.lang.NullPointerException (2)对象在内存中的结构 使用new关键字创建一个对象的时候,系统会在一个叫堆内存和一个叫栈内存的地方申请空间,如下图所示: 因为声明了两个对象,所以在栈内存中开辟两个空间,保存两个对象,之后此两个对象分别实例化,只要一出现关键字new就表示要开辟新的内存空间。 那么这两个对象之间就不会互相影响到了。(4) 在内存中创建多个对象(5) 引用传递在对象的操作中实际上是存在引用传递的。所谓的引用传递,就是将一个堆内存空间的使用权交个其他的对象,就相当于为一个堆内存空间起了一个别名。class PersonString name;/ 表示人的姓名int age ;/ 表示人的年龄public void tell()/ 定义说话的方法System.out.println(姓名: + name + ,年龄: + age) ;public class Demo06public static void main(String args)Person per1 = null ;/ 声明对象Person per2 = null ;/ 声明对象per1 = new Person() ;/ 实例化对象per2 = per1 ;/ 引用传递 = 张三 ;/ 为名字赋值per1.age = 30 ;/ 为年龄赋值per2.age = 33 ;per1.tell() ;/ 调用方法per2.tell() ;该程序内存的分配过程如下:从本程序中应该得到总结:一个栈内存只能引用一个堆内存空间。但是一个堆内存中可以被多个栈内存所同时指向。在JAVA中不用的内存空间就称为垃圾空间,垃圾空间要等待垃圾收集机制进行空间的释放,垃圾收集机制称为GC。4:构造方法构造方法:是指在创建给定类的实例时调用的一个方法,在每个中都存在一个构造方法,它的主要目的是为类中的成员变量进行初始化。在创建类的对象时,将自动调用该类的构造方法,可以将值传递给构造方法。因此构造方法可通过初始化成员变量和创建对象的环境来初始化对象。(1) 构造方法的分类无参构造方法有参构造方法(2)构造方法的特点:构造方法的名字与类名完全相同。没有返回值数据类型,也不能用void修饰。一个类可以有不同参数列表的构造方法,即构造方法可以重载。如果程序员在程序中未定义构造方法,则系统在编译该程序时自动提供默认的无参构造方法。 如果程序员定义了一个或多个有参构造方法,而没有定义无参构造方法,则系统将自动屏蔽默认的无参构造方法。构造方法不能说明为native、abstract、synchronized或final,也不能从父类继承构造方法。案例演示:class Personprivate String name;/ 表示人的姓名private int age ;/ 表示人的年龄public Person()/ 定义了一个构造方法System.out.println(*) ;public void tell()/ 定义说话的方法System.out.println(姓名: + this.getName() + ,年龄: + this.getAge() ;public void setName(String n)name = n ;public void setAge(int a)if(a=0&a=0&a=0&a + per.getAge() ; 结果显示为: 张三 - 30 但是总觉的 public Person(String n,int a)this.setName(n);this.setAge(a); 这段代码比较别扭,如果是其他人在没有看源码的前提下可能无法知道该程序的具体功能是干什么的。 案例演示(修改代码)class Personprivate String name ;private int age;public Person(String name,int age)name = name ;age = age ;public void setName(String n)name = n ;public void setAge(int a)age = a ;public String getName()return name ;public int getAge()return age ;public class ThisDemo01public static void main(String args)Person per = new Person(张三,30) ;System.out.println(per.getName() + - + per.getAge() ; 程序运行后的结果为: null - 0很明显这个结构没有达到我们的要求。案例演示:如果把代码改为:class Personprivate String name ;private int age;public Person(String name,int age) = name ;this.age = age ;public void setName(String n)name = n ;public void setAge(int a)age = a ;public String getName()return name ;public int getAge()return age ;public class ThisDemo01public static void main(String args)Person per = new Person(张三,30) ;System.out.println(per.getName() + - + per.getAge() ;结果显示:张三 - 30案例演示(进一步优化代码)class Personprivate String name ;private int age;public Person(String name,int age) = name ;this.age = age ;public void setName(String name) = name ;public void setAge(int age)this.age = age ;public String getName()return ;public int getAge()return this.age ;public class Demopublic static void main(String args)Person per = new Person(张三,30) ;System.out.println(per.getName() + - + per.getAge() ;使用this来完成构造方法的调用案例:如果在一个类中存在三个构造方法,但是不管怎样存在,都要求打印:“新的对象产生”。案例演示:class Personprivate String name ;private int age;public Person()System.out.println(新的对象产生了。) ;public Person(String name) = name ;System.out.println(新的对象产生了。) ;public Person(String name,int age) = name ;this.age = age ;System.out.println(新的对象产生了。) ;public void setName(String name) = name ;public void setAge(int age)this.age = age ;public String getName()return ;public int getAge()return this.age ;public class Demopublic static void main(String args)Person per = new Person(张三,30) ;System.out.println(per.getName() + - + per.getAge() ;但是发现该程序存在代码的重复,能否通过this()的调用完成代码的简化呢?案例演示:class Personprivate String name ;private int age;public Person()System.out.println(新的对象产生了。) ;public Person(String name)this() ;/ 调用无参构造 = name ;public Person(String name,int age)this(name) ;/ 调用有一个参数的构造方法this.age = age ;public void setName(String name) = name ;public void setAge(int age)this.age = age ;public String getName()return ;public int getAge()return this.age ;public class Demopublic static void main(String args)Person per = new Person(张三,30) ;System.out.println(per.getName() + - + per.getAge() ;所有的构造方法应该是对象操作前最早调用的,所以使用this调用构造方法的时候所有代码必须放在构造方法得到首行。在使用this调用构造方法的时候至少有一个构造方法是没有使用this()调用的,而此构造方法将作为调用的出口,一般这个出口都会使用无参构造完成。任务五: static关键字成员变量与成员方法是每个对象的属性与行为的抽象,如果把它们定义成静态的,就会在内存中为他们分配固定的内存空间,同时它们也会成为类的成员,而非对象的成员。一、 类变量类变量也成为静态成员变量,它的语法在成员比那里的基础上添加了static关键字,是成员变量成为静态变量。静态的成员变量不是分配给每一个实例变量的,而是属于类的变量,它在内存中是唯一的,可以直接使用“类名.成员变量”的格式访问,它在内存中是固定的,是该类的所有实例对象所共享的存储单元。 如果访问是在当前类,可以有三种方法(1) 对象.类变量(2) 类名.类变量(3) 直接访问类变量名 案例演示:中国人是一个类,其中country属性代表国家,把这个属性声明为静态的成员变量,并赋值为“中国”,它就是静态变量。public class Chinese public static String country=中国; /静态成员变量public String name; /普通成员变量public int age;public String sex;public Chinese()public void hello()System.out.println(我的国籍:+country+ 我的名字:+name+ 我的年龄:+age+ 我的性别:+sex);public static void main(String args) Chinese p1=new Chinese();p1.hello();Chinese p2=new Chinese();=张三;p2.hello();p1.country=法国;p1.hello();p2.hello();System.out.println(Chinese.country); 如果是在非当前类中访问,只能使用:(1) 对象.类变量(2) 类名.类变量 class Chinese public static String country=中国; /静态成员变量public String name; /普通成员变量public int age;public String sex;public Chinese()public void hello()System.out.println(我的国籍:+country+ 我的名字:+name+ 我的年龄:+age+ 我的性别:+sex);class Hubeipublic static void test()Chinese c=new Chinese();System.out.println(我的国籍:+Chinese.country+ 我的名字:++ 我的年龄:+c.age+ 我的性别:+c.sex);public class TestChinese public static void main(String args) Chinese p1=new Chinese();p1.hello();Chinese p2=new Chinese();=张三;p2.hello();p1.country=法国;p1.hello();p2.hello();System.out.println(Chinese.country);Hubei.test();说明:声明为静态的变量必须是成员变量,而不能是局部变量,在方法体内或任何代码中声明的变量不能使用static关键字。二、 类方法成员变量与成员方法必须创建对象,拖过对象才能访问。但有时也希望能够不必创建对象直接调用类的某个方法,也就是类方法。类方法由static关键字定义,格式如下:public static void print() /方法体说明:(1) 静态方法内访问成员变量时,必须使用对象.成员变量的方式访问(2) 静态方法里访问静态成员变量时可以使用对象.类变量 类名.类变量直接访问类变量名(3) 对静态方法的调用:对象名.静态方法名();类名。静态方法名();案例演示:class Chinese public static String country=中国; /静态成员变量public String name; /普通成员变量public int age;public String sex;public Chinese()public static void hello()Chinese c=new Chinese();System.out.println(我的国籍:+country+ 我的名字:++ 我的年龄:+c.age+ 我的性别:+c.sex);class Hubeipublic static void test()Chinese c=new Chinese();System.out.println(我的国籍:+Chinese.country+ 我的名字:++ 我的年龄:+c.age+ 我的性别:+c.sex);public class TestChinese public static void main(String args) Chinese.hello();new Hubei().test();(4) 静态方法里调用非静态方法是,必须是对象.成员方法()的格式案例演示:class Chinese public static void hello()System.out.println(我是中国人!);new Chinese().speak();public void speak() System.out.println(我爱中国!);public class TestChinese public static void main(String args) Chinese.hello();(5) 非静态方法里可以直接访问静态方法案例演示:class Chinese public static void hello()System.out.println(我是中国人!);public void speak() System.out.println(我爱中国!); hello();public class TestChinese public static void main(String args) new Chinese().speak();任务六:掌握封装的特性,掌握封装的使用一、 封装的概念封装是一种信息隐蔽技术。它有两个含义:一是指把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单位(即对象)中。另一层含义指“信息隐蔽”,把不需要让外界知道的信息隐藏起来,或是有些对象的属性及行为允许外界使用,但不允许更改,而另一些属性或行为,则不允许外界知晓;或只允许使用对象的功能,而隐蔽对象功能实现细节。即封装就是隐藏实现细节,仅仅对外提供访问接口。1、 封装的分类 属性的封装 方法的封装 类的封装 组件的封装 模块化的封装 系统级的封装2、 封装的好处 模块化 信息隐藏 代码重用 插件化易于调试 具有安全性3、如何实现封装封装只是为了对类中的属性更好进行控制,因此要实现封装需要属性私有化,这样可以保证属性不会被其他类改动。然后使用公有方法把私有的属性暴露出去,在方法中对属性进行读写控制。一个私有的属性(变量),使用private来声明私有变量。例如:private String name;一个公有的读操作访问器,使用getter方法来完成。例如:public String getName() /方法体 一个公有的写操作访问器,使用setter方法来完成。例如:public void setName(String name) /方法体 案例演示1:class PersonString name;/ 表示人的姓名int age ;/ 表示人的年龄public void tell()/ 定义说话的方法System.out.println(姓名: + name + ,年龄: + age) ;public class Demopublic static void main(String args)Person per = new Person() ;/ 实例化对象 = 张三 ;/ 为name属性赋值per.age = -30;per.tell() ;说明:在这个代码里面,Person类的成员变量因为没有实现封装,可以被外部类直接访问和修改,导致数据的不安全。案例演示:class Personprivate String name;/ 表示人的姓名private int age ;/ 表示人的年龄public void tell()/ 定义说话的方法System.out.println(姓名: + name + ,年龄: + age) ;public class OODemo09public static void main(String args)Person per = new Person() ;/ 实例化对象 = 张三 ;/ 为name属性赋值per.age = -30;p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《心脏骤停应对策略》课件
- 医疗器械清洗灭菌全流程解析
- 《GBT42933-2023多式联运运载单元标识》(2025版)深度解析
- 《通信原理》课件
- 2025年入团考试试题及答案解析法
- 《教学新视野》课件
- 《心血管病预防策略》课件
- 《血液透析护理》课件
- 《西安科技大学》课件
- 《金融理财入门教程》课件
- 2025网络安全协议合同
- (高清版)JTGT 3650-01-2022 公路桥梁施工监控技术规程
- 中国历史地理智慧树知到期末考试答案章节答案2024年北京大学
- MOOC 跨文化交际通识通论-扬州大学 中国大学慕课答案
- 证据法学试题及答案
- 2023年河南省黄泛区实业集团有限公司招聘笔试题库及答案解析
- 超声引导下针刀精准治疗膝骨关节炎课件
- 液化气站安全生产标准化评价标准
- 制糖生产工艺与煮糖整理操作课件
- 常见典型心电图诊断规培-课件
- 费森4008s常见故障排除
评论
0/150
提交评论