3 第三天 魔乐java基础视频学习笔记.docx
- 文档编号:23797420
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:52
- 大小:1.36MB
3 第三天 魔乐java基础视频学习笔记.docx
《3 第三天 魔乐java基础视频学习笔记.docx》由会员分享,可在线阅读,更多相关《3 第三天 魔乐java基础视频学习笔记.docx(52页珍藏版)》请在冰豆网上搜索。
3第三天魔乐java基础视频学习笔记
1、课程名称:
面向对象
2、知识点
2.1、上次课程的主要知识点
1、面向对象的三大主要特征:
封装、继承、多态;
2、类与对象的定义:
类是对象的模板,对象是类的实例;
•类的组成:
属性(变量)和方法;
•对象(类只有通过对象才可以使用):
|.声明并实例化对象:
类名称对象名称=new类名称();
|.分步完成:
如果使用了未实例化的对象,则会出现NullPointerExecptiion(空指向异常)
|.声明对象:
类名称对象名称=null;在栈内存中开辟;
|.实例化对象:
对象名称=new类名称();在堆内存中开辟空间,保存属性值;
••对象的引用传递:
一块堆内存空间同时被多个栈所指向的一种操作形式,内存图。
3、只要是类中的属性都要求使用private进行封装,封装之后的属性如果希望被操作,则需要编写setter、getter方法;
4、构造方法:
为类之中的属性初始化,只有执行了构造方法,堆内存之中的属性才可以进行分配;
•构造方法定义要求:
方法名称和类名称相同,无返回值类型声明;
•如果一个类之中没有明确定义一个构造方法的话,则会自动的生成一个无参的无返回值的构造方法,如果已经定义了构造方法,则这个默认的构造将不会生成,一个类之中至少留有一个构造方法;
•构造方法允许重载,但是在重载的过程之中,只考虑参数的类型及个数即可;
5、匿名对象:
只开辟了堆内存空间的对象,使用一次之后就成为垃圾,并且等待被回收;
6、简单Java类的开发原则:
•类名称要表示出一类的含义;
•类之中的所有属性都必须封装,封装之后的属性编写setter、getter;
•类之中可以提供多个构造方法,但是必须保留一个无参构造;
•类中不允许出现任何的System.out.println()输出,所有的输出要求返回给被调用处完成;
7、数组:
数组是一组相关变量的集合;
•数组的定义格式:
也存在内存的分配问题
|.动态初始化:
数据类型数组名称[]=new数据类型[长度];数组内容都是默认值
|.静态初始化:
数据类型数组名称[]=new数据类型[]{值,值,……}
•二维数组:
|.动态初始化:
数据类型数组名称[][]=new数据类型[行长][列长];理解为一张表
|.静态初始化:
数据类型数组名称[][]=new数据类型[][]{{值,值,……},{值,值,值,……},……}
•如果要想取得数组长度:
数组名称.length;
•数组的两个操作方法:
|.排序:
java.util.Arrays.sort(数组名称);
|.数组拷贝:
System.Arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,长度);
•对象数组开辟之后需要为每一个数组元素分别进行实例化操作。
2.2、习题讲解
1、将一个给定的一维整型数组转置输出
例如:
源数组:
123456
转置之后的数组:
654321
原则:
主方法之中不要编写特别复杂的操作,复杂操作交给方法去完成
思路:
•需要开辟一个数组,而且可以发现,现在已经给出数组内容,直接使用静态初始化;
•转置操作现在有两种实现形式:
|.实现方法一:
开辟一个新数组,将原始数组的内容倒序输出到新数组之中,而后丢弃原数组;
|.实现方法二:
在一个数组上执行首尾交换;
由于在一个数组上完成,所有没有垃圾产生。
可见方法一共的交换次数是“数组长度.length/2”次。
不管是奇数个数还是偶数个数,那么操作的代码不需要做任何的调整。
publicclassTestDemo{//第一题1
publicstaticvoidmain(Stringargs[]){
intdata[]=newint[]{1,2,3,4,5,6};
print(data);
reverse(data);
print(data);
}
publicstaticvoidreverse(inttemp[]){
inthead=0;
inttail=temp.length-1;
intcenter=temp.length/2;//只需执行一次除法,提高性能
for(intx=0;x
{
intt=temp[head];
temp[head]=temp[tail];
temp[tail]=t;
head++;
tail--;
}
}
publicstaticvoidprint(inttemp[]){
for(intx=0;x { System.out.print(temp[x]+"、"); } System.out.println(); } } 面试题: 按照同理,完成一个二维数组的行列转换并输出; 行数=列数 publicclassTestDemo{//第一题1 publicstaticvoidmain(Stringargs[]){ intdata[][]=newint[][]{{1,2,3},{4,5,6},{7,8,9}}; print(data); reverse(data); print(data); } publicstaticvoidreverse(inttemp[][]){ for(intx=0;x { for(inty=x;y { intt=temp[x][y]; temp[x][y]=temp[y][x]; temp[y][x]=t; } } } publicstaticvoidprint(inttemp[][]){ for(intx=0;x { for(inty=0;y { System.out.print(temp[x][y]+"、"); } System.out.println(); } } } 2、现在有如下的一个数组: intoldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,0,5} 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: IntnewArr[]={1,3,4,5,6,6,5,4,7,6,5} 思路: •首先需要知道新数组的长度,除了0之外的统计结果; •开辟了新数组,将不为0的数据保存到新数组之中。 publicclassTestDemo{//第一题1 publicstaticvoidmain(Stringargs[]){ intoldArr[]=newint[]{1,3,4,5,0,0,6,6,0,5,4,7,6,0,5}; intnewArr[]=newint[count(oldArr)]; copy(oldArr,newArr); print(newArr); } publicstaticintcount(inttemp[]){ intsum=0; for(intx=0;x { if(temp[x]! =0) { sum++; } } returnsum; } publicstaticvoidcopy(inttempA[],inttempB[]){ inty=0; for(intx=0;x { if(tempA[x]! =0) { tempB[y]=tempA[x]; y++; } } } publicstaticvoidprint(inttemp[]){ for(intx=0;x { System.out.print(temp[x]+"、"); } System.out.println(); } } 3、现在给出两个数组: •数组A: 1,7,9,11,13,15,17,19 •数组B: 2,4,6,8,10 两个数组合并为数组C,按升序排列。 思路: •如果要将两个数组合并为一个,那么新数组的长度: 两个数组的长度相加; •需要将原始数组的内容拷贝到新数组之中,使用System.arraycopy()操作; •排序使用java.util.Arrays.sort()完成。 publicclassTestDemo{ publicstaticvoidmain(Stringargs[]){ intdataA[]=newint[]{1,7,9,11,13,15,17,19}; intdataB[]=newint[]{2,4,6,8,10}; intdataC[]=copy(dataA,dataB); java.util.Arrays.sort(dataC); print(dataC); } publicstaticint[]copy(inttempA[],inttempB[]){ intnewArr[]=newint[tempA.length+tempB.length]; System.arraycopy(tempA,0,newArr,0,tempA.length); System.arraycopy(tempB,0,newArr,tempA.length,tempB.length); returnnewArr; } publicstaticvoidprint(inttemp[]){ for(intx=0;x { System.out.print(temp[x]+"、"); } System.out.println(); } } 2.3、本次预计讲解的知识点 1、String类的主要特点及常用方法(背); 2、this关键字使用; 3、引用传递深入。 3、具体内容 3.1、String类(重点) 3.1.1、String类两种对象实例化方式 对于String在之前已经学过了基本使用,就是表示字符串,那么当时使用的形式采用了直接赋值: publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr="Hello";//定义字符串 System.out.println(str); } } 对于String而言肯定是一个类,那么程序之中出现的str应该就是这个类的对象,那么就证明以上的赋值操作实际上就表示要为String类的对象进行实例化操作。 但是String毕竟是一个类,那么类之中一定会存在构造方法,String类的构造: publicString(Stringstr); publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr=newString("Hello");//定义字符串 System.out.println(str); } } 发现现在也可以通过构造方法为String类对象实例化。 3.1.2、字符串比较 如果要说现在有两个int型变量,如果要想知道是否相等,使用“==”进行验证。 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ intx=1; inty=1; System.out.println(x==y);//true } } 但是,同样的操作换作String完成。 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr1="Hello"; Stringstr2=newString("Hello"); Stringstr3=str2; System.out.println(str1==str2);//false System.out.println(str1==str3);//false System.out.println(str2==str3);//true } } 发现使用“==”好像最终的判断结果完全是不一样的,那么下面通过内存分配图来分析。 现在使用了“==”的确是完成了相等的判断,但是最终判断的是两个对象(现在的对象是字符串)判断是否相等,属于数值判断——判断的是两个对象的内存地址数值,并没有判断内容,而要想完成字符串内容的判断,则就必须使用到String类的操作方法: pblicbooleanequals(Stringstr)(将方法暂时变了) publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr1="Hello"; Stringstr2=newString("Hello"); Stringstr3=str2; System.out.println(str1.equals(str2));//true System.out.println(str1.equals(str3));//true System.out.println(str2.equals(str3));//true } } 现在比较的不再是内存地址的数值,而是两个字符串的内容,以后进行字符串相等判断的时候都使用equals()。 面试题: 请解释字符串比较之中“==”和equals()的区别? •==: 比较的是两个字符串内存地址的数值是否相等,属于数值比较; •equals(): 比较的是两个字符串的内容,属于内容比较。 以后进行字符串相等判断的时候都使用equals()。 3.1.3、字符串常量是String的匿名对象 如果在程序之中定义了字符串(使用了“”””),那么这个就表示一个String对象,因为在各个语言之中没有关于字符串数据类型定义,而Java将其简单处理了,所以感觉上存在了字符串类型。 范例: 验证字符串是对象的概念 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr="Hello";//通过字符串调用方法 System.out.println("Hello".equals(str)); } } 匿名对象可以调用类之中的方法与属性,以上的字符串可以调用了equals()方法,那么一定是一个对象。 小技巧: 关于字符串与字符串常量的判断 例如: 在实际工作之中会有这样一操作,要求用户输入一个内容,之后判断此内容是否与指定的内容相同。 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr="Hello"; if(str.equals("Hello")) { System.out.println("条件满足! "); } } } 但是,既然数据由用户自己输入,那么就有可能没有输入的内容。 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr=null; if(str.equals("Hello")) { System.out.println("条件满足! "); } } } Exceptioninthread"main"java.lang.NullPointerException atStringDemo.main(StringDemo.java: 4) publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr=null; if("Hello".equals(str))//避免空指向异常 { System.out.println("条件满足! "); } } } 因为字符串常量就是一个匿名对象,匿名对象永远不可能为null,这样的比较才更加的合理。 3.1.4、String类的两种实例化方式的区别 对于String类的对象存在了两种实例化的操作形式,那么这两种有什么区别,在开发之中应该使用哪一种更好呢? 1、分析直接赋值的情况 Stringstr=”Hello”; 发现现在只开辟了一块堆内存空间和一块栈内存空间, publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr1="Hello"; Stringstr2="Hello"; Stringstr3="Hello"; System.out.println(str1==str2); System.out.println(str1==str3); System.out.println(str2==str3); } } 解释: 关于直接赋值操作之中,字符串比较都是相同的原因。 在String类进行设计的时候采用了一种称为共享设计模式的概念,在每一个运行的JVM底层存在一个字符串的对象池(ObjectPool),如果用户采用了直接赋值的方式,会将字符串的内容放入到池之中,以供其他继续使用直接赋值方式的String对象使用,如果新声明的字符串内容不在池之中,则会开辟一个新的,继续放到池,以供下次使用。 2、分析构造方法赋值的情况 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr=newString("Hello"); System.out.println(str); } } 使用构造方法赋值的方式开辟的字符串对象,实际上会开辟两块空间,其中有一块空间将成为垃圾。 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr1=newString("Hello"); Stringstr2="Hello";//入池 Stringstr3="Hello";//使用池对象 System.out.println(str1==str2);//false System.out.println(str1==str3);//false System.out.println(str2==str3);//true } } 通过上面的程序可以发现,使用构造方法实例化的String对象,不会入池,所有,只能自己使用,可是在String类之中为了方便操作,提供了一种称为手工入池的方法: publicStringintern() publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr1=newString("Hello").intern(); Stringstr2="Hello";//入池 Stringstr3="Hello";//使用池对象 System.out.println(str1==str2);//true System.out.println(str1==str3);//true System.out.println(str2==str3);//true } } 面试题: 请解释String类的两种对象实例化方式的区别? •直接赋值: 只开辟一块堆内存空间,字符串的内容可以自动入池,以供下次使用; •构造方法: 开辟两块堆内存空间,有一块将成为垃圾,并且不能自动入池,使用intern()手工入池。 在日后的所有开发之中,String对象的实例化永远都采用直接赋值的方式完成。 3.1.5、字符串的内容一旦声明则不可以改变 字符串类的操作特点决定: 字符串不可能去修改里面的内容,所以,如果以后在开发之中有如下程序。 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr="Hello";//入池 str+="World"; str+="! ! ! "; System.out.println(str);//true } } 通过以上的代码可以发现,字符串内容的更改,实际上改变的是字符串对象的引用过程,并且会伴随有大量的垃圾出现,那么对于以下的代码实际之中应该避免。 publicclassStringDemo{ publicstaticvoidmain(Stringargs[]){ Stringstr="";//入池 for(intx=0;x<1000;x++) { str+=x; } System.out.println(str);//true } } 但是这种代码需要“断开-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三天 魔乐java基础视频学习笔记 三天 魔乐 java 基础 视频 学习 笔记