JAVA程序设计讲义模块三类和对象.docx
- 文档编号:24331785
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:35
- 大小:2.14MB
JAVA程序设计讲义模块三类和对象.docx
《JAVA程序设计讲义模块三类和对象.docx》由会员分享,可在线阅读,更多相关《JAVA程序设计讲义模块三类和对象.docx(35页珍藏版)》请在冰豆网上搜索。
JAVA程序设计讲义模块三类和对象
JAVA语言程序设计
JAVA程序设计讲义模块三--类和对象
一、教学章节
模块三类和对象
二、教学知识点
1:
类
2:
对象
3:
封装
4:
对象与类之间的关系
5:
定义和使用类的方法
6:
变量的作用域
三、教学目的和要求
任务一:
理解类的概念、掌握类的创建
任务二:
理解对象的概念、掌握对象的创建
任务三:
理解对象和类之间的关系
任务四:
掌握变量的作用域
任务五:
掌握this关键字和static关键字
任务六:
掌握封装的特性,掌握封装的使用
四、主要仪器设备
1、笔记本电脑及相应的WindowsOperatingSystems.
2、已安装的JDK7.0和jcreator或MyEclipse软件。
五、教学内容
任务一:
理解类的概念、掌握类的创建
1:
面向对象的三大特征
(1)封装(Encapsulation)
对外部看不见
(2)继承(Inheritance)
扩展类的功能
(3)多态(Polymorphism)
方法的重载
方法的多态性
封装:
对外部不可见。
保护类中的操作不被外部直接访问。
继承:
你老子有100000000000000000000000000000000,之后将这些资金留给你。
20000000000000000000000或者10000000000000000000000
多态:
之前学习的方法重载:
不同的方法名称根据传入的参数类型或个数不同调用的方法也不同
多态是在整个java中最重要的概念,而且一个好的面向对象设计中肯定要大量的使用多态性
实际上最早的面向对象语言是有smalltalk提出的,实际上java只是实现了所有面向对象语言所应该具备的各个功能,当然现在的面向对象的语言也不例外。
2:
类的基本概念
类和对象是面向对象中两个最重要的概念:
类:
类是一组具有相同特性(属性)与行为(方法)的事务集合。
对象:
对象就是一个个性的体现。
日常生活中把众多事物进行归纳、划分,然后分类是人类在认识客观世界时经常采用的思维方法。
换句话说“类”是从日常生活中抽象出来的具有共同特征的实体。
因此我们把具有相同特征及相同行为的一组对象称为类(ClassofObject),使用第一个英文单词Class作为描述类的Java关键字,Java语言中类是为了描述具体对象而存在的。
例如:
张三同学是一个对象,李四同学也是一个对象,并且全班的同学都有学号、姓名、出生年月、家庭住址,具有上课、做作业、休息等行为。
从整个班级所有的对象中抽象出共同特征和行为就可以形成我们常说的“学生”类,此时,学生就是一个类。
3:
类与对象的关系
类表示一个共性的产物,是一个综合的特征,而对象,是一个个性的产物,是一个个体的特征。
例如,“学生”是一个类,它可以表示班级中所有的学生;而“张三”、“李四”则是实际存在的单个对象,或者说它们是“学生”这个类的一个个实例。
在Java中,我们可以定义类,然后创建类的对象。
4:
类的定义
类是一个独立的单位,它有一个类名,其内部包括成员变量,用于描述属性;还包括类的成员方法,用于描述行为。
因此,类也被认为是一种抽象数据类型,这种数据类型不但包括数据,还包括方法。
类定义的格式:
publicclass类名{
//定义属性部分
属性1的类型属性1;
属性2的类型属性2;
…
属性n的类型属性n;
//定义方法部分
方法1;
方法2;
…
方法m;
}
注解:
1.修饰符。
修饰类的修饰符有public、abstract和final,这些修饰符将在后面的任务中介绍。
包含main方法的主类必须定义为public。
2.class关键字。
class为Java定义类的关键字,必须写在修饰符和类名中间,使用空格隔开,并且不能改变任何一个字符的大小写,如:
Class是错误的。
3.类名。
类的名字要符合Java的命名规范,同时名字要有意义能够反映出这个类的内容,第一个字母一般为大写。
5:
定义类的基本步骤:
(1)定义类名。
编写类的最外层框架
publicclass类名{
程序体;
}
(2)编写类的属性
属性即该类所具有的特征
(3)编写类的方法。
类的方法描述类所具有的行为,是类的方法成员。
案例演示:
用Java类的定义描述人类
publicclassPerson{
//定义属性
Stringname;//姓名
intage;//年龄
//定义方法
publicvoidhello(){
System.out.println(“喂,你好,我的名字叫”+name+”,今年”+age+”岁!
”);
}
}
任务二:
理解对象的概念、掌握对象的创建
1:
对象:
对象就是一个个性的体现
Java中使用new关键字来创建类的一个对象。
它有两种方式完成。
第一种方式:
类名对象名称=null;
对象名称=new类名();
第二种方式:
类名对象名称=new类名();
2:
方法的定义和访问
类的每个方法定义一个功能,定义了类的对象之后就可以调用这些方法了。
方法的定义
方法的定义共有4个部分,具体为
1方法的名称
2方法的返回值的数据类型
3参数列表
4方法的主体
定义方法的两个步骤:
1定义方法名、参数以及返回值的数据类型
2编写方法体
定义类的方法时要注意一下几点
①有一对花括号括起来的语句是方法的主体,它包含一段程序代码,执行时完成一定的功能。
②方法名主要是在调用此方法时使用,其命名方法应遵守标识符命名的规则。
③方法就像“黑匣子”,完成一个功能。
并且在执行后可能返回一个结果。
如果没有结果返回,则使用void进行限制,如果有返回值,则必须使用return返回。
属性和方法的调用
访问属性:
对象名称.属性名;
访问方法:
对象名称.方法名();
案例演示:
classPerson{
//定义属性
Stringname;//姓名
intage;//年龄
//定义方法
publicvoidhello(){
System.out.println(“喂,你好,我的名字叫”+name+”,今年”+age+”岁!
”);
}
}
publicclassTestPerson{
publicstaticvoidmain(String[]args){
Personperson=newPerson();
person.name="李丽";
person.age=18;
person.hello();
}
}
案例演示:
classAutoLion{
Stringcolor="黄色";
publicvoidrun(){
System.out.println("正在以0.1/秒的速度向前奔跑!
");
}
publicStringbark(){
Stringsound="吼";
returnsound;
}
publicStringgetColor(){
returncolor;
}
publicStringshowLion(){
return"这是一个"+getColor()+"的玩具狮子!
";
}
}
publicclassTestLion{
publicstaticvoidmain(String[]args){
AutoLionlion=newAutoLion();
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)引用传递
在对象的操作中实际上是存在引用传递的。
所谓的引用传递,就是将一个堆内存空间的使用权交个其他的对象,就相当于为一个堆内存空间起了一个别名。
classPerson{
Stringname;//表示人的姓名
intage;//表示人的年龄
publicvoidtell(){//定义说话的方法
System.out.println("姓名:
"+name+",年龄:
"+age);
}
}
publicclassDemo06{
publicstaticvoidmain(Stringargs[]){
Personper1=null;//声明对象
Personper2=null;//声明对象
per1=newPerson();//实例化对象
per2=per1;//引用传递
per1.name="张三";//为名字赋值
per1.age=30;//为年龄赋值
per2.age=33;
per1.tell();//调用方法
per2.tell();
}
}
该程序内存的分配过程如下:
从本程序中应该得到总结:
一个栈内存只能引用一个堆内存空间。
但是一个堆内存中可以被多个栈内存所同时指向。
在JAVA中不用的内存空间就称为垃圾空间,垃圾空间要等待垃圾收集机制进行空间的释放,垃圾收集机制称为GC。
4:
构造方法
构造方法:
是指在创建给定类的实例时调用的一个方法,在每个中都存在一个构造方法,它的主要目的是为类中的成员变量进行初始化。
在创建类的对象时,将自动调用该类的构造方法,可以将值传递给构造方法。
因此构造方法可通过初始化成员变量和创建对象的环境来初始化对象。
(1)构造方法的分类
①无参构造方法
②有参构造方法
(2)构造方法的特点:
构造方法的名字与类名完全相同。
①没有返回值数据类型,也不能用void修饰。
②一个类可以有不同参数列表的构造方法,即构造方法可以重载。
③如果程序员在程序中未定义构造方法,则系统在编译该程序时自动提供默认的无参构造方法。
3如果程序员定义了一个或多个有参构造方法,而没有定义无参构造方法,则系统将自动屏蔽默认的无参构造方法。
⑤构造方法不能说明为native、abstract、synchronized或final,也不能从父类继承构造方法。
案例演示:
classPerson{
privateStringname;//表示人的姓名
privateintage;//表示人的年龄
publicPerson(){//定义了一个构造方法
System.out.println("******************");
}
publicvoidtell(){//定义说话的方法
System.out.println("姓名:
"+this.getName()+",年龄:
"+this.getAge());
}
publicvoidsetName(Stringn){
name=n;
}
publicvoidsetAge(inta){
if(a>=0&&a<=200){
age=a;
}
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
}
publicclassDemo11{
publicstaticvoidmain(Stringargs[]){
Personper=null;
per=newPerson();//实例化对象
per.setName("张三");//为name属性赋值
per.setAge(30);
per.tell();
}
}
当使用关键字new的时候才会调用类中的构造方法。
构造方法本身可以进行重载,重载的原则与普通方法一致。
如果一个类中已经明确了一个构造方法,则不会再重新生成无参构造方法,除非程序员自己在程序中添加的。
案例演示:
classPerson{
privateStringname;//表示人的姓名
privateintage;//表示人的年龄
publicPerson(){}
publicPerson(Stringn){
this.setName(n);
}
publicPerson(Stringn,inta){//定义了一个构造方法
this.setName(n);//调用setName()方法
this.setAge(a);//调用setAge()方法
System.out.println("******************");
}
publicvoidtell(){//定义说话的方法
System.out.println("姓名:
"+this.getName()+",年龄:
"+this.getAge());
}
publicvoidsetName(Stringn){
name=n;
}
publicvoidsetAge(inta){
if(a>=0&&a<=200){
age=a;
}
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
}
publicclassDemo12{
publicstaticvoidmain(Stringargs[]){
Personper=null;
per=newPerson("张三",-30);//实例化对象
per.tell();
}
}
一定要注意:
构造方法一定是在使用关键字new的时候才进行调用的,而且一个类中允许存在至少一个构造方法。
5:
匿名对象
匿名对象本身非常好理解,使用一次的对象(且该对象没有名字),称为匿名对象。
案例演示:
classPerson{
privateStringname;//表示人的姓名
privateintage;//表示人的年龄
publicPerson(){}
publicPerson(Stringn){
this.setName(n);
}
publicPerson(Stringn,inta){//定义了一个构造方法
this.setName(n);//调用setName()方法
this.setAge(a);//调用setAge()方法
System.out.println("******************");
}
publicvoidtell(){//定义说话的方法
System.out.println("姓名:
"+this.getName()+",年龄:
"+this.getAge());
}
publicvoidsetName(Stringn){
name=n;
}
publicvoidsetAge(inta){
if(a>=0&&a<=200){
age=a;
}
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
};
publicclassDemo13{
publicstaticvoidmain(Stringargs[]){
newPerson("张三",-30).tell();
}
}
任务三:
掌握变量的作用域
一、变量声明的位置决定变量作用域。
Java变量的范围有四个级别:
类级、对象实例级、方法级、块级。
(1)类级变量又称全局级变量,在对象产生之前就已经存在,就是static
(2)修饰的静态变量。
(3)对象实例级,就是成员变量,它可以使用在整个类和对象中。
(4)方法级:
就是在方法内部定义的变量,就是局部变量。
(5)块级:
就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如if、for语句的块。
注意:
后面两个级别变量作用域的判断只需要记住:
在变量声明的地方找到离它最近的一对大括号就是它的作用域,出了这对大括号就不能用了。
案例演示:
变量作用域演示程序设计
publicclassTestVariable{
staticStringname="类级";//又称为静态变量
inti;//对象级实例变量
{//属性块,在类初始化属性时运行
intj=3;//块级
}
publicTestVariable(){
}
publicvoidtest1(){
intj=4;//方法级
if(j==4){
intk=5;//块级
}
//这里不能访问块级的变量,块级的变量只能在块内部访问
System.out.println("name="+name+"i="+i+"j="+j);
}
publicstaticvoidmain(String[]args){
TestVariablet=newTestVariable();
t.test1();
TestVariablet2=newTestVariable();
}
}
案例演示:
同名变量作用域测试程序
classVariable{
intx=0;//类的成员变量
inty=0;
intz=0;
voidinit(intx,inty){
this.x=x;
this.y=y;
intz=3;//局部变量
System.out.println("**inint**"+"x="+x+"y="+y+"z="+z);
}
}
publicclassVariableTest{
publicstaticvoidmain(Stringargs[]){
Variablev=newVariable();
System.out.println("**beforeinit**"+"x="+v.x+"y="+v.y+"z="+v.z);
v.init(10,15);
System.out.println("**afterinit**"+"x="+v.x+"y="+v.y+"z="+v.z);
}
}
任务四:
this关键字
一、this的三种使用场景
(1)this代表所在类的实例化对象,可以理解为是类对象的一个简单引用,利用this可以调用当前对象的方法和变量,特别是当方法名和变量名很长是,通过this关键字调用更方便;
(2)解决成员变量和局部变量重名的问题;
(3)在同一类中不同构造方法之间的调用需要使用this关键字。
二、is的常用方法:
(1)his.属性
(2)中的方法:
this.方法();
(3)中的构造:
this();
(4)前的对象:
this
案例演示:
案例演示(观察一下的题目)
classPerson{
privateStringname;
privateintage;
publicPerson(Stringn,inta){
this.setName(n);
this.setAge(a);
}
publicvoidsetName(Stringn){
name=n;
}
publicvoidsetAge(inta){
age=a;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
}
publicclassThisDemo01{
publicstaticvoidmain(Stringargs[]){
Personper=newPerson("张三",30);
System.out.println(per.getName()+"-->"+per.getAge());
}
}
结果显示为:
张三-->30
但是总觉的
publicPerson(Stringn,inta){
this.setName(n);
this.setAge(a);
}
这段代码比较别扭,如果是其他人在没有看源码的前提下可能无法知道该程序的具体功能是干什么的。
案例演示(修改代码)
classPerson{
privateStringname;
privateintage;
publicPerson(Stringname,intage){
name=name;
age=age;
}
publicvoidsetName(Stringn){
name=n;
}
publicvoidsetAge(inta){
age=a;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
}
publicclassThisDemo01{
publicstaticvoidmain(Stringargs[]){
Personper=newPerson("张三",30);
System.out.println(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 程序设计 讲义 模块 对象