JavaSE1面向对象1基础20页.docx
- 文档编号:25585578
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:60
- 大小:230.99KB
JavaSE1面向对象1基础20页.docx
《JavaSE1面向对象1基础20页.docx》由会员分享,可在线阅读,更多相关《JavaSE1面向对象1基础20页.docx(60页珍藏版)》请在冰豆网上搜索。
JavaSE1面向对象1基础20页
1、课程名称:
面向对象(基础)
2、知识点
2.1、上次课程的主要知识点
1、两个环境变量
·PATH:
设置JDK的操作指令的环境
·CLASSPATH:
设置类的路径,java执行的时候要找到classpath,之后找到对应的class文件
2、Java的数据类型:
·基本数据类型:
|-数值型:
|-整数:
byte、short、int、long
|-浮点型:
float、double
|-字符型:
char
|-boolean型:
boolean
·引用数据类型:
数组、类、接口
·一个整数的默认类型是int,一个小数的默认类型是double
3、关键字的
·未使用到的关键字:
const、goto
·JDK1.4增加的关键字:
assert
·JDK1.5增加的关键字:
enum
4、方法的概念
·方法就是可重复调用的一段代码段
·方法的声明格式,(当前讲可以由主方法直接调用):
publicstatic返回值类型方法名称(参数列表){}
·返回值类型:
可以是任意的数据类型,包括基本和引用
·递归调用:
自己调用自己,但是必须有结束条件
5、数组
·数组就是一组相关变量的集合,通过下标访问数组
·数组的定义格式:
|-动态初始化:
数据类型数组名称[]=new数据类型[长度];
|-静态初始化:
数据类型数组名称[]={值,值,值,值,值};
·数组本身属于引用数据类型,所以需要进行栈和堆的划分,之前也简单的演示了的栈-堆的分配问题。
·Java中提供了System.arraycopy()完成数组复制,和java.util.Arrays.sort()完成数组排序
2.2、本次预计讲解的知识点
1、介绍面向对象的基本概念
2、类与对象的关系
3、对象的引用传递及内存分配问题
4、类的封装性
5、构造方法和匿名对象
6、建立类的开发思路
7、String类的特点及操作方法
3、具体内容
3.1、面向对象
此概念如果直接去解释的话可能会比较抽象,因为大家缺少对原始的面向过程的开发语言的了解。
面向过程是很难适应变化的,而面向对象因为有其完整的分析思路,所以可以任意的进行修改。
面向对象从概念上讲分为以下三种:
OOA、OOD、OOP
|-OOA:
面向对象分析
|-OOD:
面向对象设计
|-OOP:
面向对象程序
但是,我们在学习中并不会严格的按照以上的步骤走,我们的分析和解决问题的思路来源于现实生活。
面向对象中有三大特征:
·封装性:
所有的内容对外部不可见
·继承性:
将其他的功能继承下来继续发展
·多态性:
方法的重载本身就是一个多态性的体现
3.2、类与对象
3.2.1、两者的关系
在面向对象的概念中类和对象是一个绝对的重点问题,下面就要分析类和对象的关系。
类表示一个共性的产物,是一个综合的特征,而对象,是一个个性的产物,是一个个体的特征。
类必须通过对象才可以使用,那么对象的所有操作都在类中定义。
类由属性和方法组成:
·属性:
就相当于一个个的特征
·方法:
就相当于人的一个个的行为,例如:
说话、吃饭、唱歌、睡觉
3.2.2、类的定义格式
在Java中可以使用以下的语句定义一个类:
class类名称{
属性名称
方法名称(){}
}
但是,在定义类的时候类中的方法声明时,可以暂时不加入publicstatic,而只写返回值类型和方法名称。
下面按照以上的格式定义出一个Person类
classPerson{
Stringname;//表示姓名
intage;//表示年龄
voidtell(){
System.out.println("姓名:
"+name+";年龄:
"+age);
}
};
以上定义出了一个类,但是这个类要想被使用,则必须依靠对象。
3.2.3、对象的定义格式
一个类要想真正的进行操作,则必须依靠对象,对象的定义格式如下:
类名称对象名称=new类名称();
按照以上的格式就可以产生对象了。
如果要想访问类中的属性或方法,则可以依靠以下的语法形式:
访问类中的属性:
对象.属性;
调用类中的方法:
对象.方法();
范例:
调用Person类中的属性和方法
classPerson{
Stringname;//表示姓名
intage;//表示年龄
voidtell(){
System.out.println("姓名:
"+name+";年龄:
"+age);
}
};
publicclassOODemo02{
publicstaticvoidmain(Stringargs[]){
Personper=newPerson();//声明对象并实例化
per.name="张三";//设置per对象的name属性内容
per.age=30;//设置per对象的age属性内容
per.tell();//调用类中的方法
}
};
此时,所有的操作已经正常的调用完成,而且一个类可以使用了,但是以上的操作有以下几点必须说明。
·在java中对象声明有两种含义
|-声明对象:
Personper=null;//表示声明了一个对象,但是此对象无法使用,per没有具体的内存指向
|-实例化对象:
per=newPerson();//表示实例化了对象,可以使用
publicclassOODemo03{
publicstaticvoidmain(Stringargs[]){
Personper=null;//声明对象
per=newPerson();//实例化对象
per.name="张三";//设置per对象的name属性内容
per.age=30;//设置per对象的age属性内容
per.tell();//调用类中的方法
}
};
·对象属于引用数据类型,所以也需要进行内存的划分。
|-不管任何情况下,只要是调用了关键字new,则表示开辟新的堆内存空间
所以在使用类的时候必须考虑到堆-栈的引用空间,但是在这里有一个需要说明的问题:
·如果一个类中没有使用关键字new进行内存的开辟,则将出现以下的问题:
Exceptioninthread"main"java.lang.NullPointerException
atOODemo03.main(OODemo03.java:
12)
出现了“空指向”问题,那么此问题将陪伴大家的开发人生。
造成此类问题的根源非常简单,因为没有开辟对应的堆内存空间,所以出现以上的错误。
那么,如果现在产生多个对象呢?
这些对象之间会不会互相影响呢?
publicclassOODemo04{
publicstaticvoidmain(Stringargs[]){
Personper1=null;//声明对象
Personper2=null;//声明对象
per1=newPerson();//实例化对象
per2=newPerson();//实例化对象
per1.name="张三";//设置per对象的name属性内容
per1.age=30;//设置per对象的age属性内容
per2.name="李四";
per2.age=33;
per1.tell();
per2.tell();//调用类中的方法
}
};
以上的程序,可以得出以下的内存关系图
提问:
在类的操作中,所有的对象名称放在栈内存中,所有的对象的具体内容放在堆内存之中,那么类中的方法放在那里了?
实际上所有的方法放在了全局代码区中。
那么,对象间既然属于引用数据类型的操作,所以肯定也是可以进行引用传递的,如果要想进行引用传递,就是将一个堆内存的空间地址的使用权给了其他对象。
classPerson{
Stringname;//表示姓名
intage;//表示年龄
voidtell(){
System.out.println("姓名:
"+name+";年龄:
"+age);
}
};
publicclassOODemo05{
publicstaticvoidmain(Stringargs[]){
Personper1=null;//声明对象
Personper2=null;//声明对象
per1=newPerson();//实例化对象
per1.name="张三";//设置per对象的name属性内容
per1.age=30;//设置per对象的age属性内容
per2=per1;将per1对象的堆内存空间给了per2,那么此时的内存关系图
per2.name="李四";
per1.tell();
per2.tell();//调用类中的方法
}
};
继续观察以下的一种情况:
classPerson{
Stringname;//表示姓名
intage;//表示年龄
voidtell(){
System.out.println("姓名:
"+name+";年龄:
"+age);
}
};
publicclassOODemo05{
publicstaticvoidmain(Stringargs[]){
Personper1=null;//声明对象
Personper2=null;//声明对象
per1=newPerson();//实例化对象
per2=newPerson();//实例化对象
per2.name="王五";
per1.name="张三";//设置per对象的name属性内容
per1.age=30;//设置per对象的age属性内容
per2=per1;
per2.name="李四";
per1.tell();
per2.tell();//调用类中的方法
}
};
从本道程序之中,可以清楚的发现垃圾对象的产生,垃圾对象将被系统通过GC进行自动的垃圾回收,并释放掉内存空间。
3.3、封装性(重点)
在讲解封装性之前,来看一下以下的代码:
classPerson{
Stringname;//表示姓名
intage;//表示年龄
voidtell(){
System.out.println("姓名:
"+name+";年龄:
"+age);
}
};
publicclassOODemo07{
publicstaticvoidmain(Stringargs[]){
Personper=newPerson();
per.name="张三";
per.age=-30;
per.tell();
}
};
以上的操作代码并没有出现了语法错误,但是出现了逻辑错误。
那么此时,这种操作并不是很合乎正常的逻辑。
造成此类问题的根源在与,可以通过对象直接访问类中的属性。
那么,此时就需要对类中的内容进行封装,使用private关键字,使用之后的效果如下:
classPerson{
privateStringname;//表示姓名
privateintage;//表示年龄
voidtell(){
System.out.println("姓名:
"+name+";年龄:
"+age);
}
};
publicclassOODemo08{
publicstaticvoidmain(Stringargs[]){
Personper=newPerson();
per.name="张三";
per.age=-30;
per.tell();
}
};
编译时出现了以下的错误提示:
OODemo08.java:
11:
namehasprivateaccessinPerson
per.name="张三";
^
OODemo08.java:
12:
agehasprivateaccessinPerson
per.age=-30;
^
2errors
name和age属性是私有的访问权限,不能被外部所访问,那么此时,既然不能被外部所访问,则肯定是安全的了。
所以,在Java开发中对于所有的私有属性要想进行访问,必须通过setter和getter方法,这是一个标准的操作,例如:
·现在有Stringname属性
·setter:
publicvoidsetName(Stringstr)
·getter:
publicStringgetName()
classPerson{
privateStringname;//表示姓名
privateintage;//表示年龄
voidtell(){
System.out.println("姓名:
"+getName()+";年龄:
"+getAge());
}
publicvoidsetName(Stringstr){
name=str;
}
publicvoidsetAge(inta){
age=a;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
};
publicclassOODemo09{
publicstaticvoidmain(Stringargs[]){
Personper=newPerson();
per.setName("张三");
per.setAge(-30);
per.tell();
}
};
但是,以上的操作中仍然没有解决年龄是负数的情况。
需要在setter方法上加上检测措施,而在getter方法上只是简单的把内容返回即可。
classPerson{
privateStringname;//表示姓名
privateintage;//表示年龄
voidtell(){
System.out.println("姓名:
"+getName()+";年龄:
"+getAge());
}
publicvoidsetName(Stringstr){
name=str;
}
publicvoidsetAge(inta){
if(a>0&&a<150)
age=a;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
};
publicclassOODemo10{
publicstaticvoidmain(Stringargs[]){
Personper=newPerson();
per.setName("张三");
per.setAge(-30);
per.tell();
}
};
提示:
在开发中只要是属性就必须封装,只要是封装的属性就必须通过setter及getter方法设置和取得。
3.4、构造方法(重点)
构造方法是在类中定义的,构造方法的定义格式:
方法名称与类名称相同,无返回值类型的声明。
观察对象的产生语法:
类名称对象名称=new类名称();既然有“()”则就表示调用的是一个方法,那么此方法实际上就是构造方法
在使用关键字new实例化对象的时候,就会调用类中的构造方法。
提问:
之前的所有代码中好象并没有给出构造方法,那么是怎么调用的?
所有的Java类中肯定都至少会保存一个构造方法,如果在一个类中没有明确的定义一个构造方法的话,则会自动生成一个无参的什么都不做的构造方法。
classPerson{
privateStringname;//表示姓名
privateintage;//表示年龄
publicPerson(){//构造方法
}
voidtell(){
System.out.println("姓名:
"+getName()+";年龄:
"+getAge());
}
publicvoidsetName(Stringstr){
name=str;
}
publicvoidsetAge(inta){
if(a>0&&a<150)
age=a;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
};
既然有了构造方法,实际上构造方法的主要作用是为类中的属性初始化的,所以可以通过构造方法进行属性内容的设置,这样以后就可以不用再分别调用setter方法设置属性内容。
classPerson{
privateStringname;//表示姓名
privateintage;//表示年龄
publicPerson(Stringn,inta){//构造方法
name=n;
age=a;
}
voidtell(){
System.out.println("姓名:
"+getName()+";年龄:
"+getAge());
}
publicvoidsetName(Stringstr){
name=str;
}
publicvoidsetAge(inta){
if(a>0&&a<150)
age=a;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
};
以上的类中设置了有两个参数的构造方法,那么执行的时候,可以直接调用此构造。
注意:
当类中已经明确的定义了一个构造方法的时候,则无参构造将不会自动生成了
classPerson{
privateStringname;//表示姓名
privateintage;//表示年龄
publicPerson(Stringn,inta){//构造方法
name=n;
age=a;
}
voidtell(){
System.out.println("姓名:
"+getName()+";年龄:
"+getAge());
}
publicvoidsetName(Stringstr){
name=str;
}
publicvoidsetAge(inta){
if(a>0&&a<150)
age=a;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
};
publicclassOODemo12{
publicstaticvoidmain(Stringargs[]){
Personper=null;
per=newPerson("张三",30);
per.tell();
}
};
但是,以上的操作方法中,属性的内容可以直接通过构造进行设置,所以,即使设置了错误的内容,也依然可以为属性赋值,那么此时最好的做法是,在构造方法中同样调用检查的操作。
publicPerson(Stringn,inta){//构造方法
setName(n);//设置name属性
setAge(a);//设置age属性
}
另外,要提醒的是,如果现在需要明确的表示出一个方法是本类中定义的方法也可以加上this.的形式,例如:
publicPerson(Stringn,inta){//构造方法
this.setName(n);//设置name属性
this.setAge(a);//设置age属性
}
那么在类中构造方法本身也是可以进行重载的,只要参数的类型或个数不同,那么就可以完成构造方法的重载。
classPerson{
privateStringname;//表示姓名
privateintage;//表示年龄
publicPerson(){}
publicPerson(Stringn){
this.setName(n);
}
publicPerson(Stringn,inta){//构造方法
this.setName(n);//设置name属性
this.setAge(a);//设置age属性
}
voidtell(){
System.out.println("姓名:
"+getName()+";年龄:
"+getAge());
}
publicvoidsetName(Stringstr){
name=str;
}
publicvoidsetAge(inta){
if(a>0&&a<150)
age=a;
}
publicStri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaSE1 面向 对象 基础 20