黑马程序员java教程(共11篇)
篇1:黑马程序员java教程
【黑马程序员】Java基础 : Java语句笔记
摘要: Java基础—java语句这些是黑马程序员java基础入门的一个很重要的内容。今天主要给大家简单讲解一下Java基础—java语句,以后会慢慢讲解黑马程序员的课程内容!
关键语句介绍
一、while 语句 一般形式:
whi l e(条件表达式){ 语句体 ……… } 执行过程:
条件表达式为真,执行语句体。否则,退出!
二、do while 语句 一般形式: do { 语句体 …….} while(条件表达式);执行过程:
先执行一次语句体,判断 条件表达式是否为真,为真再执行do语句中的语句体。为假,退出。
需要注意:与whi l e语句区别
黑马程序员合肥中心 编著
1.while(条件表达式)后面有分号;2.不管条件表达式是否为真,语句体均会执行一次。
三、for 语句 一般形式:
for(子句 1;子句 2;子句 3){ 语句体 …… } 执行过程:
四、break、cont inue 语句 break 退出所在循环 : int stopHere = 5;for(int i=1;i<8;i++){ if(i == stopHere){ break;} System.out.println(“i = ” + i);
黑马程序员合肥中心 编著
} //打印结果:5,6,7,8均没有打印出来。
需要注意的一个问题: int stopHere = 5;for(int i = 1;i < 8;i + +){ if(i = = stopHere){ / /语句体 } break;System.out.println(“i = ” + i);} 这个时候编译器会报错:无效的 System.out 输出语句。冷静分析一下:
break 语句会结束循环,所以不会再去执行 System.out 输出语句。编译会认为你在多此一举,sorry 报个错!
continue 退出本次循环,不会退出整个循环: int skipHere = 5;for(int i = 1;i < 8;i + +){ if(i = = skipHere){ continue;}
黑马程序员合肥中心 编著
System.out.println(“i = ” + i);} / /打印结果:除了5没有打印出来。
i = 1 i = 2
五、switch 语句 一般形式: switch(常量){ case 表达式1:语句体1;break;case 表达式2:语句体2;break;.....default : 语句体n;break;}
执行过程: 执行过程:
case 根据自己的表达式看是否匹配常量,如果匹配就执行语句体,否则执行 default 语句。
case 执行类似于并行操作,不是顺序操作。所以各个表达式的值不可以相同。
黑马程序员合肥中心 编著
哪个 case 匹配常量就会执行自己的语句体,不会再去寻找其他 case 语句。注意:
<1> case 穿透:省去break关键字
01 /**
02 * @author 传智播客 03 */
04 int i = 10;05 switch(i){ 06 case 10:
07 System.out.println(“ A”);08 //break;09 case 5: System.out.println(“ B”);11 //break;12 case 7: System.out.println(“ C”);14 //break;15 default : System.out.println(“ error”);17 break;18 }//打印结果:A B C error
<2> 在 Java 编程中 switch 括号中的常量的数据类型只可以为 int 类型或者是 byte、char、short(因为 byte、char、short 可以自动提升为 int),常量类型不可以是 long、float 和 double 等数据类型。<3> 多个 case 可以合并 , 相当于 “ 或 ”,例如下面 i 等于 10、5、7 都可以执行打印语句。
[AppleScript] 纯文本查看 复制代码 ?
01 /**
02 * @author 传智播客 03 */
04 int i = 5;05 switch(i){ 06 case 10: 07 case 5: 08 case 7:
09 System.out.println(“ C”);10 break;11 default : System.out.println(“ error”);13 break;
黑马程序员合肥中心 编著 }//打印结果:C <4> default 语句可以省,但是不推荐,他后面的 break 可省 <5> case 或者 default 子句中可以写多条语句 case 7: System.out.println(“ C”);if(i == 5){ System.out.println(“ i = ” +i);} break;<6> case 或者 default 子句中还可以嵌套 switch 或者其他语句
六、return 语句
终止方法的运行并指定要返回的数据。两种形式:
<1> return 表达式;
<2> return ;没有任何数据直接返回,结束函数(方法)的执行。
七、if 语句
一般形式:
1.if(条件表达式){ 语句体} 2.if(条件表达式){ 语句体} else{语句体 } 3. if(条件表达式1){ 语句体} else if(条件表达式2){语句体 } else {语句体 }
特别注意:形式3,else与其最近的上个if 配对。例子:
[AppleScript] 纯文本查看 复制代码 ?
黑马程序员合肥中心 编著
01 /**
02 * @author 传智播客 03 */
04 public class TestIF {
05 public static void main(String[] args){ 06 int i = 30;07 if(i < 20){
08 System.out.println(“<20”);09 } else if(i < 50){ System.out.println(“<50”);11 } else if(i < 80){ System.out.println(“<80”);13 } else System.out.println(“>=80”);15 System.out.println(“黑马程序员!”);16 }
如果大家想学习java基础的知识,欢迎大家可以去传智播客官网http:///去了解java基础知识!
黑马程序员合肥中心 编著
篇2:黑马程序员java教程
在Java语言中,学好集合是非常重要的,下面简单的对集合进行总结,以便大家学习,有
问题再相互交流。
集合框架图
在集合框架图中可以看出,Collection接口中主要有两个子接口,分别是List和Set。List集合的特点是元素有序、包含重复元素,Set集合的特点是元素无序、不包含重复元素。Map集合中存储的是键值映射关系,元素都是成对出现的。Map接口的主要子接口有HashMap和TreeMap。
总结ist有顺序有重复没有排序,set无重复有排序,map的key也和set一样。
List接口
List : 特点是元素有序、可以包含重复元素。它有两个实现类分别是:ArrayList和LinkedList。
ArrayList : 内部维护一个数组结构,允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
LinkedList : 内部维护了一个双向链表结构,即通过节点之间彼此连接来实现的,每一个节点都包含前一个节点和后一个节点的引用。当一个新节点插入时,只需要修改其中保持先后关系的节点引用即可,这样的存储结构保证了LinkedList集合在增删元素时效率非常高。
Set接口
Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面的List。实际上Set就是Collection只是行为不同,也就是说Set集合并没有对Collection接口进行扩充,只是比collection接口要求更加严了。
Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。
HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet : 保存有序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
Map接口
Map用于保存具有映射关系的数据,因此Map集合里存储两组值,一组用于保存Map里的key,另一组用于保存Map中的value,key和value都可以是任意引用类型数据,其中,作为key的值是不允许重复的,而value中可以出现重复。Map : 维护“键值对”的关联性,使你可以通过“键”查找“值”。
HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显著提高性能。HashMap集合是基于哈希表的Map接口实现,并允许使用null键null值,但必须保证键的唯一性。
LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序。而在迭代访问时发而更快,因为它使用链表维护内部次序。
TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(顺序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。
Hashtable线程安全,但是存取速度很慢,且不允许存放null键null值,目前基本上被hashMap类所取代。Hashtable有一个重要的子类Properties。
Properties:java.util.Properties;key和value都是String类型,用来读配置文件。继承自Hashtable,比 Hashtable 更严格 属性列表中每个键及其对应值都是一个字符串。常用方法 String getProperty(String?key)和 setProperty(String key,String value);
用法:我在D盘下建了一个名为 AA.dat 的文件,文件的内容为:
name=ch
password=12345
篇3:Java开发目录同步程序
Java语言是一种十分流行的程序开发语言。由SUN公司推出, 具有简易性、健壮性、安全性、可移值性等许多特性。可以用它开发各种应用程序, 是目前主流的开发语言。这里使用Java语言开发一个实用的目录同步程序, 通过实例讲解基本的Java程序开发技术。
2 开发思路
在网络环境中, 往往存在这样的需求。网络中的一台或几台计算机需要和网络中的某一台计算机中的目录文件保持一致。也就要同步的目录名和文件名以及文件内容要完全一样。如果文件发生变化, 变化后的文件将被实时更新。要实现这样的功能, 可以设置有目录同步要求的计算机为服务器, 要进行同步的计算机设置为客户端。双方通过套接字传递数据, 完成同步的功能。
服务器端设置要进行同步的目录名, 然后扫描该目录下的文件, 将要同步的文件名、文件校验码、文件时间、文件大小信息传给客户端;客户端检查要同步的文件, 如发现文件不一致, 就进行文件同步, 如果一致, 就确认同步完成。
3 程序代码
程序中有如下类, 用于搜索目录, 并将搜索到的文件放到一个Array List中:
服务端和客户端按以下规则传递数据, 如表1所示。
使用如下类, 用于读写服务端套接字:
使用如下类, 用于读写客户端套接字:
使用如下类, 用于进行文件校验, 以保证文件可靠传输:
4 结语
程序经过测试, 完成了目录同步的功能, 可以在实际环境中使用。希望本开发实例对从事Java语言开发的读者有所帮助。
参考文献
篇4:Java程序混淆技术综述
关键词:Java程序;混淆技术;软件水印;防篡改;软件版权保护
中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2012) 09-0000-02
人们对于计算机的依赖性随着软件技术的不断给人们带来便利和乐趣,使工作更富有主动性和操作性,但是任何事物在发展过程中都会有其负面效应与之相对,随着计算机软件应用量和种类的不断扩展,其使用安全问题便开始影响到人们的正确使用,并开始逐渐打击使用计算机的积极性,以及对于安全问题的无奈。主要攻击形式是通过对软件备份的破坏而直接将软件彻底摧毁,根据现有问题,当前的软件已经经过改良,重新调试,但是攻击则换角度也将攻击破解方式进行重组,使改良的部分无法发挥其作用,这样软件就不会得到应有的保护,依旧能够以非正规途径得到软件的任何数据,从而进行大面积的传播,这也就是为何当今软件盗版现象严重的途径之一。Java程序的出现,首先能够在网络上加快传播速度并且无客观條件可以轻松普及,但同时却能够通过无关性对产权进行有效的保护,不会轻易的被人盗用。
一、软件混淆技术基本原理
(一)基本释义
软件混淆技术是为了能够在软件受到侵害或是盗用时可以被保护的一种现代技术,软件技术首先咋1977年新西兰首次被提出,其实是将原有的程序的语言转换成一种密码语言,不能被一般的软件所识破的一种转换,并且研制出能够对这种转换进行评估的理论计算。转换的形式未变,只是在形式上保留原有的运行根组成,添加一些其他能够扰乱破坏和读取的程序代码。如今混淆技术开始不断的发展,诸多的被应用于产权的保护中,所谓的混淆就是通过语词的转变但保持其语义依然与之前相同,这就能保证软件在使用时功能是不变的,却能够防止逆向工程攻击和被静态分析。
(二)软件混淆技术的分类
当Java文件经过处理,在原有的基础上添加了其他程序代码成为类文件,这种类文件包括魔数( magic number) 、版本( version) 、常量池( constant pool ) 、访问标识( access flag s) 、(this)类、(super)类、接口( interfaces) 、域( fields) 、方法(methods) 和属性(attributes) 。
软件混淆主要通过类内混淆和类间混淆来根据不同的使用对象进行划分,类内混淆主要是克服(methods)中的code字段,而类间混淆却是针对多种类文件的综合体进行混淆处理,其主要的方式是合并和拆分相对的过程处理。
下面分别介绍两种混淆。
(1)、类内混淆
能够支持类内混淆的途径有数据混淆、控制混淆、切片混淆以及针对特定工具混淆四种。数据混淆是对数据的结构组成元素原有的书写方式进行修改,使其不再成为能够被认知的程序。主要有:变量存储和编码混淆、变量聚合混淆、顺序调整混淆、词法混淆以及移除注释和调试信息混淆。控制混淆是在信息传输过程中的保护,主要采取追踪定位等方式实时监测信息的状态,从而对其他袭击系统进行抵御。切片混淆,正常在一般的软件中问了能够让计算机更好的识读软件,所以增加了切片以帮助更好的理解,降低难度,而混淆了切片则能够使其首先无法有助于难度的下降,另外会造成对于程序的误导可能降低了或是更改了某些其他的程序,达到了增加难度混淆的目的。针对特定工具混淆软件为了能够起到保护作用,本身具有一定的反编译和反混淆的功能,会在一定的紧急时刻自动启动,而针对特定工具就是抑制了自动的传导,对于能够使软件本身内部之间的反编译都可以正常的进行,但是对于外部的反编译就不会在自动启动,这就是混淆的高级之处。相区别与前三者人的行为,针对特定工具混淆具有自动的功能针对的是自动化。如果能够与以上三种任意搭配就能够达到防住人机的共同目的。
(2)、类间混淆
类间混淆是合并拆分类文件而造成混淆的目的其中又有三种表现形式:类合并、类拆分、隐形类间混淆。类合并是要面对多个文件的自身组成的函数变量,通过将函数、变量的名称进行更改,注意在更改过程中一定不能同时出现两个或以上的名子,如果在合并中有参数同系统提示无法进行更改,则要为其中一个虚拟一个参数。另外如果合并文件中有继承关系的则需要在合并成功后加入一个布尔型的私有变量用于区分标识符相同的函数。类拆分则是观察现有的文件是否进行拆分,同时并作出相应的调整。对于结果是可拆分的类就是将A拆分为A1与A2,为了能够使A的要素都能够实现所以应该是A2处于继承A1关系。类型隐藏是通过接口来实现混淆,并且能够保证原文件并不需要改变接口,所以被称为隐形。相比类合并,类拆分和隐形类间混淆所用的时间相对较短。
二、软件混淆算法的攻击模式
(一)混淆算法的理论研究
混淆技术的提出者曾经试图将整个运行过程当做是一个虚拟黑箱来看,也就是说对于其他程序来说这就完全是另外一个软件和原软件无任何联系,从它的输入和输出的方式内容和代码都不同,这种在理论中是可以站的住的,但是在实际操作中会受到很多因素的限制,但在相对宽松的要求下还是可以实现混淆技术的使用。后来又根据该理论研究通过点函数来实现虚拟黑箱,总而言之其未来的研究空间还有很大,期待它的日益成熟。
(二)混淆算法的攻击模式
1.针对数据混淆算法的攻击
假定T 是对程序P 的一个单向的混淆变换,当且仅当从原始程序P 除去某些信息后,无法通过混淆后的程序Pc恢复出P。词法变换是最典型的不可逆混淆算法。虽然对于经过词法变换的程序进行攻击不可能恢复程序的原貌,但只要理解程序各个模块的含义就可能对程序产生威胁。例如根据无法被混淆的系统API 名称等关键字,攻击者可以推测出该模块的大致功能。
2.针对控制流混淆算法的攻击
目前,针对控制流混淆算法的主要攻击方法是动态分析。动态分析对大部分混淆算法的攻击作用,并阐述攻击模型. 对于控制流混淆而言, 变换后生成的程序中若存在始终不执行的分支,通过动态分析就能找到对破解程序有用的信息.针对控制流混淆,还有黑盒测试攻击, 该方法通过对程序进行黑盒测试,了解各个类及其函数的功能, 从而获取攻击者需要的信息. 这种方法对大多数的混淆变换均能加以攻击。同时,该方法也存在着一定的局限性: 黑盒测试缺乏自动分析工具,需要依靠大量的人力来完成分析工作。
三、对于混淆技术的未来预估
混淆技术是一种可用于抵制逆向工程和重组工程、对软件知识产权进行保护的程序变换技术。使用混淆技术虽然会使代码的效率有一定程度的降低,但是它的实现代价相对较小, 因而在近年引起了广泛的关注.由于混淆技术不改变程序功能的特性, 并且有些词法混淆算法甚至可以减小原程序的体积, 因此混淆技术得以在保护移动代码方面得到广泛的应用. 受移动平台资源的限制,今后混淆技术的研究方向一方面要加大混淆的力度,增加攻击者反编译的难度,另一方面也要考虑降低混淆算法对目标程序的运行负担。文献探讨了混淆技术在移动代理上的应用。目前保护软件知识产权的新技术主要有3种:混淆技术、软件水印技术和防篡改技术。这3种技术各有特长,将它们互相结合使用,可以给予目标软件更为可靠的保护,这也是目前研究的一个重要方向。对于混淆算法的评估、正确性验证以及如何研制高效可靠的混淆算法, 也是将来的发展方向之一。
四、总结
混淆技术是对软件进行的基础产权保护,为了能够增加破译的难度和代价,从而使产权盗版的情况发生率降低,同时还能提高软件水银的鲁棒性,有人提出将程序的编译混淆, 而不是混淆程序本身。但是该方法还有若干问题需要考虑。使软件的安全度进一步提升,给人们的使用带来了更多的福音,虽然该技术已经广泛运用也颇收到好评,在技术上依旧有大的发展前景,需要投入更多的研究力量。
参考文献:
[1]霍建雷,范训礼,房鼎益.Java标识符重命名混淆算法及其实现[J].计算机工程,2010,第1期
[2]咸星海.面向对象代码混淆技术研究及软件实现[J].中国科技博览,2010,第19期
[3]刁俊峰.软件安全中的若干关键技术研究[D],北京:北京邮电大学,2007
[4]李新良,罗戈夕.基于Java的代码混淆算法研究[J].湖南文理学院学报:自然科学版,2010,第3期
[5]霍建雷,范训礼.房鼎益,Java标识符重命名混淆算法及其实现[J].计算机工程,2010,第1期
[6]李婧.基于控制流混淆轉换的代码保护技术[J].计算机安全,2009,第8期
[7]袁征,冯雁,温巧燕,张华.构造一种新的混淆Java程序的不透明谓词[J].北京邮电大学学报,2007,第6期
篇5:黑马程序员java教程
最近有很多同学,就算是就业班毕业之后,还依然在问 java方法的调用中值的传递问题,实际参数究竟什么时候才会改变?接下来我们先由一个例子来引出大家的问题,请看如下例子,并回答 下面代码中的四个问题 public class Demo { public static void main(String[] args){ int a = 10;change(a);System.out.println(a);// 1:请问输出什么?
String str = “abc”;change(str);System.out.println(str);// 2:请问输出什么?
Student s = new Student(“张三”,13);System.out.println(s);// 输出 Student [name=张三, age=13] change(s);System.out.println(s);// 3:请问输出什么? change1(s);System.out.println(s);// 4:请问输出什么? }
public static void change(String s){ s = s+“def”;} public static void change(int a){ a = a + 10;} public static void change(Student s){ s = new Student(“李四”,14);} public static void change1(Student s){ s.setName(“李四”);s.setAge(14);} } 大家看完上面的题目之后,估计有很多同学能回答出前两问,1:输出10, 2:输出abc,因为这类的参数传递在咱们java基础课程的第5天和第13天都有讲到。但是虽然讲了,但
黑马程序员济南中心 编著
是有很多同学都没有充分的理解透彻,这也就是为什么大家回答不出 第三问 和 第四问 的原因。实际上第三问的答案是 3:输出Student [name=张三, age=13] 4:Student [name=李四, age=14]。下面我就给大家讲解一下。
首先用一句话来归纳java中参数传递:不管是基本类型还是引用类型: 形式参数做赋值操作的时候,实际参数不发生改变,如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变。1.不管是基本类型还是引用类型: 形式参数做赋值操作的时候,实际参数不发生改变
(当被调用的方法开始执行的时候,就从方法区里面把方法拿到了栈内存中,形式参数变量也根据传递过
去的值进行初始化,当方法用完了,那么该方法在栈内存中的变量也消失了。在所以也就是只在栈内存
中对方法里面变量进行了改变,是不影响实际参数的。而加减乘除、赋值[就算是引用类型之间的赋值,是
不是也只是在栈内存中把地址值进行的赋值]这一系列的赋值操作都是在栈内存中对方法里面变量进行了改
变,而方法执行完毕后 从栈内存中消失了,回到了调用这个方法 的 main方法栈内存中,实际参数原来是
什么 现在依然是什么)
2.如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变
(对于引用类型,它随着参数传递到方法里面去的是地址值,指向的是堆中的对象,如果在方法里面通过
这个地址值改变对象内部的一些属性,即使方法用完了,方法里面的变量的地址值的黑马程序员济南中心 编著
指向也消失了,但是
对象内部的一些属性还是已经改变了,这些属性不会消失[因为在堆内存中],所以实际参数还是会改变。如
果是基本类型,根本在堆内存中没有指向,基本类型都在栈内存或者常量池[值更不能被改变]中,所以基本
类型形式参数的改变无论如何是改变不了实际参数的)
3.看完上面的两句话和解释,相信大家还是觉得比较抽象,下面我给大家准备了一个代码案例,每一行代码都有对应的解释,看完下面的案例后估计大家就会真正的明白java中参数传递,参数改变时机的问题了
public class Demo2 { public static void main(String[] args){
int a = 10;int b = 20;
System.out.println(a+“ ”+b);//10 20 change1(a,b);//形式参数做赋值操作的时候,实际参数不发生改变
//基本类型一般都在栈内存中(所以 堆内存中没有指向 内部也就没有东西嘛),//所以值能做一些加减乘除、赋值的操作,//而做完了这些操作,就在占内存中消失了,所以不会影响实际参数 System.out.println(a+“ ”+b);//10 20
System.out.println(“-------------------”);
Student s = new Student();System.out.println(s);//Student [name=null, age=0]
change2(s);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变 System.out.println(s);//Student [name=hehe, age=1]
System.out.println(“-------------------”);
黑马程序员济南中心 编著
String string = “abc”;System.out.println(string);//abc
change3(string);//详见方法内部注释
//形式参数做赋值操作的时候,实际参数不发生改变 System.out.println(string);//abc
System.out.println(“-------------------”);
StringBuffer sb = new StringBuffer(“hello”);System.out.println(sb);//hello
change4(sb);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变 System.out.println(sb);//helloworld
System.out.println(“-------------------”);
int[] arr ={1,2,5,8,4,3};System.out.println(Arrays.toString(arr));//[1, 2, 5, 8, 4, 3] change5(arr,0,1);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变 System.out.println(Arrays.toString(arr));//[2, 1, 5, 8, 4, 3]
Arrays.sort(arr);System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5, 8]
System.out.println(“-------------------”);
StringBuffer sb1 = new StringBuffer(“abcd”);StringBuffer sb2 = new StringBuffer(“efgh”);change6(sb1,sb2);//详见方法内部注释 System.out.println(sb1);//abcd
//形式参数做赋值操作的时候,实际参数不发生改变
System.out.println(“-------------------”);Student s1 = new Student(“hehe”,1);Student s2 = new Student(“haha”,20);change7(s1,s2);//详见方法内部注释
//形式参数做赋值操作的时候,实际参数不发生改变
System.out.println(s1);//Student [name=hehe, age=1]
} private static void change7(Student s1, Student s2){ //引用类型s1指向的是一个地址值,s2也是指向的地址值,那么把s2的地址值赋给了s1,这
黑马程序员济南中心 编著
时候s1指向的地址
//值改变了,而s1内部(堆内存)的东西改变了吗?没有啊,等这个方法调用完毕了,地址值的指向也都消失了,//s1还是指向原来的地址值,原来的地址值内部(堆内存)的东西还是没有改变,所以 赋值操作不会影响实际参数 s1=s2;} private static void change6(StringBuffer sb1, StringBuffer sb2){ //引用类型sb1指向的是一个地址值,sb2也是指向的地址值,那么把sb2的地址值赋给了sb1,这时候sb1指向的地址
//值改变了,而sb1内部(堆内存)的东西改变了吗?没有啊,等这个方法调用完毕了,地址值的指向也都消失了,//sb1还是指向原来的地址值,原来的地址值内部(堆内存)的东西还是没有改变,所以 赋值操作不会影响实际参数 sb1=sb2;} private static void change5(int[] arr, int i, int j){ //引用类型arr指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的值发生改变了,//即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数 int temp = arr[i];[/i] [i] arr = arr[j];[/i] [i] arr[j] = temp;[/i]
[i] }[/i] [i] private static void change4(StringBuffer sb){[/i] [i] //引用类型sb指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的字符长度改变了,[/i]
[i] //即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数[/i] [i] sb.append(“world”);[/i]
[i] }[/i] [i] private static void change3(String string){[/i] [i] //String也是一个引用类型,但是String的值是放在了常量池中,而且常量池中的值是不能被改变的[/i]
[i] //在方法里面这个string所代表的是常量池中值得地址值,那么我说string += “def”这句话在常量池中其实是这样的:“找有没有abcdef,如果有就把abcdef的地址值赋给string[/i]
[i] //如果没有就在常量池中创建一个abcdef 并把地址值赋给string”。然而当我方法用完了 string代表的地址值的指向也消失了,那么原来main方法中的string
黑马程序员济南中心 编著
也不发生改变[/i]
[i] string += “def”;[/i]
[i] }[/i] [i] private static void change2(Student s){[/i] [i] //引用类型s指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的属性改变了,[/i]
[i] //即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数[/i] [i] s.setName(“hehe”);[/i] [i] s.setAge(1);[/i]
[i] }[/i] [i] private static void change1(int a, int b){[/i] [i] int temp = a;[/i] [i] a= b;[/i] [i] b=temp;[/i]
[i] }[/i] [i]} 当大家看完这个例子的时候,相信很多同学有一种恍然大悟的感觉,终于搞明白为什么参数传递的时候,实际参数有什么改变有时候不改变。如果大家还有什么疑问需要一起交流,请在下面直接给我留言就可以了,或者直接来济南黑马程序员找大山哥哥来咨询,我会亲自给同学讲解
篇6:黑马程序员java教程
考试宣言: 同学们, 考试考多少分不是我们的目的!排在班级多少的名次也不是我们的初衷!我们考试的目的是要通过考试中的题目,检查大家在这段时间的学习中,是否已经把需要掌握的知识掌握住了,如果哪道题目你不会做,又或者做错了, 那么不用怕, 考完试后, 导师讲解的时候你要注意听!那时候学会了, 记住了, 也一样不影响你高薪就业!
本套题共40道不定项选择题,其中单选30道,多选10道。单选2分/题,多选4分/题。多选题不全对半分,全对满分。
1.所有异常的父类是()A a)Throwable类 b)Error类
c)Exception类
d)RuntimeException类
2.下列关键字能和try一起使用的有()CD a)final b)finalize c)finally d)catch
3.实现下列哪个接口,可以启用序列化功能()b a)Runnable接口
b)Serializable接口 c)Comparable接口 d)Comparator接口
4.当方法遇到异常(编译时异常)又不知如何处理时,下列哪种说法是正确的()C a)捕获异常(try{…}catch{…})b)抛出异常(throw 异常对象)c)声明异常(throws 异常类型)d)嵌套异常
5.如何自定义一个异常类()AB a)让这个类继承Exception b)让这个类继承RuntimeException c)让这个类继承Comparator d)让这个类继承Comparable
6.可以用来操作路径的类是()a a)File b)FileStream c)OutputStream d)FileReader
7.File类中,创建多级目录,可以通过以下那个方法()d a)create()b)createNewFile()c)mkdir()d)mkdirs()
8.下列哪一个import命令可以使我们在程序中创建输入/输出流对象()B a)import java.sql.*;b)import java.io.*;c)import java.net.*;d)import java.util.*;
9.下列关于Java中文件输入输出的说法正确的是()A a)在Java中,文件的输入输出功能是通过流来实现的
b)如果要把数据写入一个文件中,需要创建一个输入流对象 c)字符流在某些方面比如图片的处理,比字节流更方便x d)可以通过Reader r = new Reader(“c:java.txt”);创建一个输入流对象
10.获取指定目录下所有的文件,可以通过哪个方法实现:()D a)b)c)d)
list()getDir();listFile()listFiles()11.下面用字符流能成功拷贝的文件有()BC a)java基础自测题.doc b)学生考试答案.xml c)Student.java d)学生信息表.xlsx
12.看下面程序,加入xxx.txt里面有一个文字”a”,请问该程序输出结果是()D public static void demo1()throws FileNotFoundException, IOException {
InputStream is = new InputStream(“xxx.txt”);
int x = is.read();
System.out.println(x);} a)A b)a c)97 d)编译报错
13.如果我想保留a.txt中原有的内容,在后面追加写入数据,下面创建输出流对象写法正确的是()B a)FileOutputStream fos = new FileOutputStream(“a.txt”);
b)FileOutputStream fos = new FileOutputStream(“a.txt”,true);c)BufferedOutputStream bos = new BufferedOutputStream(“a.txt”,true);d)OutputStreamWriter osw = new OutputStreamWriter(new InputStream(“a.txt”,true),”gbk”);
14.下面关于字节流说法不正确的是()BC a)字节流拷贝文件时一次读取一个字节 b)字节流拷贝文件时一次读取两个字节
c)字节流使用完后需要关,内存输出流使用完后也必须要关闭 d)FileOutputStream没有缓冲区,而FileWriter有缓冲区
15.判断一个文件的大小我们可以使用哪个方法(AD)
a)File类的length()方法
b)File类的available()方法
c)FileInputStream类的length()方法 d)FileInputStream类的available()方法
16.已知 海贼王全集.avi 这个文件有20Gb 的大小,复制该文件最快的方式是()D a)
FileInputStream fis = new FileInputStream(“双元.jpg”);
FileOutputStream fos = new FileOutputStream(“copy.jpg”);
int b;
while((b = fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();b)
c)
d)
FileInputStream fis = new FileInputStream(“致青春.mp3”);FileOutputStream fos = new FileOutputStream(“copy.mp3”);byte[] arr = new byte[fis.available()];
fis.read(arr);
fos.write(arr);
fis.close();fos.close();
FileInputStream fis = new FileInputStream(“xxx.txt”);FileOutputStream fos = new FileOutputStream(“yyy.txt”);
byte[] arr = new byte[1024];int len;while((len = fis.read(arr))!=-1){ fos.write(arr,0,len);}
fis.close();fos.close();
FileInputStream fis = new FileInputStream(“xxx.txt”);FileOutputStream fos = new FileOutputStream(“yyy.txt”);
byte[] arr = new byte[1024*8];int len;while((len = fis.read(arr))!=-1){
fos.write(arr,0,len);}
fis.close();fos.close();17.BufferedInputStream这个类是哪个设计模式的体现()B a)单例设计模式 b)装饰设计模式 c)工厂设计模式 d)适配器模式
18.下面说法正确的是()D a)OutputStream是个接口 b)Writer是个接口
c)BufferedOutputStream是FileOutputStream的父类x d)Reader是InputStreamReader的父类
19.下列关于Java I/O中字符输入流Reader类中的read方法描述错误的是?(A)
a)read()方法的返回值类型为char类型 b)read()方法的返回值类型为int类型
c)read()方法的返回值如果为-1,表示到流的末尾
d)read(char[] cbuf)方法表示将读到的多个字符存入字符数组cbuf中
20.下列哪些选项是Java I/O中字符输出流FileWriter类中的write方法?()ABCD a)write(char[] cbuf)写入字符数组
b)write(char[] cbuf, int off, int len)写入字符数组的某一部分 c)write(int c)写入单个字符 d)write(String str)写入字符串
21.假设存在xxx.txt文件,内容为”大家好”,以下代码运行的结果为?(A)public class Test { public static void main(String[] args)throws IOException {
FileReader fr = new FileReader(“xxx.txt”);
FileWriter fw = new FileWriter(“zzz.txt”);
int c;
while((c = fr.read())!=-1){
fw.write();
}
fr.close();
fw.close();} } a)b)c)d)
编译报错
程序正常运行,zzz.txt文件中的内容为”大家好” 程序正常运行,但是没有生成zzz.txt文件 程序正常运行,但是zzz.txt文件中是乱码
22.FileWriter类直接继承哪个类?(A)
a)OutputStreamWriter b)Writer c)BufferedWriter d)InputStreamReader
23.关于自定义字符数组拷贝文件的说法错误的是?()AC a)自定义的数组越大越好
b)自定义的数组既不能太大,也不能太小
c)可以使用FileReader类的available()方法的返回值作为数组的大小
d)建议定义为1024的整数倍,但不能太大,防止内存溢出
24.假设xxx.txt文件中存了2000个汉字,下列程序运行后输出的结果是?(B)
public class Test { public static void main(String[] args)throws IOException {
FileReader fr = new FileReader(“xxx.txt”);
FileWriter fw = new FileWriter(“yyy.txt”);
int count = 0;
char[] arr = new char[1024];
int len;
while((len = fr.read(arr))!=-1){
count++;
fw.write(arr,0,len);
}
fr.close();
fw.close();
System.out.println(count);} }
a)1 b)2 c)3 d)4
25.下面的哪个类代表字节输入流到字符输入流转换的桥梁?()A a)InputStreamReader b)OutputStreamWriter c)FileReader d)BufferedReader
26.BufferedReader读取一行时,判断该行是否结束的标志是什么?()AD a)
r b)
null c)
-1 d)
rn
27.缓冲流是否需要关闭()B a)否 b)是
c)以上答案都不对 d)关不关都可以
28.以下代码运行后输出的结果是?(A)
public class Test { public static void main(String[] args)throws IOException {
System.out.println(fun(5));} public static int fun(int num){
if(num == 1){
return 1;
}else {
return num * fun(num2)+ fun(num-1);
} } } a)34 b)13 c)21 d)5
30.为了提高读写性能,用下面的哪些流?()ABCD a)BufferedInputStream b)BufferedOutputStream c)BufferedReader d)BufferedWriter
31.下列关于Java I/O中哪个流可以将多个文件中的内容合并到一个文件中(序列流)?(cC a)SequenceOutputStream b)InputStreamReader c)SequenceInputStream d)OutputStreamWriter
32.下面的哪个流表示内存输出流?()A a)ByteArrayOutputStream b)ByteArrayInputStream c)ObjectInputStream d)ObjectOutputStream
33.下面说法正确的是?()b a)可以通过ByteArrayOutputStream和ByteArrayInputStream实现文件的复制)b)不可以通过ByteArrayOutputStream和ByteArrayInputStream实现文件的复制 c)用ByteArrayOutputStream和ByteArrayInputStream实现文件的复制,会出现乱码 d)用ByteArrayOutputStream和ByteArrayInputStream实现文件的复制,不会出现乱码
34.下面说法错误的是?()D a)ByteArrayOutputStream内部封装了字节数组
b)new ByteArrayOutputStream()利用空参构造创建对象时,内部的数组的大小为32 c)toByteArray()以字节数组的形式返回数据 d)以上说法都不对
35.关于对象操作流的描述正确的是?()A a)ObjectOutputStream流是将对象以Object类型写入到文件中 b)ObjectOutputStream流是将内容写入到Object对象中 c)ObjectInputStream流是读取Object对象里的内容
d)ObjectInputStream是从文件中读取一个对象出来,读出来是Object类型的,需要进行强制类型转换
36.ObjectOputStream类中的哪个方法可以将对象写入到文件中?()C a)write(Object obj)b)append(Object obj)c)writeObject(Object obj)d)objectWrite(Object obj)
37.下列选项中哪个不属于I/O流?()C a)FileWriter b)FileReader c)Properties d)PrintStream
38.下列说法不正确的是()D a)Properties 类表示了一个持久的属性集L b)Properties 可保存在流中或从流中加载L c)属性列表中每个键及其对应值都是一个字符串L d)以上说法都不对
39.以下代码运行后输出的结果是?()C public class Test { public static void main(String[] args)throws IOException {
Properties prop = new Properties();
prop.setProperty(“name”, “张三”);
prop.setProperty(“tel”, “***”);
Enumeration
while(en.hasMoreElements()){
String key = en.nextElement();
String value = prop.getProperty(key);
System.out.print(value + “:”);
} } } a)b)c)d)name:tel tel:name 张三:***: ***:张三
40.关于Properties类中的load和store方法说法正确的是?()AB a)load方法从流中读取属性列表,键值对,加载到Properties对象中 b)store方法将Properties对象中的键值对,写入到流中
c)load方法将Properties(Properties)对象中的内容加载到文件中
篇7:黑马程序员java教程
Oracle 中的日期型数据实际含有两个值: 日期和时间。默认的日期格式是 DD-MON-RR.函数SYSDATE 返回: 日期 时间
在日期上加上或减去一个数字结果仍为日期。两个日期相减返回日期之间相差的天数。
可以用数字除24来向日期中加上或减去小时。
日期的数学运算
日期函数
转换函数
隐式数据类型转换
篇8:黑马程序员java教程
降序排序
按别名排序
多个列排序
ORDER BY子句
排序的规则
可以按照select语句中的列名排序 可以按照别名列名排序
可以按照select语句中的列名的顺序值排序 如果要按照多列进行排序,则规则是先按照第一列排序,如果相同,则按照第二列排序;以此类推
Desc:
篇9:黑马程序员java教程
/bin:存放的是一些二进制文件,但是在Linux中二进制文件是可以被执行的。这个目录中的命令文件是给普通用户使用(非超级管理员用户)。/etc:Linux下所有的配置文件都会存放到etc目录。/home:是所有非root用户家目录的一个集合。/root:root用户的家目录。
/sbin:sbin表示superbin,里面同样也类似于bin目录,也存放了一些二进制文件,只不过这些命令只能是让超级管理员去运行。
/usr:存放着一些用户自己安装的软件,其实类似于windows下的Program Files目录。/var:存放着Linux下的一些日志文件,在实际开发的时候有一些公司也习惯把Apache或者nginx的站点目录也会放到这个目录中。
命令行
在Linux中如何打开命令行界面?
打开方式:在Linux中的任意一个空白的地方(不要点着图标),右键然后选择【在终端中打开】,会看到一个类似于下面界面的窗口:
命令行符号介绍:
关于用户身份标记说明:
篇10:黑马程序员java教程
DOM(文本对象模型(Document Object Model))W3C组织推荐的处理可扩展标志语言的标准编程接口。W3C的DOM,可以使程序或脚本(JS或AS、JScript),动态的访问或操作文档的内容、结构、样式。
DOM只是一个标准,就是操作网页的标准。而这个标准(模型)在浏览器中,以“对象”的方式实现。DOM的分类
核心DOM:提供了操作HTML文档(显示)或XML文档(存储数据)的公共的属性和方法。
HTMLDOM:针对HTML文档,提供的专有的属性和方法。EventDOM:事件DOM,提供了很多的常用事件。CSSDOM:提供了操作CSS的一个接口。HTML节点树
DOM中节点的类型:
document文档节点:代表整个网页,document文档节点不对应标记。是访问文档中各元素的起点。
element元素节点:元素节点对应于网页中的各标记。attribute属性节点:每个元素都有若干个属性。Text文本节点:文本节点是最底层节点。核心DOM公共属性和方法 nodeName:节点名称。nodeValue:节点的值。firstChild:第一个子节点。lastChild:最后一个子节点。parentNode:父节点。
childNodes:子节点列表,是一个数组。节点访问
查找html节点的方法 document.firstChild
document.documentElement(兼容性较好)查找body节点的方法
document.firstChild.lastChild document.body(推荐使用)节点属性
1、getAttribute()——获取属性的值
描述:获取节点属性的值。
语法:nodeObj.getAttribute(name)参数:name代表当前节点的某个属性。举例:var src = imgObj.getAttribute(“src”)
2、setAttribute()——添加属性 描述:给某个节点添加属性。
语法:nodeObj.setAttribute(name,value)参数:
name代表属性名称。value代表属性的值。
举例:imgObj.setAttribute(“src” , “images/02.jpg”)
3、removeAttribute()——删除属性 描述:删除某个节点的属性。
语法:nodeObj.removeAttribute(name)举例:imgObj.removeAttribute(“src”)案例:
//当网页加载完成,调用JS程序
window.onload = function(){
} //函数:删除src属性
function removeImg(imgObj){ //删除src属性 //查找img节点
var imObj = document.body.firstChild;//向img节点添加src属性
imgObj.setAttribute(“src”,“images/01.jpg”);//向img节点添加width属性 imgObj.setAttribute(“width”,400);//向img节点添加border属性 imgObj.setAttribute(“border”,2);//向img节点添加style属性
imgObj.setAttribute(“style”,“padding:20px”);//向img节点添加onclick属性
imgObj.setAttribute(“onclick”,“removeImg(this)”);
} imgObj.removeAttribute(“src”);imgObj.removeAttribute(“width”);
篇11:黑马程序员java教程
--第二种解决办法:--1,先跨表查询自己,先求出的结果中,e1.sal不可能出现最大数--2,然后再not in select e2.sal from emp e1,emp e2 where e1.sal>e2.sal select sal from emp where sal not in(select e2.sal from emp e1,emp e2 where e1.sal>e2.sal)
-----求平均薪水最高的部门的部门编号--第一种解决办法:--1,先求出每个部门的平均薪水, select deptno,avg(sal)avg_sal from emp group by deptno--2,再求每个部门的平均薪水的最高值, select max(avg_sal)from(***1111111111)--3,最后再求第一步结果中avg_sal = 最高薪水的记录.select deptno from(111111111111)where avg_sal =(22222222)
select deptno from(select deptno,avg(sal)avg_sal from emp group by deptno)where avg_sal =(select max(avg_sal)from(select deptno,avg(sal)avg_sal from emp group by deptno))
--没法考虑并列第一的情况 select deptno from(select deptno,avg(sal)avg_sal from emp group by deptno order by avg(sal)desc)
where rownum<=1
--第二种解决办法:--1,将上面的第一步第二步合并,先求最高平均薪水,用max(avg(sal))的办法--不能写成select deptno,max(avg(sal))from emp group by deptno select max(avg(sal))from emp group by deptno--2,求出每个部门的平均薪水
select deptno,avg(sal)avg_sal from emp group by deptno--3,最后再求第二步结果中(即每个部门的平均薪水),avg_sal =(第一步结果)的记录.即avg_sal =最高薪水的记录.select deptno from(select deptno,avg(sal)avg_sal from emp group by deptno)where avg_sal =(select max(avg(sal))from emp group by deptno)
--第三种解决办法:--1,先求出每个部门的平均薪水, select avg(sal)avg_sal from emp group by deptno--2,求最高平均薪水,用max(avg(sal))的办法
select max(avg(sal))from emp group by deptno--3,再使用having语句, avg(sal)= 第二步的结果 注意:为组函数起的别名在having中不能用
select deptno from emp group by deptno having avg(sal)=(select max(avg(sal))from emp group by deptno)
-----求平均薪水最高的部门的部门名称--1,部门平均最高薪水
--2,得到部门编号列表,注意用group by deptno--3,再应用having子句, having avg(sal)=(第一步的结果)--4,得到平均最高薪水的那个部门的编号--5,再得到部门名称
select dname from dept where deptno in(select deptno from(select deptno,avg(sal)avg_sal from emp group by deptno)
where avg_sal =(select max(avg_sal)from(select deptno,avg(sal)avg_sal from emp group by deptno)))
-----求平均薪水的等级最低的部门的部门名称
--第一步:部门平均薪水的等级,分成两个小步骤,第一小步是求部门平均薪水
select * from(select deptno,avg(sal)avg_sal from emp group by deptno)t join salgrade on avg_sal between losal and hisal
--第二步:最低的等级值
select min(grade)from(***1111111111)
--第三步:等于最低值的部门编号------------有错误,应该是grade= select deptno from(111111111111)where grade =(22222222222222)--第四步:求名称
select dname from dept where deptno in(33333333333)select dname from dept where deptno in(select deptno from(select * from(select deptno, avg(sal)avg_sal from emp group by deptno)t join salgrade on avg_sal between losal and hisal)where grade =(select min(grade)from(select * from(select deptno, avg(sal)avg_sal from emp group by deptno)t join salgrade on avg_sal between losal and hisal)))
--也可以用视图的方式来解决--conn sys/bjsxt as sysdba--grant create table, create view, create sequence to scott--根据第一步的结果,建立一个view
create or replace view v1 as--必须明确定义列
select deptno, avg_sal, grade from(select deptno,avg(sal)avg_sal from emp group by deptno)t join salgrade on avg_sal between losal and hisal
--查看一下
select * from v1--查询一下
--带入view
相关文章:
Java从入门到精通读书笔记—c++程序员学java01-20
2025年对领导意见和建议评价 领导个人评价意见建议报告(大全15篇)01-20
对医院领导班子的评价意见和建议(三篇)01-20
java程序员笔试面试题01-20
成都java培训机构哪家好?Java程序员应该具备哪些知识01-20
java程序员求职信01-20
长沙java培训:java程序员面试题01-20
java程序员经典笔试题01-20