├── 2.txt └── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Youtube 视频: 2 | 3 | + [循序渐进学java从入门到精通 - 韩顺平](https://www.youtube.com/playlist?list=PL3rfV4zNE8CDPMYudVYZvNQU3LUQ72Mx0) 4 | 5 | + 第00讲 开山篇 6 | 7 | # java平台 8 | 9 | 1. J2SE java开发平台标准版 10 | 2. J2EE java开发平台企业版 11 | 12 | 13 | java程序需要在虚拟机上才可以运行,换言之只要有虚拟机的系统都可以运行java程序。不同系统上要安装对应的虚拟机才可以运行java程序 14 | 15 | ## 开发步骤 16 | 17 | 1. 编写源文件 (.java) 18 | 2. 编译源文件为类文件(.class)可用J2SE或J2EE编译 19 | 3. 在虚拟机上运行 20 | 21 | ## 注释 22 | 23 | + //单行注释 24 | + /* */多行注释 25 | 26 | ## java内容介绍 27 | 28 | java编程可以分成三个方向: 29 | 1. java se (j2se)桌面开发 java中的基础中的基础 30 | 2. java ee (j2ee)web开发 31 | 3. java me (j2me)手机开发 32 | 33 | 34 | # java se课程介绍 35 | # 第01讲 内容介绍 项目演示 原理剖析 36 | + java面向对象编程(基础) 37 | + java图开界面开发 38 | + java数据库编程 39 | + java文件io流编程 40 | + java网络编程 41 | + java多线程编程 42 | 43 | ## java ee基础1 44 | + java面向对象编程--数据库编程-->java se 45 | + java 基础2 46 | + html--css--javascript-->div+css 47 | 48 | ## java ee中级部分 49 | + Servlet--Jsp-->mvc模式 50 | 51 | ## java ee高级部分 52 | + Struts--Ejb--Hibernate--Spring--Ajax(ext,dw2)-->ssh框架 53 | 54 | ## java 之父 gosling 55 | 56 | [logo]: http://www.computinghistory.org.uk/userdata/images/medium/41/46/product-74146.jpg "James Gosling, the father of the Java programming language" 57 | 58 | + 1990 sun启动 绿色计划 59 | + 1992 创建oak语言-->java 60 | + 1994 gosling参加硅谷大会演示java功能,震惊世界 61 | + 1995 sun正式发布java第一个版本,目前最新是jdk7.0 62 | 63 | ## java开发工具 64 | + 记事本. (jcreator. jbuilder退出舞台了). netbean. eclipse 65 | + 如何选择开发工具 66 | + 先选择记事本,对java有一定了解后再使用eclipse高级开发工具 67 | + 为什么呢? 68 | 69 | 1. 更深刻的理解java技术,培养代码感 70 | 2. 有利于公司面试 71 | 72 | ## java语言的特点 73 | 1. java语言是简单的 74 | 2. java语言是面向对象的 75 | 3. java语言是跨平台(操作系统)的[即一次编译,到处运行] 76 | 4. java是高性能的 77 | 78 | ## java第一个程序hello.java 79 | + 运行java程序要安装和配置jdk 80 | + jdk是什么? 81 | 1. jdk全称java dvevlopment kit中文java开发工具包 82 | 2. jdk是sun公司开发的 83 | 3. jdk包括jre(java runtime envirnment)java运行环境. 一堆java工具和java基础的类库(类共3600左右,常用类在150个左右) 84 | 4. 可以在[www.sun.com](http://www.oracle.com/technetwork/java/javase/downloads/index.html)下载 85 | + 开发安装jdk,用户执行需要安装jre 86 | 87 | ### 配置JDK 88 | + 添加环境变量即可 89 | + windows下配置jdk 90 | + 在计算机属性--高级设置--环境变量--添加PATH将JDK所在路径指定即可。多个环境变量设置时需要用;号进行隔开 91 | 92 | 1. 编写第一个hello.java 93 | ```java 94 | //注释 (解释) 作者: 95 | //功能:在控制台显示"hello" 96 | //日期:2013.11.28 97 | //public:表示这个类是公共的,一个java文件中只能有一个public类 98 | //class:表示这是一个类 99 | //hello:类名(公共类的类名必须和文件名一致) 100 | public class hello{ 101 | //一个主函数,相当于是程序的入口 102 | public static void main(String args[]){ 103 | //执行语句 104 | //System:是一个包 105 | //out.println是输入函数 106 | System.out.println("hello!"); 107 | } 108 | } 109 | ``` 110 | 2. 编译hello.java 使用`javac hello.java` 111 | 3. 执行hello.java 使用`java hello` 112 | 113 | ### java程序运行关系 114 | 1. java源文件(.java文件) 115 | 2. java编译器即javac.exe 116 | 3. java字节码文件(.class文件) 117 | 4. 由解释执行器即(java.exe)将字节码文件加载到java虚拟器(jvm) 118 | 5. 字节码文件(.class)就会在java虚拟机中执行 119 | 120 | 121 | # 第02讲 变量 数据类型 122 | 123 | 124 | ## 对hello.java程序进行改过使之变为一个简单的加法运算程序 125 | ```java 126 | //注释 (解释) 作者: 127 | //功能:在控制台显示"hello" 128 | //日期:2013.11.28 129 | //public:表示这个类是公共的,一个java文件中只能有一个public类 130 | //class:表示这是一个类 131 | //jiafa:类名(公共类的类名必须和文件名一致) 132 | public class jiafa{ 133 | //一个主函数,相当于是程序的入口 134 | public static void main(String args[]){ 135 | //执行语句 136 | //System:是一个包 137 | //out.println是输入函数 138 | // System.out.println("hello!"); 139 | int a=10;//定义一个变量,变量名a,它的值10 140 | int b=20;//定义一个变量,变量名b,它的值20 141 | int result=a+b;//定义一个叫result变量将变量ab相加的值赋值给result 142 | //输出结果 143 | System.out.println("结果是"+result); 144 | } 145 | } 146 | ``` 147 | ---------------------------------------------------------------- 148 | ## 为什么有变量 149 | 150 | 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位。java中的基本数据类型的定义与c/c++中大体一致。 151 | ```java 152 | public class Test{ 153 | public static void main(String []args){ 154 | int a=1;//定义一个整形变量,取名a,并赋初值1 155 | int b=3;//定义一个整形变量,取名b,并赋初值3 156 | b=89;//给变量b赋89 157 | System.out.println(a);//输出语句,把变量a的值输出 158 | System.out.println(b);//把变量b的值输出 159 | } 160 | } 161 | ``` 162 | ---------------------------------------------------------------- 163 | # java基本语法---基本数据类型 164 | java基本数据类型 四大类型 165 | **整数类型. 小数(浮点)类型. 布尔类型. 字符类型** 166 | 167 | ## 整数类型 168 | 可以表示一个整数,常用的整数类型有:byte,short,int,long 169 | 170 | 主要区别是 数据大小范围,请大家看一个小案例。 171 | + byte 占用内存 一个字节 范围:-128至127 172 | + short 占用内存 两个字节 范围:-32768至32767 173 | + int 占用内存 四个字节 范围:-2147483648至2147483647 174 | + long 占用内存 八个字节 范围:-?至? 175 | 176 | ## 小数(浮点)类型 177 | 可以表示一个小数,常用的小数(浮点)类型有: 178 | >+ float(单精度),double(双精度) 179 | >+ float 占用内存 四个字节 范围:3.4E-38至3.4E+38 只能提供7位有效数字 180 | >+ double占用内存 八个字节 范围:1.7E-308至1.7E+308 可提供16位有效数字 181 | 182 | ## 布尔类型 183 | 可以表示"真"或者"假",类型是boolean 184 | >比如: 185 | >boolean spBool=true; //给变量spBool定义为boolean型并赋值为真 186 | 187 | ## 字符类型 188 | 可以表示 单个字符,字符类型是char。char是两个字节(可以存放汉字) 189 | 多个字符我们称为字符串,在java中String这种数据类型表示,但是String不是基本数据类型,而是类,类是复合数据类型。 190 | >+ 结论:在java中,对char进行运算的时候,直接当做ascii码对应的整数对待。 191 | >+ 思考: 192 | ```java 193 | int test1='a'+'b'; 输出值195 194 | char test2='a'+'b'; 输出值? 195 | char test3='中'; 输出值195 196 | ``` 197 | 198 | 199 | ## java基本语法--定义变量,初始化,赋值 200 | ### 定义变量 201 | 1. 什么是定义变量? 202 | + int a; 这就是定义了一个变量,变量名是a 203 | + float haha;这也定义了一个变量,表示一个float类型的小数,变量名是haha 204 | 205 | ### 初始化变量 206 | + 在定义变量的时候,就给值 207 | + int a=45;这就是初始化变量a 208 | ### 给变量赋值 209 | + 比如你先定义了变量:int tt; 210 | + 然后再给值tt=780; ->这就是给变量赋值 211 | 212 | ---------------------------------------------------------------- 213 | # java基本语法--基本数据类型转换 214 | ## 自动转换 215 | + int a=1.2; double b=3; 216 | >结论:数据类型可以自动的从低精度-->高精度。高精度不能转为低精度。 217 | + byte小于练习 228 | ```java 229 | int a=1; int a=1; 230 | double b=4.5; double b=4.5; 231 | a=b; b=a; 232 | 报错 成功 233 | 234 | ## 计算过程中的转换 235 | int a=3; 236 | int b=a+3.4; 237 | ``` 238 | >结论:当一个整数和一个double运算的时候,运算结果会向高精度转换 239 | 240 | 241 | # java 基本语法--运算符 242 | 243 | # 视频: 第03讲 运算符 流程控制 244 | 245 | + java中常用的算术运算符是:`+加. -减. *乘. /除. %取模` 246 | + 其实`%`运算可以得到两个数的余数。 247 | 248 | ## 算术运算符:++自加. --自减。 249 | 这两个运算符比较特殊,请大家思考一下: 250 | ```java 251 | int a=90; 252 | a++; 等同于(a=a+1) 253 | 这时a等于? 91 254 | 255 | int b=89; 256 | b--; 等同于(b=b-1) 257 | 这时b等于? 88 258 | 259 | int a=56; 260 | int b=a++; 261 | System.out.println(b); 56 262 | System.out.println(a); 57 263 | ***int b=++a;相当于a=a+1再将b=a; 264 | int b=a++;相当于b=a再将a=a+1。 265 | ``` 266 | ---------------------------------------------------------------- 267 | ## 算术运算符:+=左加. -=左减. /=左除. %=左取模 268 | 请大家看看几个案例,就明白了: 269 | ```java 270 | int a=90; 271 | a+=90; (相当于a=a+90) 272 | 请问,a现在等于多少? 180 273 | 274 | float b=89.7f; 275 | b+=a; (相当于b=b+a) 276 | 请问,b现在等于多少? 269.7 277 | 278 | int a=56;int b=90; 279 | a-=34;b%=a; (相当于a=a-34,b=b%a) 280 | System.out.println(b); 2 281 | System.out.println(a); 22 282 | ---------------------------------------------------------------- 283 | ``` 284 | # 运算符 285 | ## 关系运算符 286 | 1. ==等于; 287 | 2. ` >大于;` 288 | 3. <小于; 289 | 4. `>=大于等于;` 290 | 5. <=小于等于; 291 | 6. !=不等于 292 | ```java 293 | int a=90;int b=90; 294 | if(a==b){System.out.println("ok1");} 295 | b--; 296 | if(a>b){System.out.println("ok2");} 297 | if(a>=b){System.out.println("ok3");} 298 | ``` 299 | 请编写一个程序,该程序可以接收两个数(可以是整数,也可是小数)并判断两个数是大于?小于?还是等于? 300 | 301 | 程序代码: 302 | ```java 303 | import java.io.*;//载入IO流包 304 | public class Demo5{ 305 | public static void main(String []args){ 306 | try{ 307 | //输入流,从键盘接收数 308 | InputStreamReader isr=new InputStreamReader(System.in); 309 | BufferedReader br=new BufferedReader(isr); 310 | //给出提示 311 | System.out.println("请输入第一个数"); 312 | //从控制台读取一行数据 313 | String a1=br.readLine(); 314 | System.out.println("请输入第二个数"); 315 | String a2=br.readLine(); 316 | //把String转为float 317 | float num1=Float.parseFloat(a1); 318 | float num2=Float.parseFloat(a2); 319 | if(num1>num2){System.out.println("第一个大");} 320 | if(num1==num2){System.out.println("相等");} 321 | if(num18){System.out.println("ok1");} 342 | b--; 343 | if(a>b && a>45){System.out.println("ok2");} 344 | if(!(a<=b)){System.out.println("ok3");} 345 | ``` 346 | # java基本语法----三大流程控制 347 | ## 顺序控制 348 | 听其名而知其意,让程序可以顺序的执行。 349 | 请大家看个案例[demo11.java]: 350 | ```java 351 | int a=7; 352 | System.out.println("a="+a); 353 | System.out.println("hello!"); 354 | a++; 355 | System.out.println("a="+a); 356 | System.out.println("0(∩_∩)0"); 357 | a++; 358 | System.out.println("a="+a); 359 | ``` 360 | ## 分支控制 361 | 让程序有选择的执行,分支控制有三种: 362 | 1. 单分支;2. 双分支;3. 多分支a 363 | 1. 单分支语法: 364 | ```java 365 | if(条件表达式){ 366 | 语句; 367 | } 368 | ``` 369 | 2. 双分支语法: 370 | ```java 371 | if(条件表达式){ 372 | 语句; 373 | }else{ 374 | 语句; 375 | } 376 | ``` 377 | 3.1. 多分支语法: 378 | ```java 379 | if(条件表达式){ 380 | 语句; 381 | }else if(条件表达式){ 382 | 语句; 383 | }else if(条件表达式){ 384 | 语句; 385 | }else{ 386 | 语句; 387 | } 388 | ``` 389 | 3.2. 多分支语法: 390 | ```java 391 | switch(条件表达式){ //***条件表达式数据类型,就和case常量表达式一致,否则就会报错。 392 | case 常量1: 393 | 语句1; 394 | //语句1至break中相当于{}可以加入相应程序代码 395 | break; //break,表示跳出switch语句 396 | case 常量2: 397 | 语句1; 398 | break; 399 | ... 400 | case 常量n: 401 | 语句n; 402 | break; 403 | default: 404 | 语句; 405 | break; 406 | } 407 | ``` 408 | *****:switch中的可用数据类型主要是:允许byte,short,int,char,enum等 409 | 410 | 1. 单分支控制作业:请大家看个案例[demo22.java]: 411 | 编写一个程序,可以输入人的年龄,如果该同学的年龄大于18岁,则输出“你年龄大于18,要为自己的行为负责!” 412 | 413 | 2. 双分支控制作业:请大家看个案例[demo33.java]: 414 | 编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,则输出“你年龄大于18岁,要对自己的行为负责!”否则,输出“你的年龄不大这次放过你了” 415 | 416 | 3. 多分支控制作业:请大家看个案例[demo44.java] 417 | 编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,则输出“你年龄大于18,要对自己的行业负责,送入监狱”。如果该同志的年龄大于10岁并且小于等于18,则输出“你的年龄也不小了,把你送少管所”。其它情况,则输出“小孩子,下次注意”。 418 | 419 | 4. 多分支控制作业:请大家看个案例[demo55.java] 420 | 请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g 421 | a表示星期一,b表示星期二...根据用户的输入显示相应的信息,要求使用switch语句完成。 422 | 423 | 5. 多分支控制作业:请大家看个案例[demo66.java] 424 | 对比switch与if语句在执行分支语句的区别。 425 | ***switch分支语句不支持判断类型即boolean类型,switch只支持byte,short,int,char,enum等数据类型 426 | ------------------------------------------------------------------------------- 427 |   428 | ## 循环控制 429 | 听其名而知其意,就是让你的代码可以循环的执行。 430 | 循环控制有三种 431 | 1. for循环 语法: 432 | for(循环初值;循环条件;步长){ 433 | 语句; //循环体 434 | } 435 | 436 | 2. while循环 语法: 437 | while(循环条件){ 438 | 语句; //循环体 439 | } 440 | 特别说明:while循环是先判断在执行语句。 441 | 442 | 3. do while循环 语法: 443 | do{ 444 | 语句; //循环体 445 | }while(循环条件); 446 | 特别说明:do while循环是先执行,再判断。 447 | 448 | 请大家看个案例[demo77-88-99.java]: 449 | 编写一个程序,可以打印10句“你好,我是刘德华同志!”。请大家想想怎么做? 450 | 1. for循环 451 | ```java 452 | for (int a=0;a<10;a++){System.out.println("你好,我是刘德华同志!");} 453 | ``` 454 | 2. while循环 455 | ```java 456 | int i=0;while(i<10){System.out.println("你好,我是刘德华同志!");i++;} 457 | ``` 458 | 3. do while循环 459 | ```java 460 | int i=0;do{System.out.println("你好,我是刘德华同志!");i++;}while(i<10) 461 | ``` 462 | 463 | 请编写一个程序,可以接收一个整数,表示层数,打印出金字塔一半。[demo100.java] 464 | ```java 465 | // 把一个复杂的问是先拆解成简单问题 466 | //三角形[Demo100.java] 467 | public class Demo100{ 468 | public static void main(String []args){ 469 | //死去活来法-->打四次 470 | int lay=4; 471 | //表示有多少层 472 | for(int i=1;i<=lay;i++){ 473 | //打印* 474 | for(int j=1;j<=i;j++){ 475 | System.out.print("*"); 476 | } 477 | System.out.println();//换行 478 | } 479 | } 480 | } 481 | ``` 482 | ------------------------------------------------------------------------------- 483 | ```java 484 | //金字塔[Demo101.java] 485 | public class Demo101{ 486 | public static void main(String []args){ 487 | int lay=10;//表示有多少层 488 | for(int i=1;i<=lay;i++){ 489 | //找出规律 490 | //1->3 2->2 3->1 4->0找出空格 491 | for(int k=1;k<=lay-i;k++){ 492 | System.out.print(" "); 493 | } 494 | //打印* 495 | //1->1 2->3 3->5 4->7找出星的规律 496 | for(int j=1;j<=(i-1)*2+1;j++){ 497 | System.out.print("*"); 498 | } 499 | System.out.println();//换行 500 | } 501 | } 502 | } 503 | ``` 504 | ------------------------------------------------------------------------------- 505 | ```java 506 | //镂空金字塔[Demo102.java] 507 | public class Demo102{ 508 | public static void main(String []args){ 509 | int lay=10;//表示有多少层 510 | for(int i=1;i<=lay;i++){ 511 | //找出规律 512 | //1->3 2->2 3->1 4->0找出空格 513 | for(int k=1;k<=lay-i;k++){ 514 | System.out.print(" "); 515 | } 516 | //打印* 517 | //1->1 2->3 3->5 4->7找出星的规律 518 | for(int j=1;j<=(i-1)*2+1;j++){ 519 | //判断该层是否是顶层或者是底层 520 | if(i==1||i==lay){ 521 | System.out.print("*"); 522 | }else{ 523 | //如果是第一个* 524 | if(j==1||j==(i-1)*2+1){ 525 | System.out.print("*"); 526 | }else{ 527 | System.out.print(" "); 528 | } 529 | } 530 | } 531 | System.out.println();//换行 532 | } 533 | } 534 | } 535 | ``` 536 | ------------------------------------------------------------------------------- 537 | ```java 538 | //空心菱形[Demo103.java] 539 | public class Demo103{ 540 | public static void main(String []args){ 541 | int lay=4;//菱形上半部行数 542 | for(int i=1;i<=lay-1;i++){ //判断循环上半部分 543 | for(int k=1;k<=lay-i;k++){ //找行内*号前输出空格 544 | System.out.print(" "); 545 | } 546 | for(int j=1;j<=(i-1)*2+1;j++){ //找行内输出星的位置 547 | if(j==1||j==(i-1)*2+1){ //判断行最小长度和最大长度,并在最小长度和最大长度上输出*号,行内输入出空格。 548 | System.out.print("*"); 549 | }else{ 550 | System.out.print(" "); 551 | } 552 | } 553 | System.out.println(); //换行 554 | } 555 | for(int i=1;i<=lay;i++){ //判断循环菱形下半部分 556 | for(int k=1;k<=i-1;k++){ //判断循环找*号前要输出空格处 557 | System.out.print(" "); 558 | } 559 | for(int j=1;j<=(lay-i)*2+1;j++){ //判断循环行长度 560 | if(j==1||j==(lay-i)*2+1){ //判断行最小长度和最大长度,并在最小长度和最大长度上输出*号,行内输入出空格。 561 | System.out.print("*"); 562 | }else{ 563 | System.out.print(" "); 564 | } 565 | } 566 | System.out.println();//输出换行 567 | } 568 | } 569 | } 570 | ``` 571 | ------------------------------------------------------------------------------- 572 | ```java 573 | //实心菱形[Demo104.java] 574 | public class Demo104{ 575 | public static void main(String []args){ 576 | int lay=4;//菱形上半部行数 577 | for(int i=1;i<=lay-1;i++){ //判断循环上半部分 578 | for(int k=1;k<=lay-i;k++){ //找行内*号前输出空格 579 | System.out.print(" "); 580 | } 581 | for(int j=1;j<=(i-1)*2+1;j++){ //找行内输出星的位置 582 | System.out.print("*"); 583 | } 584 | System.out.println(); //换行 585 | } 586 | for(int i=1;i<=lay;i++){ //判断循环菱形下半部分 587 | for(int k=1;k<=i-1;k++){ //判断循环找*号前要输出空格处 588 | System.out.print(" "); 589 | } 590 | for(int j=1;j<=(lay-i)*2+1;j++){ //判断循环行长度 591 | System.out.print("*"); 592 | } 593 | System.out.println();//输出换行 594 | } 595 | } 596 | } 597 | ``` 598 | ------------------------------------------------------------------------------- 599 | 600 | # 1. java面向对象编程(1)-类与对象 601 | 一个问题?[Demo107.java] 602 | 张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫猫。 603 | ```java 604 | //用前面学习过的知识写出代码 605 | public class Demo107{ 606 | public static void main(String []args){ 607 | int a=49;//输入的名字49,50 608 | int cat1age=3; //第一只猫 609 | String cat1name="小白"; 610 | String cat1color="白色"; 611 | int cat2age=100; //第二只猫 612 | String cat2name="小花"; 613 | String cat2color="花色"; 614 | switch(a){ 615 | case '1': 616 | System.out.println(cat1age+cat1color); 617 | break; 618 | case '2': 619 | System.out.println(cat2age+cat2color); 620 | break; 621 | default: 622 | System.out.println("张老太没有这只猫!"); 623 | } 624 | } 625 | } 626 | ``` 627 | ## java语言是面向对象的 628 | 计算机语言的发展向接近人的思维方式演变 629 | + 汇编语言 [面向机器] 630 | + c语言 [面向过程] 631 | + java语言 [面向对象] 632 | 633 | # 类和对象的关系 634 | 把猫的特性提取出来-->猫类-->对象(实例) 635 | -->对象(实例) 636 | -->... 637 | 注意:从猫类到对象,目前有几种说法:1. 创建一个对象;2. 实例化一个对象;3. 对类实例化...以后大家听到这些说法,不要模糊。(对象就是实例,实例就是对象)java最大的特点就是面向对象。 638 | ```java 639 | //定义猫类 640 | public class Demo105{ 641 | public static void main(String []args){ 642 | //创建一个猫对象 643 | Cat cat1=new Cat();//Cat是定义的一个数据类型 644 | //Cat cat1; 645 | //cat1=new Cat();// 等同于 Cat cat1=new Cat(); 646 | //访问属性的 对象名.属性名字 647 | cat1.age=3; 648 | cat1.name="小白"; 649 | cat1.color="白色"; 650 | 651 | //创建第二只猫 652 | Cat cat2=new Cat(); 653 | cat2.age=100; 654 | cat2.name="小花"; 655 | cat2.color="花色"; 656 | } 657 | } 658 | 659 | //java中如何定义一个类?[类名的首写字母大写]可根据程序的需要定义类 660 | class Cat{ 661 | //下面的就是类的成员变量/属性 662 | int agr; 663 | String name; 664 | String color; 665 | Master myMaster; 666 | } 667 | 668 | //引用类型,比如建个主人类 669 | class Master{ 670 | int age; 671 | String name; 672 | String address; 673 | } 674 | ``` 675 | 类和对象的区别和联系 676 | 1. 类是抽象的,概念的,代表一类事物,比如人类,猫类.. 677 | 2. 对象是具体的,实际的,代表一个具体事物 678 | 3. 类对象的模板,对象是类的一个个体,实例 679 | 680 | ## 类--如何定义类 681 | 一个全面的类定义比较复杂,如: 682 | package 包名; 683 | class 类名 extends 父类 implements 684 | 接口名{ 685 | 成员变量; 686 | 构造方法; 687 | 成员方法; 688 | } 689 | 690 | 要透彻的掌握类,必须要了解类的构成 691 | class 类名{ ----> 待定... 692 | 成员变量; 693 | } 694 | 695 | 类--类的成员变量 696 | 成员变量是类的一个组成部分,一般是基本数据类型,也可是引用类型。比如我们前面定义猫类的int age 就是成员变量。 697 | 698 | 对象--如何创建对象 699 | 创建一个对象有两种方法 700 | 1. 先声明再创建 701 | 1. 对象声明:类名 对象名 702 | 2. 对象创建:对象名=new 类名() 703 | 704 | 2. 一步到位法 705 | 类名 对象名=new 类名() 706 | 707 | 对象--如何访问(使用)对象的成员变量 708 | 对象名.变量名; //简单先这样理解,以后加下控制符此表达就不准确了。 709 | ***对象总是存在内存中的 710 | 711 | 一个小思考题[Demo.105.java] 712 | 为了让大家加深印象,我们定义一个人类(Person)(包括名字. 年龄)。用一步到位法去创建一个对象 713 | ↓ 714 | 我们看看下面一段代码: 715 | ```java 716 | System.out.printlin(b.age); 717 | Person a=new Person(); → 请问:b.age究竟是多少? 718 | a.age=10; 719 | a.name="小明"; 720 | Person b; 721 | b=a; 722 | ``` 723 | ***对象总是存在内存中的 724 | 一个小思考题[Demo106.java] 725 | 在明白对象是如何在内存中存在后,请大家再看看下面的思考题,请问会输出什么信息? 726 | ```java 727 | Person1 a=new Person1(); 728 | a.age=10; 729 | a.name="小明"; 730 | Person1 b; 731 | b=a; 732 | System.out.println(b.name);//输出“小明” 733 | b.age=200; 734 | System.out.println(a.age);//输出a.age为200 735 | ``` 736 | *****重点也是难点 737 | 类--成员方法的初步介绍 738 | 在某些情况下,我们要需要定义成员方法。比如人类:除了有一些属性外(成员变量表示的年龄. 姓名...),我们人类还有一些行为比如:可以说话. 跑步..,通过学习,我们人类还可以做算术题。这时就要用成员方法才能完成。现在要求对Person类完善: 739 | 1. 添加speak成员方法,输入出:我是一个好人 740 | 2. 添加jisuan成员方法,可以计算从1+..+1000的结果 741 | 3. 修改jisuan成员方法,该方法可以接收一个数n,计算从1+..+n的结果 742 | 4. 添加add成员方法,可以计算两个数的和 743 | 744 | 745 | 746 | # 类--类的成员方法(成员函数)定义 747 | 成员方法也叫成员函数,这里希望大家不要被两个名词搞晕了。 748 | public 返回数据类型 方法名(参数列表) 749 | { 750 | 语句;//方法(函数)主体 751 | } 752 | 1. 参数列表:表示成员函数输入 753 | 2. 数据类型(返回类型):表示成员函数输出 754 | 3. 函数主体:表示为了实现某一功能代码块 755 | ```java 756 | //类的调用及方法调用[Demo108.java] 757 | public class Demo108{ 758 | public static void main(String []args){ 759 | Person p1=new Person(); 760 | p1.speak();//调用speak方法 761 | p1.jiSuan();//调用计算方法 762 | p1.jiSuan(200);//调用可以传入参数的计算方法 763 | p1.add(12,10);//调用两个数的和 764 | 765 | int res=p1.add2(23,34);//调用两个数的和并返回值到res中 766 | System.out.println("res返回值是:"+res); 767 | System.out.println("num1+num2+num3="+p1.add3(2,2.3f,4.5f));//返回类型一定要一致否则报错。 768 | } 769 | } 770 | //定义名字的几个方法: 771 | //1. 驼峰法 如myCry;2. 下划线法my_cry 772 | //方法名在有不同参数的情况下可以使用同一个方法名,即有参数和没参数的方法可以同名 773 | class Person{ //请注意类名首写字母应为大写如Person为类名 774 | int age; 775 | String name; 776 | //1. 可以输出我是好人方法 777 | public void speak(){ //请注意方法名的首写字母应为小写如speak为方法名 778 | System.out.println("我是一个好人"); 779 | } 780 | //2. 可以计算1+..+1000的方法 781 | public void jiSuan(){ 782 | int result=0; 783 | for(int i=1;i<=1000;i++){ 784 | result=result+i; 785 | } 786 | System.out.println("1+..+1000结果是"+result); 787 | } 788 | //3. 带参数的成员方法,可以输入n值并计算1+..+n 789 | public void jiSuan(int n){ 790 | int result=0; 791 | for(int i=1;i<=n;i++){ 792 | result+=i; 793 | } 794 | System.out.println("1+..+n结果是"+result); 795 | } 796 | //4. 计算两个数的和 797 | public void add(int num1,int num2){ 798 | int result=0; //与下面一句等同于return num1+num2; 799 | result=num1+num2; 800 | System.out.println("num1+num2="+result); 801 | } 802 | //5. 计算两个数的和,并将结果返回给主调(调用它的)函数 803 | //注意:返回类型和返回结果的类型要一致 804 | //注意:在调用某个成员方法的时候,给出的具体数值的个数 805 | //和类型要相匹配。 806 | public int add2(int num1,int num2){ 807 | return num1+num2; 808 | } 809 | //6. 计算两个float数的和,并将结果返给主调函数 810 | public float add3(int num1,float num2,float num3){ 811 | return num1+num2+num3; 812 | } 813 | } 814 | ``` 815 | ## 类--类的成员方法(函数)--如何理解 816 | 如何理解方法这个概念,给大家举个通俗的示例: 817 | 程序员调用方法:给方法必要的输入,方法返回结果。 818 | 819 | 类的成员方法--声明 820 | public int test(int a);/*方法声明*/ 821 | 这句话的作用是声明该方法,声明的格式为: 822 | 访问修饰符 数据类型 函数名(参数列表); 823 | 在给Person类添加add方法的例题中,我们看到的关键字return,它的功能是把表达式的值返回的值返回给主调函数的方法。 824 | return 表达式; 825 | 826 | 类的成员方法(函数)--特别说明 827 | 1. 方法的参数列表可以是多个 828 | 案例:在Person类中编写一个成员方法,从键盘输入三个数,返回最大的那个数。 829 | 参数列表可以是多个,并且数据类型可以是任意的类型int float double char.. 830 | 访问修饰符 返回数据类型 函数名(参数列表){ 831 | 语句; //函数主体 832 | } 833 | 834 | 2. 方法可以没有返回值 835 | 案例:编写一个函数,从控制台输入一个整数打印出对应的金字塔。 836 | 返回类型可以是任意的数据类型(int,float,double,char..)也可以没有返回值void表示没有返回值 837 | 访问修饰符 返回数据类型 函数名(形参列表){ 838 | 语句; //函数主体 839 | } 840 | 841 | 类的成员方法(函数)--小练习 842 | 案例:编写一个成员函数,从键盘输入一个整数(1-9),打印出对应的乘法表[Demo110.java] 843 | //实例键盘输入打印乘法表[Demo110.java] 844 | ```java 845 | import java.io.*; 846 | public class Demo110{ 847 | public static void main(String []args){ 848 | Cfb jiu=new Cfb(); 849 | jiu.cf(); 850 | } 851 | } 852 | class Cfb{ 853 | public void cf(){ 854 | try{ 855 | //输入流,从键盘接收数 856 | InputStreamReader isr=new InputStreamReader(System.in); 857 | BufferedReader br=new BufferedReader(isr); 858 | //给出提示 859 | System.out.println("请输入1-9,按0退出:"); 860 | //从控制台读取一行数据 861 | String a1=br.readLine(); 862 | //把String转为int 863 | int num1=Integer.decode(a1); 864 | for(int i=1;i<=num1;i++){ 865 | for(int j=1;j<=i;j++){ 866 | System.out.print(i+"×"+j+"="+(i*j)+"\t"); 867 | } 868 | System.out.println(); 869 | } 870 | }catch(Exception e){ 871 | e.printStackTrace(); 872 | } 873 | } 874 | } 875 | ``` 876 | 案例:编写函数,使给定的一个二维数组(3×3)转置 877 | 878 | # 类定义的完善 879 | 在介绍了成员方法后,我们类的定义就可以完善一步: 880 | class 类名{ class 类名{ 待定 881 | 成员变量; → 成员变量; → 882 | } 成员方法; 883 | } 884 | 885 | 小结:1.先设计类;2.然后根据类创建对象。 886 | 小练习: 887 | 1. 设计计算机类,要求如下:[Demo109.java] 888 | 属性:品牌(Brand). 颜色(Color). cpu型号(CPU). 内存容量(Memory). 硬盘大小(Harddisk). 价格(Price). 工作状态(Work) 889 | 方法:打开(Open). 关闭(Close). 休眠(Sleep) 890 | 创建一个计算机对象,调用打开,关闭方法 891 | ```java 892 | //计算机类与对象的代码 893 | import java.io.*;//加载IO流包 894 | public class Demo109{ 895 | public static void main(String []args){ 896 | Computer Pc=new Computer(); 897 | Pc.Brand="品牌"; 898 | Pc.Color="颜色"; 899 | Pc.Cpu="Cpu型号"; 900 | Pc.Memory="内存容量"; 901 | Pc.Hd="硬盘容量"; 902 | Pc.Price="价格"; 903 | Pc.Work="工作状态"; 904 | try{ 905 | //输入流,从键盘接收数 906 | InputStreamReader isr=new InputStreamReader(System.in); 907 | BufferedReader br=new BufferedReader(isr); 908 | //给出提示 909 | System.out.println("请输入0-9控制机器"); 910 | //从控制台读取一行数据 911 | String a1=br.readLine(); 912 | //把String转为float 913 | float num1=Float.parseFloat(a1); 914 | if(num1==0){Pc.open();} 915 | else if(num1==1){Pc.close();} 916 | else if(num1==2){Pc.sleep();} 917 | else if(num1==3){System.out.println(Pc.Brand);} 918 | else if(num1==4){System.out.println(Pc.Color);} 919 | else if(num1==5){System.out.println(Pc.Cpu);} 920 | else if(num1==6){System.out.println(Pc.Memory);} 921 | else if(num1==7){System.out.println(Pc.Hd);} 922 | else if(num1==8){System.out.println(Pc.Price);} 923 | else if(num1==9){System.out.println(Pc.Work);} 924 | else {System.out.println("输入错误!");} 925 | }catch(Exception e){ 926 | e.printStackTrace(); 927 | } 928 | } 929 | } 930 | 931 | class Computer{ 932 | String Brand; 933 | String Color; 934 | String Cpu; 935 | String Memory; 936 | String Hd; 937 | String Price; 938 | String Work; 939 | public void open(){ 940 | System.out.println("开机"); 941 | } 942 | public void close(){ 943 | System.out.println("关机"); 944 | } 945 | public void sleep(){ 946 | System.out.println("休眠"); 947 | } 948 | } 949 | ``` 950 | 2. 采用面向对象思想设计超级马里奥游戏人物 951 | 952 | 953 | ------------------------------------------------------------------------------- 954 | 955 | # 2. java面向对象编程(1)-构造方法(函数) 956 | 类的构造方法介绍 957 | 什么是构造方法呢?在回答这个问题之前,我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做? 958 | ↓ 959 | 你可以在定义类的时候,定义一个构造方法即可。 960 | 961 | 构造方法是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点: 962 | 1. 方法名和类名相同 963 | 2. 没有返回值 964 | 3. 在创建一个类的新对象时,系统会自动的调用该类的构造方法完成对新对象的初始化。 965 | 特别说明: 966 | 一个类可以定义多个不同的构造方法。 967 | ```java 968 | //例人类构造方法[Demo111.java] 969 | public class Demo111{ 970 | public static void main(String []args){ 971 | Person p1=new Person(12,"顺平");//给予不同的初始值,调用的构造方法不同,构造方法虽同名,但系统会根据初始值来选定构造方法。 972 | } 973 | } 974 | //定义一个人类 975 | class Person{ 976 | int age; 977 | String name; 978 | //默认构造方法 979 | public Person(){ 980 | } 981 | //构造方法的主要用处是:初始化你的成员属性(变量) 982 | //构造方法 983 | public Person(int age,String name){ 984 | System.out.println("我是构造1"); 985 | age=age; 986 | name=name; 987 | } 988 | //构造方法2 989 | public Person(String name){ 990 | System.out.println("我是构造2"); 991 | name=name; 992 | } 993 | } 994 | ``` 995 | 类的默认构造方法 996 | 有些同志可能会问?亲爱的老师,我们在没有学习构造函数前不是也可以创建对象吗? 997 | 是这样的,如果程序员没有定义构造方法,系统会自动生成一个默认构造方法。比如Person类Person (){}; 998 | 当创建一个Person对象时Person per1=new Person();默认的构造函数就会被自动调用。 999 | 1000 | 类的构造方法小结: 1001 | 1. 构造方法名和类名相同; 1002 | 2. 构造方法没有返回值; 1003 | 3. 主要作用是完成对新对象的初始化; 1004 | 4. 在创建新对象时,系统自动的调用该类的构造方法; 1005 | 5. 一个类可以有多个构造方法; 1006 | 6. 每个类都有一个默认的构造方法。 1007 | 1008 | 类定义的改进 1009 | 在提出构造方法后,我们类的定义就应该更加完善了: 1010 | class 类名{ class 类名{ class 类名{ 1011 | 成员变量; 成员变量; 成员变量; 1012 | } → 成员方法; → 构造方法; → 待定.. 1013 | } 成员方法 1014 | } 1015 | java面向对象编程(2)--this 1016 | 一个问题? 1017 | 请大家看一段代码:(Demo112.java) 1018 | *重点*:this是属于一个对象,不属于类的。 1019 | java虚拟机会给每个对象分配this,代表当前对象。坦白的讲,要明白this不是件容易的事 1020 | 注意事项:this不能在类定义的外部使用,只能在类定义的方法中使用 1021 | ```java 1022 | /* 1023 | this的必要性 1024 | */ 1025 | public class Demo112{ 1026 | public static void main(String []args){ 1027 | Dog dog1=new Dog(2,"大黄"); 1028 | Person p1=new Person(dog1,23,"郭德纲"); 1029 | Person p2=new Person(dog1,24,"刘谦"); 1030 | p1.showInfo(); 1031 | p1.dog.showInfo(); 1032 | } 1033 | } 1034 | //定义一个人类 1035 | class Person{ 1036 | //成员变量 1037 | int age; 1038 | String name; 1039 | Dog dog;//引用类型 1040 | public Person(Dog dog,int age,String name){ 1041 | //可读性不好 1042 | //age=age; 1043 | //name=name; 1044 | this.age=age; //this.age指this代词指定是成员变量age 1045 | this.name=name; //this.name指this代词指定是成员变量name 1046 | this.dog=dog; 1047 | } 1048 | //显示人名字 1049 | public void showInfo(){ 1050 | System.out.println("人名是:"+this.name); 1051 | } 1052 | } 1053 | 1054 | class Dog{ 1055 | int age; 1056 | String name; 1057 | public Dog(int age,String name){ 1058 | this.age=age; 1059 | this.name=name; 1060 | } 1061 | //显示狗名 1062 | public void showInfo(){ 1063 | System.out.println("狗名叫"+this.name); 1064 | } 1065 | } 1066 | ``` 1067 | ------------------------------------------------------------------------------- 1068 | 类变量--提出问题? 1069 | 提出问题的主要目的就是让大家思考解决之道。 1070 | ```java 1071 | public class Demo113{ 1072 | public static void main(String []args){ 1073 | /* int total=0; 1074 | Child ch1=new Child(3,"妞妞"); 1075 | ch1.joinGame(); 1076 | total++; 1077 | Child ch2=new Child(4,"小小"); 1078 | ch2.joinGame(); 1079 | total++; 1080 | */ 1081 | Child ch1=new Child(3,"妞妞"); 1082 | ch1.joinGame(); 1083 | Child ch2=new Child(4,"小小"); 1084 | ch2.joinGame(); 1085 | Child ch3=new Child(5,"大大"); 1086 | ch3.joinGame(); 1087 | System.out.println("共有="+Child.total); 1088 | } 1089 | } 1090 | //定义小孩类 1091 | class Child{ 1092 | int age; 1093 | String name; 1094 | //static公共函数,total是静态变量,因此它可以被任何一个对象访问 1095 | static int total=0; 1096 | public Child(int age,String name){ 1097 | this.age=age; 1098 | this.name=name; 1099 | } 1100 | public void joinGame(){ 1101 | total++; 1102 | System.out.println("有一个小孩加入了"); 1103 | } 1104 | } 1105 | ``` 1106 | ------------------------------------------------------------------------------- 1107 | # java面向对象编程(2)--类变量. 类方法 1108 | 什么是类变量? 1109 | 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。 1110 | 1111 | 如何定义类变量? 1112 | 定义语法: 1113 | 访问修饰符 static 数据类型 变量名; 1114 | 1115 | 如何访问类变量? 1116 | 类名.类变量名 或者 对象名.类变量名 1117 | ```java 1118 | //类变量的程序演示[Demo114.java] 1119 | public class Demo114{ 1120 | static int i=1; 1121 | static{ 1122 | //该静态区域块只被执行一次 1123 | i++; 1124 | System.out.println("执行一次"); 1125 | } 1126 | public Demo114(){ //建立Demo114()构造函数 1127 | System.out.println("执行二次"); 1128 | i++; 1129 | } 1130 | public static void main(String []args){ 1131 | Demo114 t1=new Demo114(); //创建t1对象实例并调用Demo114函数 1132 | System.out.println(t1.i); 1133 | 1134 | Demo114 t2=new Demo114(); 1135 | System.out.println(t2.i); 1136 | } 1137 | } 1138 | ``` 1139 | ------------------------------------------------------------------------------- 1140 | 什么是类方法,为什么有类方法? 1141 | 类方法是属于所有对象实例的,其形式如下: 1142 | 访问修饰符 static 数据返回类型 方法名(){} 1143 | 注意:类方法中不能访问非静态变量(类变量)。 1144 | 使用:类名.类方法名 或者 对象名.类方法名 1145 | *重点*static静态的方法可以访问static静态变量,不能访问非静态变量(类变量) 1146 | 非静态方法可以访问非静态变量(类变量)同时也可以访问static静态变量。 1147 | ```java 1148 | //统计总学费的程序代码,加深static静态的方法由静态变量的访问[Demo115.java] 1149 | public class Demo115{ 1150 | public static void main(String []args){ 1151 | //创建一个学生 1152 | Stu stu1=new Stu(29,"aa",340); 1153 | Stu stu2=new Stu(29,"aa",240); 1154 | System.out.println(Stu.getTotalFee()); 1155 | } 1156 | } 1157 | 1158 | //学生类 1159 | class Stu{ 1160 | int age; 1161 | String name; 1162 | int fee; 1163 | static int totalFee; 1164 | public Stu(int age,String name,int fee){ 1165 | this.age=age; 1166 | this.name=name; 1167 | totalFee+=fee; 1168 | } 1169 | //返回总学费[这是一个类方法(静态方法)] 1170 | //java中规则:类变量原则上用类方法去访问或操作 1171 | public static int getTotalFee(){ 1172 | return totalFee; 1173 | } 1174 | } 1175 | ``` 1176 | 类变量小结 1177 | 1. 什么时候需要用类变量 1178 | 案例[Demo115.java]:定义学生类,统计学生共交多少钱? 1179 | 用类变量,属于公共的属性 1180 | 2. 类变量与实例变量区别: 1181 | 加上static称为类变量或静态变量,否则称为实例变量 1182 | 类变量是与类相关的,公共的属性 1183 | 实例变量属于每个对象个体的属性 1184 | 类变量可以通过 [类名.类变量名] 直接访问 1185 | 类方法小结 1186 | 1. 什么时候需要用类方法 1187 | 案例[Demo115.java]:定义学生类,统计学生共交多少钱? 1188 | 类方法属于与类相关的,公共的方法 1189 | 实例方法属于每个对象个体的方法 1190 | 类方法可以通过 [类名.类方法名] 直接访问 1191 | 1192 | ------------------------------------------------------------------------------- 1193 | # java面向对象编程的四大特征 1194 | 抽象/封装/继承/多态 1195 | 1196 | ## 抽象 1197 | 1. 简单理解 1198 | 我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模版)。这种研究问题的方法称为抽象。 1199 | 1200 | ## 封装--什么是封装 1201 | 封装就是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。 1202 | 1203 | 封装--访问控制修饰符 1204 | 电视机的开关,对音量,颜色,频道的控制是公开的,谁都可以操作,但是对机箱后盖,主机板的操作却不是公开的,一般是由专业维修人员来玩。那么java中如何实现这种类似的控制呢?不能随便查看人的年龄,工资等隐私[Demo116.java] 1205 | ```java 1206 | //封装案例[Demo116.java] 1207 | public class Demo116{ 1208 | public static void main(String []args){ 1209 | //创建一个职员 1210 | Clerk clerk1=new Clerk("小花",24,4567.6f); 1211 | System.out.println("名字是"+clerk1.name+"薪水"+clerk1.getSal()); 1212 | } 1213 | } 1214 | //职员 1215 | class Clerk{ 1216 | public String name; 1217 | //private私有的,public公有的 1218 | private int age; 1219 | private float salary; 1220 | 1221 | public Clerk(String name,int age,float sal){ 1222 | this.name=name; 1223 | this.age=age; 1224 | this.salary=sal; 1225 | } 1226 | //通过一个成员方法去控制和访问私有的属性 1227 | public float getSal(){ 1228 | return this.salary; 1229 | } 1230 | } 1231 | ``` 1232 | 封装--访问控制修饰符 1233 | java提供四种访问控制修饰符号控制方法和变量的访问权限: 1234 | 1. 公开级别:用public修饰,对外公开 1235 | 2. 受保护级别:用protected修饰,对子类和同一个包中的类公开 1236 | 3. 默认级别:没有修饰符号,向同一个包的类公开 1237 | 4. 私有级别:用private修饰,只有类本身可以访问,不对外公开 1238 | 1239 | 4种访问级别的访问范围 1240 | | 访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 | 1241 | | -------- | -------------- | ---- | ---- | ---- | ------ | 1242 | | 公 开 | Public | √ | √ | √ | √ | 1243 | | 受保护 | Protected | √ | √ | √ | ╳ | 1244 | | 默 认 | 没有修饰符 | √ | √ | ╳ | ╳ | 1245 | | 私 有 | private | √ | ╳ | ╳ | ╳ | 1246 | 1247 | 包--必要性 1248 | 问题的提出,请看下面的一个场景[eclipse] 1249 | 现在有两个程序员共同开发一个java项目,程序员xiaoming希望定义一个类取名Dog,程序员xiaoqiang也想定义一个类也叫Dog。两个程序员为此还吵了起来,怎么办? 1250 | 1251 | 包--三大作用 1252 | 1. 区分相同名字的类 1253 | 2. 当类很多时,可以很好的管理类 1254 | 3. 控制访问范围 1255 | 1256 | 包--换包命令 1257 | package com.自定义名字; 1258 | 注意:打包命令一般放在文件开始处。 1259 | 1260 | 包--命名规范 1261 | 小写字母 比如 com.sina.shunping 1262 | 1263 | 包--常用的包 1264 | 一个包下,包含很多的类,java中常用的包有: 1265 | java.lang.* 包 自动引入 java.util.* 工具包 1266 | java.net.* 包 网络开发包 java.awt.* 包 窗口工具包 1267 | 1268 | 包--如何引入包 1269 | 语法:import 包; 1270 | 比如import java.awt.*; 1271 | 我们引入一个包的主要目的要使用该包下的类 1272 | 1273 | 定义类的改进 1274 | 在提出包后,我们类的定义就更加完善了: 1275 | class 类名{ class 类名{ class类名{ package包名; 待定.. 1276 | 成员变量; → 成员变量; → 成员变量; → class 类名{ → 1277 | } 成员方法; 构造方法; 成员变量; 1278 | } 成员方法; 构造方法; 1279 | } 成员方法; 1280 | } 1281 | ------------------------------------------------------------------------------- 1282 | ## 继承--为什么有?[Demo117.java] 1283 | ```java 1284 | //功能:说明继承的重要性 1285 | 1286 | package com.abc;//包名 1287 | public class Demo117 { 1288 | public static void main(String[] args) { 1289 | Pupil p1=new Pupil(); 1290 | p1.printName(); 1291 | } 1292 | } 1293 | 1294 | //将学生的共有属性提取,做一个父类 1295 | class Stu{ 1296 | //定义成员属性 1297 | protected int age; 1298 | public String name; 1299 | public float fee; 1300 | private String job;//私有将不被继承 1301 | 1302 | //编程中,如果你不希望子类继承某个属性或方法 1303 | //则将其声明为private即可 1304 | public void printName(){ 1305 | System.out.println("名字"+this.name); 1306 | } 1307 | } 1308 | 1309 | //小学生类 1310 | class Pupil extends Stu{ 1311 | //交学费 1312 | public void pay(float fee){ 1313 | this.fee=fee; 1314 | } 1315 | } 1316 | //幼儿 1317 | class Pre extends Pupil{ 1318 | //交学费 1319 | public void pay(float fee){ 1320 | this.fee=fee*1.5f; 1321 | } 1322 | } 1323 | //中学生类 1324 | class MiddleStu extends Stu{ 1325 | //交学费 1326 | public void pay(float fee){ 1327 | this.fee=fee*0.8f; 1328 | } 1329 | } 1330 | //大学生类 1331 | class ColStu extends Stu{ 1332 | //交学费 1333 | public void pay(float fee){ 1334 | this.fee=fee*0.1f; 1335 | } 1336 | } 1337 | ``` 1338 | 继承--解决之道 1339 | 继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类(比如刚才的Student),在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends语句来声明继承父类: 1340 | 语法:class 子类 extends 父类 1341 | 这样,子类就会自动拥有父类定义的某些属性和方法。 1342 | 1343 | 继承--深入讨论 1344 | 1. 父类的哪些属性(变量). 方法被子类继承了?并不是父类的所有属性. 方法都可以被子类继承 1345 | 父类 子类 1346 | public 属性; public 属性; 1347 | protected 属性; 继承 protected 属性; 1348 | private 属性; → 属性; 1349 | 属性; 1350 | public 方法; public 方法; 1351 | protected 方法; protected 方法; 1352 | private 方法; 方法; 1353 | 方法; 1354 | 2. 结论 1355 | 从图可以看出,父类的public修饰符的属性和方法;protected修饰符的属性和方法;默认修饰符属性和方法被子类继承了,父类的private修饰符的属性和方法不能被子类继承。 1356 | 1357 | 继承--注意事项 1358 | 1. 子类最多只能继承一个父类(指直接继承) 1359 | 2. java所有类都是Object类的子类 (所有的子类都可以逐级继承,例:爷->父->子->孙) 1360 | 3. JDK6中有202个包3777个类. 接口. 异常. 枚举. 注释和错误 1361 | 4. 在做开发的时候,强烈建议大家多查jdk帮助文档 1362 | 5. 在使用类时,实在不知道怎么办,多使用搜索引擎 1363 | 1364 | 定义类的改进 1365 | 在提出包后,我们类的定义就更加完善了: 1366 | class 类名{ class 类名{ class类名{ package包名; 1367 | 成员变量; → 成员变量; → 成员变量; → class 类名{ 1368 | } 成员方法; 构造方法; 成员变量; 1369 | } 成员方法; 构造方法; 1370 | } 成员方法; 1371 | } ↓ 1372 | ↓←←←←←←←←←←←←←←←←←←←←←←←←← 1373 | package 包名; 1374 | class 类名 extends 父类{ 待定 1375 | 成员变量; → .... 1376 | 构造方法; 1377 | 成员方法; 1378 | } 1379 | 1380 | ------------------------------------------------------------------------------- 1381 | java面向对象编程(2)--方法重载(overload) 1382 | 方法重载(overload) 1383 | 按顺序,我们应该讲解多态,但是在讲解多态前,我们必须讲解方法重载和方法覆盖(override)。 1384 | 请编写一个类(Abc),编写方法可以接收两个整数,返回两个数中较大的数[Demo119.java] 1385 | ```java 1386 | //方法重载(overload)getMax 1387 | public class Demo119{ 1388 | public static void main(String []args){ 1389 | Abc2 abc1=new Abc2(); 1390 | System.out.println(abc1.getMax(12,14)); 1391 | System.out.println(abc1.getMax(24f,20f)); 1392 | } 1393 | } 1394 | 1395 | class Abc2{ 1396 | //返回较大的整数 1397 | public int getMax(int i,int j){ 1398 | if(i>j){ 1399 | return i; 1400 | }else{ 1401 | return j; 1402 | } 1403 | } 1404 | public float getMax(float a,float b){ 1405 | if(a>b){ 1406 | return a; 1407 | }else{ 1408 | return b; 1409 | } 1410 | } 1411 | //如果只是返回类型不一样,能否构成重载?不能够构成重载 1412 | /* public double getMax(float d,double c){ 1413 | if(c>d){ 1414 | return c; 1415 | }else{ 1416 | return d; 1417 | } 1418 | } 1419 | //如果只是控制访问修饰符不同,能否构成重载?不能够构成重载 1420 | protected float getMax(float c,float d){ 1421 | if(c>d){ 1422 | return c; 1423 | }else{ 1424 | return d; 1425 | } 1426 | }*/ 1427 | } 1428 | ``` 1429 | 方法重载(overload)概念 1430 | 简单的说:方法重载就是在类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。 1431 | 注意事项: 1432 | 1. 方法名相同 1433 | 2. 方法的参数类型,个数,顺序至少有一项不同 1434 | 3. 方法返回类型可以不同(只是返回类型不一样,不能构成重载) 1435 | 4. 方法的修饰符可以不同(只是控制访问修饰符不同,不能构成重载) 1436 |   1437 | 1438 | 方法覆盖(override) 1439 | 既然子类可以继承父类的属性和方法,这样可以提高代码的复用性,这个很好,可是问题来了,假设现在我要求大家写三个类猫猫,狗狗,猪猪。我们知道这三个东东都是动物,动物必然存在相同的特点。根据类的抽象特征,我们可以把它们的相同点提取出来,形成一个父类,然后继承。 1440 | ```java 1441 | //子类方法覆盖父类方法[Demo120.java] 1442 | public class Demo120{ 1443 | public static void main(String []args){ 1444 | //创建一只猫 1445 | Cat cat1=new Cat(); 1446 | cat1.cry(); 1447 | Dog dog1=new Dog(); 1448 | dog1.cry(); 1449 | } 1450 | } 1451 | //动物类 1452 | class Animal{ 1453 | int age; 1454 | String name; 1455 | //都会叫 1456 | public void cry(){ 1457 | System.out.println("我是动物,不知道怎么叫"); 1458 | } 1459 | 1460 | } 1461 | //猫猫类 1462 | class Cat extends Animal{ 1463 | //覆盖父类方法 1464 | public void cry(){ 1465 | System.out.println("猫猫叫!"); 1466 | } 1467 | } 1468 | //狗狗类 1469 | class Dog extends Animal{ 1470 | //覆盖父类方法 1471 | public void cry(){ 1472 | System.out.println("汪汪叫!"); 1473 | } 1474 | } 1475 | ``` 1476 | 方法覆盖(override)概念 1477 | 简单的说:方法覆盖就是子类有一个方法,和父类的某个方法的名称. 返回类型. 参数一样,那么我们就说子类的这个方法覆盖了父类的那个方法。比如上个案例的Cat类中的cry方法就覆盖了Animal类的cry方法。 1478 | 注意事项: 1479 | 方法覆盖有很多条件,有些书上说的比较细,总的讲有两点一定注意: 1480 | 1. 子类的方法的返回类型,参数,方法名称,要和父类的返回类型,参数,方法名称完全一样,否则编译出错。 1481 | 2. 子类方法不能缩小父类方法的访问权限。 1482 | 1483 | =============================================================================== 1484 | 作业:上机实习题目 1485 | 1. Josephu问题(丢手帕问题) 1486 | Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 1487 | 提示:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点的人从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。 1488 | ```java 1489 | //Josephu问题(丢手帕问题) 1490 | //使用单向链表 1491 | public class Demo121 { 1492 | public static void main(String[] args) { 1493 | CycLink cyclink=new CycLink(); 1494 | cyclink.setLen(5);//链表长度 1495 | cyclink.createLink(); 1496 | cyclink.setK(2);//从第几个人开始数 1497 | cyclink.setM(2);//数几下 1498 | cyclink.show(); 1499 | cyclink.play(); 1500 | } 1501 | } 1502 | 1503 | class Child{ 1504 | int no; 1505 | Child nextChild=null; 1506 | public Child(int no){ 1507 | //给一个编号 1508 | this.no=no; 1509 | } 1510 | } 1511 | 1512 | //单向环形链表 1513 | class CycLink{ 1514 | //先定义一个指向链表第一个小孩的引用 1515 | //指向第一个小孩的引用,不能动 1516 | Child firstChild=null; 1517 | Child temp=null; 1518 | int len=0;//表示共有多少个小孩 1519 | int k=0; 1520 | int m=0; 1521 | //设置m数几下 1522 | public void setM(int m){ 1523 | this.m=m; 1524 | } 1525 | //设置环形链表大小 1526 | public void setLen(int len){ 1527 | this.len=len; 1528 | } 1529 | //设置从第几个人开始数数 1530 | public void setK(int k){ 1531 | this.k=k; 1532 | } 1533 | //开始play 1534 | public void play(){ 1535 | Child temp=this.firstChild; 1536 | //1.先找到开始数数的人 1537 | for(int i=1;i第二个数的关系表达式的值,输出此值; 0 2267 | 5. 用第一个数减去上面关系表达式的值,得到它们的差,输出差; 3 2268 | 6. 存储第二个数的变量累乘上式的结果,输出此变量的当前值; 15 2269 | 7. 存储第一个数的变量累加第二个变量,输出第一个变量的当前值。 18 2270 | ```java 2271 | //输入两个数完成任务集合[Work08.java] 2272 | import java.util.*;//加载包 2273 | public class Work08{ 2274 | public static void main(String []args){ 2275 | Scanner myScanner=new Scanner(System.in);//调用键盘输入 2276 | System.out.print("请输入一个数A:"); 2277 | int a=myScanner.nextInt(); 2278 | System.out.print("请输入一个数B:"); 2279 | int b=myScanner.nextInt(); 2280 | int e=0;//定义变量 2281 | //求和 2282 | int c=a+b; 2283 | System.out.println("和:"+c); 2284 | //求平均数 2285 | int d=(a+b)/2; 2286 | System.out.println("平均数:"+d); 2287 | //判断平均数是否大于第二个数 2288 | if(d>b){ 2289 | e=1; 2290 | System.out.println("平均数>第二个数"); 2291 | }else{ 2292 | e=0; 2293 | System.out.println("小于"+b+"输出判断值"+e); 2294 | } 2295 | //第一个数减去上式的值 2296 | int f=a-e; 2297 | System.out.println("第一个数减去上式的值"+f); 2298 | //第二个数乘上式的值 2299 | int g=b*f; 2300 | System.out.println("第二个数累乘上式的值"+g); 2301 | //第一个数累加并赋给第一个数 2302 | a+=g; 2303 | System.out.println("第一个数累加第二个数赋给第一个数的值"+a); 2304 | } 2305 | } 2306 | ``` 2307 | ******************************************************************************* 2308 | 第九题 2309 | 渔夫出海打鱼,收获若干 2310 | 1. 渔夫卖掉一半的鱼,然后送给海伦3条; 2311 | 2. 渔夫又卖掉剩下的鱼的2/3,自己吃掉1条; 2312 | 3. 海伦来看渔夫,问他那天打了多少鱼,渔夫数了数,还剩4条鱼,渔夫对海伦怎么说? 2313 | ```java 2314 | //打鱼--共有多少鱼[Work09.java] 2315 | public class Work09{ 2316 | public static void main(String []args){ 2317 | int total=0; 2318 | int rest=4;//剩余的鱼 2319 | total=((rest+1)*3+3)*2;//逆推 2320 | System.out.println("鱼一共有:"+total); 2321 | } 2322 | } 2323 | ``` 2324 | ******************************************************************************* 2325 | 第十题 2326 | 有一只猴子摘了一堆桃子,当即吃了一半,可是桃子太好吃了,它又多吃了一个,第二天它把第一天剩下的桃子吃了一半,又多吃了一个,就这样到第十天早上它只剩下一个桃子了,问它共摘了多少桃子[Work10.java] 2327 | ```java 2328 | import java.util.*;//加载包 2329 | public class Work10{ 2330 | public static void main(String []args){ 2331 | Monkey mo=new Monkey(); 2332 | mo.scan(); 2333 | } 2334 | } 2335 | class Monkey{ 2336 | //day哪天的桃子数,sday吃了多少天剩下一个 2337 | public static int peach(int day,int sday){//建一个peach方法 2338 | if(day==sday){ 2339 | return 1; 2340 | }else{ 2341 | return (peach(day+1,sday)+1)*2;//算法返回值 2342 | } 2343 | } 2344 | public static void scan(){ //建立输入的方法 2345 | int a=1; 2346 | System.out.println("请输入要吃几天:"); 2347 | Scanner sr=new Scanner(System.in); 2348 | int b=sr.nextInt(); 2349 | if(a0;i++,j--){}//错 2686 | c) 2687 | int i,k; 2688 | for(i=0,k=9;(i<10&&k>0);i++,j--){}//错 2689 | d) 2690 | int i,j 2691 | for(i=0;j=10;i<10;i++,j--){}//错 2692 | ``` 2693 | ------------------------------------------------------------------------------- 2694 | 4. 运行以下代码,将得到什么打印结果? 2695 | ```java 2696 | int i=1; 2697 | switch(i){ 2698 | default: 2699 | System.out.println("default"); 2700 | case 0: 2701 | System.out.println("zero"); 2702 | break; 2703 | case 1; 2704 | System.out.println("one");//执行此语句 2705 | case2; 2706 | System.out.println("two");//执行此语句 2707 | } 2708 | ``` 2709 | ------------------------------------------------------------------------------- 2710 | 5. 以下代码是合法的? 2711 | ```java 2712 | a) 2713 | float x=1;//数据类型错误 2714 | switch(x){ 2715 | case 1: 2716 | System.out.println("Got a 1");//错 2717 | } 2718 | b) 2719 | long y=1;//数据类型错误 2720 | switch(y){ 2721 | case 1: 2722 | System.out.println("Got a 1");//错 2723 | } 2724 | c) 2725 | byte x=1;//低精转高精 2726 | switch(x){ 2727 | case 1/1: 2728 | System.out.println("Got a 1");//正确 2729 | } 2730 | d) 2731 | int x=1; 2732 | int c=1; 2733 | switch(c){ 2734 | case x;//需常量 2735 | System.out.println("Got a 1");//错 2736 | break; 2737 | e) 2738 | short x=1;//数据类型错误 2739 | switch(x){ 2740 | case 3.2/3: 2741 | System.out.println("Got a 1"); 2742 | break; 2743 | } 2744 | f) 2745 | shout x=1;//数据类型错误 2746 | switch(x){ 2747 | case 1,2,3: 2748 | System.out.println("Got a 1");//错 2749 | break; 2750 | } 2751 | ``` 2752 | ------------------------------------------------------------------------------- 2753 | 6. 以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? 2754 | ```java 2755 | public class Myswitch{ 2756 | public static void main(String args[]){ 2757 | Myswitch ms=new Myswitch(); 2758 | ms.amethod(); 2759 | } 2760 | public void amethod(){ 2761 | for(int a=0,b=0;a<2;b=++a,System.out.println("b="+b)){ 2762 | System.out.println("a="+a); 2763 | } 2764 | } 2765 | } 2766 | 结果:a=0 2767 | b=1 2768 | a=1 2769 | b=2 2770 | ``` 2771 | ------------------------------------------------------------------------------- 2772 | 7. 以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? 2773 | ```java 2774 | void looper(){ 2775 | int x=0; 2776 | one: 2777 | while(x<10){ 2778 | two: 2779 | System.out.println(++x); 2780 | if(x>3) 2781 | break two; 2782 | } 2783 | }//无法编译,break two;无法返回到two标签 2784 | ``` 2785 | ------------------------------------------------------------------------------- 2786 | 8. 以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? 2787 | ```java 2788 | public class Hope{ 2789 | public static void main(String args[]){ 2790 | Hope h=new Hope(); 2791 | } 2792 | protected Hope(){ 2793 | int i=1; 2794 | do{ 2795 | System.out.println(i); 2796 | }while(++i<3); 2797 | } 2798 | } 2799 | 结果:1 2 2800 | ``` 2801 | ******************************************************************************* 2802 | 第十四题 2803 | 请编写一个猜拳的游戏 2804 | 有个人Tom设计他的成员变量,成员方法,可以电脑猜拳。电脑每次都会随机生成0,1,2;0表示石头. 1表示剪刀. 2表示布 2805 | ```java 2806 | //与电脑猜拳[Work14_1.java] 2807 | import java.util.*; 2808 | public class Work14_1 { 2809 | public static void main(String[] args) { 2810 | Kais.jingcyx();//调用开始游戏 2811 | } 2812 | } 2813 | //开始退出游戏类 2814 | class Kais{ 2815 | public static void jingcyx(){ 2816 | System.out.println("是否开始猜拳游戏?按1开始,按0退出"); 2817 | Scanner sr=new Scanner(System.in); 2818 | int x=sr.nextInt(); 2819 | switch (x){ 2820 | case 0: 2821 | System.out.println("已退出游戏!"); 2822 | break; 2823 | case 1: 2824 | System.out.println("游戏说明:0代表石头,1代表剪刀,2代表布"); 2825 | Caiquan.caiquan(); 2826 | break; 2827 | default: 2828 | System.out.println("输入错误,请重新输入!"); 2829 | Kais.jingcyx(); 2830 | break; 2831 | } 2832 | } 2833 | } 2834 | //猜拳游戏 2835 | class Caiquan{ 2836 | public static void caiquan(){ 2837 | int a1=0,b1=0,c1=0; 2838 | System.out.print("请输入想玩的盘数:"); 2839 | Scanner p=new Scanner(System.in); 2840 | int ps=p.nextInt(); 2841 | for(int i=1;i<=ps;i++){ 2842 | System.out.println("游戏已开始,请出拳!"); 2843 | Scanner m=new Scanner(System.in); 2844 | int a=m.nextInt();//玩家出拳 2845 | //Random n=new Random(2);//随机函数 2846 | int b=(int)(0+Math.random()*(3-1+1));//随机产生0-2的int数,电脑出拳 2847 | if(a==b){ 2848 | a1++; 2849 | System.out.println("打平!"); 2850 | }else if((a-b)==-1||(a-b)==2){ 2851 | b1++; 2852 | System.out.println("YOU Win!"); 2853 | }else{ 2854 | c1++; 2855 | System.out.println("YOU LOSE"); 2856 | } 2857 | } 2858 | System.out.println("平:"+ a1 +"\n赢:" + b1 +"\n输:"+c1+"\n一共玩了"+(a1+b1+c1)+"局"); 2859 | Kais.jingcyx(); 2860 | } 2861 | } 2862 | ``` 2863 | ******************************************************************************* 2864 | 第十五题 2865 | 请编写一个类koradji(巫师的意思) 2866 | 为类编写如下功能: 2867 | 1. 根据用户的输入某人的生日,可以计算出该人的星座; 2868 | 2. 根据用户的输入年月日可以计算是星期几; 2869 | 3. 可以显示该巫师给多少人算过星相。 2870 | |1月20日- 2月18日|水瓶 |2月19日- 3月20日|双鱼 |3月21日- 4月19日|白羊| 2871 | |-----|-----|-----|-----|-----|-----| 2872 | 4月20日- 5月20日|金牛 |5月21日- 6月20日|双子 |6月21日- 7月22日|巨蟹 2873 | 7月23日- 8月22日狮子 8月23日- 9月22日处女 9月23日-10月22日天秤 2874 | 10月23日-11月21日天蝎 11月22日-12月21日射手 12月22日- 1月19日摩羯 2875 | ```java 2876 | //通过输入生日显示出生在周几。巫师看星座[Wrok15.java] 2877 | import java.util.*; 2878 | public class Work15{ 2879 | public static void main(String []args){ //程序入口 2880 | Start ks=new Start();//调用程序开始类Start,并启用st方法 2881 | ks.st(); 2882 | } 2883 | } 2884 | 2885 | class Start{//程序开始类 2886 | public void st(){ 2887 | System.out.println("年月日格式:19XX XX XX\n请输入出生年月日:"); 2888 | Scanner sr=new Scanner(System.in); 2889 | int year=sr.nextInt();//输入年 2890 | int month=sr.nextInt();//输入月 2891 | int date=sr.nextInt();//输入日 2892 | Rq r=new Rq(); //调用周几类 2893 | r.rq(year,month,date);//将年月日数据传给周几类的rq方法中 2894 | Xinz xz=new Xinz();//调用星座类 2895 | xz.xinz(month,date);//将月日的数据传给星座类中的xinz方法中 2896 | System.out.println("\n是否继续让巫师看星座?\n1. 继续\t2. 退出"); 2897 | Scanner sr1=new Scanner(System.in); 2898 | int o=sr1.nextInt(); 2899 | if(o==1){ 2900 | Start qd=new Start();//输入1调用程序开始类 2901 | qd.st(); 2902 | }else if(o!=1){ //不等于1退出 2903 | Xinz tc=new Xinz(); 2904 | System.out.println("巫师为"+tc.getI()+"人看过星座"); 2905 | System.out.println("退出星座查询,Goodbay!"); 2906 | } 2907 | } 2908 | } 2909 | 2910 | class Rq{//周几类 2911 | public void rq(int year,int month,int date){ 2912 | Calendar c = Calendar.getInstance(); //调用日期Calendar抽象类 2913 | c.set(Calendar.YEAR,year); 2914 | c.set(Calendar.MONTH,month-1); 2915 | c.set(Calendar.DATE,date); 2916 | int week = c.get(Calendar.DAY_OF_WEEK); 2917 | switch (week){ //判断输入的日期是周几 2918 | case 1: 2919 | System.out.println("星期日"); 2920 | break; 2921 | case 2: 2922 | System.out.println("星期一"); 2923 | break; 2924 | case 3: 2925 | System.out.println("星期二"); 2926 | break; 2927 | case 4: 2928 | System.out.println("星期三"); 2929 | break; 2930 | case 5: 2931 | System.out.println("星期四"); 2932 | break; 2933 | case 6: 2934 | System.out.println("星期五"); 2935 | break; 2936 | case 7: 2937 | System.out.println("星期六"); 2938 | break; 2939 | } 2940 | } 2941 | } 2942 | 2943 | class Xinz{ //星座类 2944 | public static int i=0;//定义静态变量i,i为统计调用人数计数器 2945 | public void xinz(int month,int date){ //判断星座的方法 2946 | i++;//调用此方法计数累器 2947 | switch(month){ 2948 | case 1:{ 2949 | if(date>=20){ 2950 | System.out.println("水瓶座"); 2951 | }else{ 2952 | System.out.println("摩羯座"); 2953 | } 2954 | break; 2955 | } 2956 | case 2:{ 2957 | if(date>=19){ 2958 | System.out.println("双鱼座"); 2959 | }else{ 2960 | System.out.println("水瓶座"); 2961 | } 2962 | break; 2963 | } 2964 | case 3:{ 2965 | if(date>=21){ 2966 | System.out.println("白羊座"); 2967 | }else{ 2968 | System.out.println("双鱼座"); 2969 | } 2970 | break; 2971 | } 2972 | case 4:{ 2973 | if(date>=20){ 2974 | System.out.println("金牛座"); 2975 | }else{ 2976 | System.out.println("白羊座"); 2977 | } 2978 | break; 2979 | } 2980 | case 5:{ 2981 | if(date>=21){ 2982 | System.out.println("双子座"); 2983 | }else{ 2984 | System.out.println("金牛座"); 2985 | } 2986 | break; 2987 | } 2988 | case 6:{ 2989 | if(date>=21){ 2990 | System.out.println("巨蟹座"); 2991 | }else{ 2992 | System.out.println("金牛座"); 2993 | } 2994 | break; 2995 | } 2996 | case 7:{ 2997 | if(date>=23){ 2998 | System.out.println("狮子座"); 2999 | }else{ 3000 | System.out.println("巨蟹座"); 3001 | } 3002 | break; 3003 | } 3004 | case 8:{ 3005 | if(date>=20){ 3006 | System.out.println("处女座"); 3007 | }else{ 3008 | System.out.println("巨蟹座"); 3009 | } 3010 | break; 3011 | } 3012 | case 9:{ 3013 | if(date>=23){ 3014 | System.out.println("天平座"); 3015 | }else{ 3016 | System.out.println("处女座"); 3017 | } 3018 | break; 3019 | } 3020 | case 10:{ 3021 | if(date>=23){ 3022 | System.out.println("天蝎座"); 3023 | }else{ 3024 | System.out.println("天平座"); 3025 | } 3026 | break; 3027 | } 3028 | case 11:{ 3029 | if(date>=22){ 3030 | System.out.println("射手座"); 3031 | }else{ 3032 | System.out.println("天蝎座"); 3033 | } 3034 | break; 3035 | } 3036 | case 12:{ 3037 | if(date>=22){ 3038 | System.out.println("摩羯座"); 3039 | }else{ 3040 | System.out.println("射手座"); 3041 | } 3042 | break; 3043 | } 3044 | } 3045 | } 3046 | public int getI(){ //返回统计调用次数 3047 | return i; 3048 | } 3049 | } 3050 | ``` 3051 | ******************************************************************************* 3052 |   3053 | 3054 | 第十六题 3055 | 10个人投票选班长,有三个侯选人(张三,李四,王五),通过编号投票,要求最后显示班长姓名。[Work16.java] 3056 | ```java 3057 | import java.util.*; 3058 | public class Work16 { 3059 | public static void main(String[] args) { 3060 | //设定投票人数 3061 | System.out.print("设定投票人数:"); 3062 | Scanner sr=new Scanner(System.in); 3063 | int a=sr.nextInt(); 3064 | System.out.print("请输入第1位侯选人的名字:\n"); 3065 | Scanner sr1=new Scanner(System.in); 3066 | String i1=sr1.nextLine();//键盘接收字符串 3067 | System.out.print("请输入第2位侯选人的名字:\n"); 3068 | Scanner sr2=new Scanner(System.in); 3069 | String i2=sr2.nextLine(); 3070 | System.out.print("请输入第3位侯选人的名字:\n"); 3071 | Scanner sr3=new Scanner(System.in); 3072 | String i3=sr3.nextLine(); 3073 | System.out.println("本次选举将有"+ a +"人参与!"); 3074 | System.out.println("1号:"+i1+"\t2号:"+i2+"\t3号:"+i3); 3075 | Xuanju tp=new Xuanju(); 3076 | tp.tp(a,i1,i2,i3); 3077 | } 3078 | } 3079 | class Xuanju{ 3080 | public void tp(int a,String i1,String i2,String i3){ 3081 | int j1=0,j2=0,j3=0,qq=0;//计票器 3082 | for (int i=1;i<=a;i++){ //统计投票 3083 | System.out.println("请投票,投票请按1,2,3:"); 3084 | Scanner tp=new Scanner(System.in); 3085 | int b=tp.nextInt(); 3086 | System.out.println("已有"+ i +"人投票"); 3087 | switch (b){ 3088 | case 1: 3089 | j1++; 3090 | break; 3091 | case 2: 3092 | j2++; 3093 | break; 3094 | case 3: 3095 | j3++; 3096 | break; 3097 | default: 3098 | qq++; 3099 | break; 3100 | } 3101 | } 3102 | 3103 | if(j1>j2&&j1>j3){ 3104 | System.out.println(i1 +"得"+ j1 +"票\n"+ i2 +"得"+ j2 +"票\n"+ i3 +"得"+ j3 +"票\n"+"弃权票数"+qq); 3105 | System.out.println("恭喜" + i1 + "当选班长!"); 3106 | }else if(j1j3){ 3107 | System.out.println(i1 +"得"+ j1 +"票\n"+ i2 +"得"+ j2 +"票\n"+ i3 +"得"+ j3 +"票\n"+"弃权票数"+qq); 3108 | System.out.println("恭喜" + i2 + "当选班长!"); 3109 | }else if(j3>j1&&j2