91 第九天 魔乐java基础视频学习笔记.docx
- 文档编号:11213714
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:33
- 大小:71.73KB
91 第九天 魔乐java基础视频学习笔记.docx
《91 第九天 魔乐java基础视频学习笔记.docx》由会员分享,可在线阅读,更多相关《91 第九天 魔乐java基础视频学习笔记.docx(33页珍藏版)》请在冰豆网上搜索。
91第九天魔乐java基础视频学习笔记
1、课程名称:
JDK1.5新特性
2、知识点
2.1、上次课程的主要知识点
1、关于复习问题:
在之前给出了若干个代码模型,但是对于所有的代码模型属于知识的综合应用,应该根据每一个代码模型思考里面的知识点:
classPerson{
privateStringname;
publicPerson(){}
publicPerson(Stringname){
this.name=name;
}
publicStringtoString(){
return"姓名:
"+this.name;
}
}
1)、类和对象:
classPerson,publicclass和class定义的区别、包的作用;
2)、privateStringname:
封装、setter、getter、String类的特点、String类的方法、数据模型;
3)、publicPerson(){}:
构造方法、定义要求、构造重载、主要作用、单例设计;
4)、publicStringtoString():
Object是所有类的父类,toString()属于方法的覆写,对象打印时默认调用。
2、异常的捕获和处理标准格式:
try、catch、finally、throw、throws的应用;
3、包的定义及使用,没有包的类根本就不存在;
4、四种访问控制权限:
private、default、protected、public;
5、命名规范。
6、有意思的程序:
packagecn.mldn.demo;
abstractclassA{//抽象类
publicA(){//构造方法
}
publicabstractvoidprint();
}
classBextendsA{
privateintdata=10;
publicB(intdata){
this.data=data;
}
publicvoidprint(){//抽象方法
System.out.println("data="+this.data);
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[])throwsException{
newB(100);//实例化子类对象
}
}
“data=0”,这种程序纯粹是为了研究技术而出现的,这道程序要想解决问题:
在之前讲解构造方法的时候曾经讲解过,一个类只有构造执行完之后,所有的属性才回为其分配默认值(intdata=10),这个10是在构造执行完毕之后赋予的,可是按照子类对象实例化的原则来讲,子类在实例化对象之前会默认调用父类之中的构造,为父类中的属性初始化,之后再调用子类自己的构造为子类的属性初始化。
2.2、本次预计讲解到的知识点
1、JDK1.5的新特性;
2、理解泛型、枚举、Annotation的主要作用(看即可,先不去使用)。
3、具体内容(理解)
Java的发展从1995年开始经历了许多的过程,但是其中有三个最具代表性的JDK版本:
·1995年推出的JDK1.0:
标志着Java彻底产生了;
·1998年推出的JDK1.2:
加入了javax.swing组件,这是主要新特性;
·2005年推出的JDK1.5,标记为tiger:
出现了许多一直延续到今天的新特性;
在几乎所有的书上,把JDK1.5的新特性都会结合一些系统的类库来讲解,但是本次是将所有的内容单独取出来进行的讲解,所以难免会出现理解上的困难。
3.1、可变参数
在讲解可变参数之前,首先来思考一个问题:
如果说现在要实现若干个整型变量的相加操作,问,此方法该如何设计?
使用数组接收,因为参数个数不确定,而按照之前的所学,只能使用数组完成。
packagecn.mldn.demo;
publicclassTestDemo{
publicstaticvoidmain(Stringargs[])throwsException{
System.out.println(add(newint[]{1,2,3}));
}
publicstaticintadd(int[]data){
intsum=0;
for(intx=0;x sum+=data[x]; } returnsum; } } 以上的确实现了技术要求,但是现在有一个新的问题产生了: 如果按照题目的要求,应该是可以任意的传递多个数据,但是以上实际上装的是一个数据,只不过一个数据使用数组的形式封装,那么为了更好的解决这个问题,可以使用JDK1.5可变参数形式来进行操作。 Public[static][final]返回值类型方法名称(参数类型…变量){ [return[返回值];] } 发现现在在进行方法参数定义的时候有了一些变化,而这个时候的参数可以说就是数组形式 packagecn.mldn.demo; publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ System.out.println(add(newint[]{1,2,3})); System.out.println(add(1,2,3)); System.out.println(add()); } publicstaticintadd(int...data){//可变参数 intsum=0; for(intx=0;x sum+=data[x]; } returnsum; } } 有了可变参数,在日后进行方法调用的过程之中,就可以比较直观的传递任意多个参数,但是以上的操作在开发之中不建议使用,最好别用。 3.2、foreach输出 首先需要解释的是: foreach并不是新的概念,最早是在.NET中提出来的,所谓的foreach可以理解为增强性的for循环,下面来回顾一下最早的for循环。 packagecn.mldn.demo; publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ intdata[]=newint[]{1,2,3,4,5,6}; intsum=0; for(intx=0;x sum+=data[x]; } System.out.println(sum); } } 但是有了foreach之后,那么对于数组或者是集合的输出就有了新的支持,语法如下: for(数据类型变量: 数组|集合){ //操作代码 } 这表示通过自动的方式将数组之中的每一个元素赋值给变量,而后在for循环的方法体之中进行操作。 packagecn.mldn.demo; publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ intdata[]=newint[]{1,2,3,4,5,6}; intsum=0; for(intx: data){//自动循环,将每一个元素赋给x sum+=x; } System.out.println(sum); } } 对于这种for循环依然只是要求会使用,能看懂就行,不过个人建议: 最好别用。 3.3、静态导入 如果说现在要想导入一个不同包的类的方法,那么肯定使用import完成,即: 如下是之前所采用的格式。 范例: 定义一个MyMath类 packagecn.mldn.util; publicclassMyMath{ publicstaticintadd(intx,inty){ returnx+y; } publicstaticintsub(intx,inty){ returnx-y; } publicstaticintdiv(intx,inty){ returnx/y; } publicstaticintmul(intx,inty){ returnx*y; } } 这个类之中的方法全部都属于static型的方法,而按照之前的方式如果要使用这个类,操作形式如下: 范例: 按照之前的方式来使用MyMath类 packagecn.mldn.demo; importcn.mldn.util.MyMath; publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ System.out.println("加法操作: "+MyMath.add(10,20)); System.out.println("减法操作: "+MyMath.sub(20,10)); } } 但是在JDK1.5之后,如果一个类之中的全部方法都是static型的,则可以使用如下的语法进行静态导入: importstatic包.类.*; 表示的是将这个指定类之中的全部方法导入进来,最后就好像这些方法全部是在主类之中定义的方法一样。 packagecn.mldn.demo; importstaticcn.mldn.util.MyMath.*; publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ System.out.println("加法操作: "+add(10,20)); System.out.println("减法操作: "+sub(20,10)); } } 这种比较难受的语法,也只是出现在讲课之中,是不会建议使用。 3.4、JDK1.5三大主要新特性——泛型 3.4.1、泛型的引出(重点) 下面首先通过一个简单的分析来研究一下泛型出现的主要目的,例如: 现在要求定义一个表示坐标的操作类(Point),这个类可以表示三种类型的坐标: ·整数坐标: x=10、y=20; ·小数坐标: x=10.1、y=20.3; ·字符串数据: x=“东经100度”、y=“北纬20度”。 类之中如果要想保存以上的数据,一定需要定义x和y两个属性,而这两个属性可以接收三种数据类型,那么只能使用Object类来定义会比价合适,这样会发生如下的几种转换关系: ·整数: int自动装箱为Integer向上转型为Object; ·小数: double自动装箱为Double向上转型为Object; ·字符串: 字符串向上转型为Object。 范例: 定义Point类,使用Object作为属性类型 classPoint{ privateObjectx; privateObjecty; publicvoidsetX(Objectx){ this.x=x; } publicvoidsetY(Objecty){ this.y=y; } publicObjectgetX(){ returnx; } publicObjectgetY(){ returny; } } 下面开始设置不同的数据类型,以测试程序。 范例: 设置整型 publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Pointpoint=newPoint(); point.setX(10); point.setY(20); intx=(Integer)point.getX(); inty=(Integer)point.getY(); System.out.println("X的坐标是: "+x+",Y的坐标是: "+y); } } 范例: 设置小数 publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Pointpoint=newPoint(); point.setX(10.3); point.setY(20.4); doublex=(Double)point.getX(); doubley=(Double)point.getY(); System.out.println("X的坐标是: "+x+",Y的坐标是: "+y); } } 范例: 设置字符串 publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Pointpoint=newPoint(); point.setX("东经100度"); point.setY("北纬20度"); Stringx=(String)point.getX(); Stringy=(String)point.getY(); System.out.println("X的坐标是: "+x+",Y的坐标是: "+y); } } 看起来现在的功能都实现了,并且根据之前所学的内容,也只能做到这些了,但是本程序是否有问题? 本程序解决问题的关键就在于Object类,所有的类型都可以向Object转换,但是成是Object,败也是Object。 publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Pointpoint=newPoint(); point.setX(10);//此处设置成int型(Integer型) point.setY("北纬20度"); Stringx=(String)point.getX(); Stringy=(String)point.getY(); System.out.println("X的坐标是: "+x+",Y的坐标是: "+y); } } 这个时候并没有出现任何的语法错误,因为数组10被装箱成了Ingeger,可以使用Object接收,从技术上而言,本操作没有问题,但是从实际来讲,数据时有错误的,因为没有统一,所以在取得数据并且执行向下转型的过程之中就会出现如下的错误提示信息: Exceptioninthread"main"java.lang.ClassCastException: java.lang.Integer atcn.mldn.demo.TestDemo.main(TestDemo.java: 23) 所以,就可以得出一个结论: 以上的代码存在了安全隐患,并且这一安全隐患并没有在程序编译的过程之中检查出来,而现在就可以利用泛型来解决这种尴尬的问题? 泛型: 类之中操作的属性或方法的参数的类型不在定义的时候声明,而是在使用的时候动态设置。 classPoint privateTx; privateTy; publicvoidsetX(Tx){//T: Type this.x=x; } publicvoidsetY(Ty){ this.y=y; } publicTgetX(){ returnx; } publicTgetY(){ returny; } } 此时就表示point类之中的x和y两个属性的类型暂时还不知道,等待程序的时候动态配置。 范例: 使用泛型 publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Point point.setX("东经100度"); point.setY("北纬20度"); Stringx=point.getX(); Stringy=point.getY(); System.out.println("X的坐标是: "+x+",Y的坐标是: "+y); } } 此时没有了向下转型的这些操作关系,那么程序就避免了安全性的问题,而且如果设置的类型不统一,在程序编译的过程之中也是可以很好的解决了,直接回报出语法错误。 而当用户在使用Point类声明对象的时候没有设置泛型,那么程序在编译的过程之中会出现警告信息,而且为了保证程序不出现错误,所有的类型都将使用Object进行处理,使用泛型可以很好的解决数据类型的统一问题。 但是在此处需要提醒的是,JDK1.5和JDK1.7在定义泛型的时候是稍微有些区别的。 范例: JDK1.5的时候声明泛型对象操作。 Point 以上是JDK1.5的语法,在声明对象和实例化对象的时候必须都同时设置好泛型类型。 范例: JDK1.7的时候简化了 Point 这个时候实例化对象时的泛型类型就是通过声明时的泛型类型来定义了。 3.4.2、通配符(重点) 泛型的出现的确是可以解决了数据类型的统一问题以及避免了向下转型操作,但是又会带来新的问题,下面先通过一段程序来观察一下会产生什么问题? 范例: 定义一个简单的泛型类 classMessage privateTinfo; publicvoidsetInfo(Tinfo){ this.info=info; } publicTgetInfo(){ returninfo; } } 范例: 使用以上的类对象执行引用传递 publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Message msg.setInfo("HelloWorld"); print(msg); } publicstaticvoidprint(Message System.out.println(temp.getInfo());//只是输出 } } 但是,如果现在定义的泛型类型不是String了呢? 例如: 换成了int(不能写基本类型,只能是包装类)。 publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Message msg.setInfo(100); print(msg);//无法进行引用传递 } publicstaticvoidprint(Message System.out.println(temp.getInfo());//只是输出 } } 发现这个时候的print()方法无法再接收Message publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Message msg.setInfo(100); print(msg);//无法进行引用传递 } publicstaticvoidprint(Message System.out.println(temp.getInfo());//只是输出 } publicstaticvoidprint(Message System.out.println(temp.getInfo());//只是输出 } } 这个时候发现按照之前的方式根本就无法进行方法的重载,方法的重载没有说为一个类而定义的,因为方法重载的时候观察的不是泛型类型,而是类的名称,或者是数据类型的,那么现在就可以发现,这个给出了泛型类之后,就相当于将一个类又划分了若干个不同的小类型。 那么现在的问题: 方法接收的参数问题又严重了,而且比之前使用对象多态性解决问题时出现的麻烦更大了,至少那个时候可以利用重载来接收一个类的所有子类对象,而现在呢连重载的机会都不给了。 这个时候,有人提出来了,干脆在定义的时候就别写泛型类型了。 范例: 定义方法时不写上泛型类型 publicclassTestDemo{ publicstaticvoidmain(Stringargs[])throwsException{ Message msg.setInfo(100); print(msg); } publicstaticvoidprint(Messagetemp){ System.out.println(temp.getInfo());//只是输出 } } 虽然现在在print()方法的参数上出现了警告,但是现在的程序可算是正常了,但是新的问题又来了,问题就
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 91 第九天 魔乐java基础视频学习笔记 九天 魔乐 java 基础 视频 学习 笔记