2023年6月20日发(作者:)

黑马程序员入学Java知识——精华总结

J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结!

一、黑马程序员—java概述与基础知识 .................... 9

1、何为编程? ...................................... 9

2、Java语言概述,历史、特点 ........................ 9

3、什么是跨平台性?原理是什么?JVM ................ 11

4、Jre和Jdk的区别? ............................... 11

5、java虚拟机JVM ................................. 12

6、 Java程序运行机制 .............................. 12

7、 学习java注意的地方 ........................... 12

8、Java语法格式 ................................... 13

9、代码注释:单行//,多行/* */,文档注释/** */ .... 13

10、Java中的标识符 ................................ 14

11、java中的常量和变量 ............................ 14

12、Java成员变量和局部变量 ........................ 15

14、基本数据类型转换之向上转型和向下转换 .......... 18

15、Java的运算符 .................................. 19

16、表达式和三目运算符 ............................ 20

17、程序流程控制 .................................. 21

18、三大循环结构: ................................. 24

19、嵌套循环与流程控制 ............................ 26

第 1 页 二、黑马程序员—方法与数组 ........................... 28

1、什么是方法(Method)? ......................... 28

2、 Java中方法的格式: ............................ 29

3、方法里的属性 ................................... 29

4、方法特点 ....................................... 30

5、什么是方法的重载(Overload)? ................. 31

6、 可变参数 ...................................... 33

7、数组简介: ..................................... 34

8、一维数组的声明与初始化: ....................... 34

9、数组的使用: ................................... 36

10、分配内存空间 .................................. 38

11、二维数组: .................................... 39

12、操作数组的工具类-Arrays ....................... 40

13、Java5新特性对数组的支持: ..................... 42

三、黑马程序员—面向对象(1) ........................ 42

1、什么叫面向对象? ............................... 42

2、类 ............................................. 43

3、构造方法 ....................................... 45

4、static关键字 ................................... 47

5、匿名对象 ....................................... 48

6、this关键字..................................... 48

7、面向对象之封装 ................................. 49

第 2 页 8、访问修饰符 ..................................... 50

9、类的设计分析 ................................... 50

10、面向对象之继承 ................................ 51

11、子类访问父类和方法覆写 ........................ 53

12、super关键字和调用父类构造方法 ................. 54

13、面向对象之多态 ................................ 55

14、引用变量类型转换 .............................. 58

四、黑马程序员—面向对象(2) ........................ 58

1、基本数据类型的包装类 ........................... 58

2、基本数据类型和包装类相互转换 ................... 59

3、基本类型和String之间的转换 .................... 60

4、Object类 ...................................... 61

5、代码块 ......................................... 62

6、构造方法的私有化 ............................... 64

7、 Singleton模式(单例模式) 饿汉式和懒汉式 ........ 65

8、final 关键字 ................................... 67

9、抽象类 ......................................... 68

10、抽象类的体现-模板模式 ......................... 71

11、接口(interface) ............................... 73

12、接口的使用 .................................... 75

13、面向接口编程之制定标准和简单工厂模式 .......... 76

14、面向接口编程之适配器模式 ...................... 78

第 3 页 15、 接口和抽象类的比较 ........................... 79

16、匿名内部类 .................................... 80

17、枚举类 ........................................ 80

五、黑马程序员—异常处理和常用类 ..................... 84

1、异常 ........................................... 84

2、异常处理格式 ................................... 85

3、多异常处理 ..................................... 86

4、异常的分类 ..................................... 87

5、声明异常(throws) ............................. 88

6、throw .......................................... 89

8、throw和catch同时使用 .......................... 91

9、常用类 ......................................... 92

10、String方法 .................................... 95

11、StringBuffer 与 StringBuilder ................. 98

12、Math和Random和UUID ......................... 103

13、Date和Calendar .............................. 105

14、System ....................................... 110

六、黑马程序员—线程技术 ............................ 111

1、进程和线程 .................................... 112

2、创建线程方式 .................................. 113

3、两种进程创建方式比较 .......................... 115

4、线程的生命周期 ................................ 117

第 4 页 5、控制线程 ...................................... 118

6、多线程安全问题 ................................ 121

7、多线程安全问题的解决方法 ...................... 123

8、线程通信 ...................................... 128

七、黑马程序员—集合框架(1) ....................... 133

1、集合类 & 容器 ................................ 133

2、Collection接口 ................................ 134

3、Iterator接口 .................................. 135

4、集合遍历输出方式 .............................. 136

6、TreeSet ....................................... 142

7、List接口 ..................................... 148

8、List接口中常用类 .............................. 151

9、Map接口 ...................................... 156

八、黑马程序员—集合框架(2) ....................... 160

1、Collections类 ................................. 161

2、Arrays ........................................ 164

3、泛型(Generic) ................................. 165

4、泛型的使用 .................................... 165

5、声明多个泛型类型和通配符 ...................... 172

6、泛型的上限与下限 .............................. 173

7、泛型接口和方法 ................................ 176

8、泛型的嵌套(map例子) ......................... 177

第 5 页 九、黑马程序员—IO操作(1) ......................... 179

1、IO的概述和File方法 ........................... 179

2、递归(Recursion) ............................... 182

3、文件过滤器 meFilter ............. 183

4、流 ............................................ 185

5、操作流的步骤(重点) .......................... 186

6、字节流和字符流 ................................ 188

7、文件拷贝 ...................................... 191

8、字节→字符转换流 .............................. 194

9、自动关闭资源的try语句 ........................ 195

十、IO文件操作(2) ................................. 197

1、内存操作流 .................................... 197

2、打印流 ........................................ 200

3、格式化输出 .................................... 202

4、标准流 ........................................ 204

5、Scanner(简单文本扫描器) ....................... 206

6、缓冲流 ........................................ 209

7、合并流(SequenceInputStream) ................. 211

十一、黑马程序员—网络编程 .......................... 213

1、什么是网络编程? .............................. 213

2、网络通讯要素 .................................. 213

3、TCP和UDP的联系和用途 ......................... 214

第 6 页 4、InetAddress与Socket .......................... 216

5、UDP传输 ...................................... 217

6、TCP传输 ...................................... 224

8、小例子 ........................................ 233

十二、黑马程序员—反射机制 .......................... 237

1、反射的概念 .................................... 237

2、获得Class对象 ................................ 239

3、九个预定义Class对象 .......................... 240

4、利用Class获取类的属性信息 .................... 242

5、Class中得到构造方法Constructor、方法Method、字段Field ............................................ 244

6、利用反射创建对象 .............................. 252

7、使用反射调用方法 .............................. 256

8、使用反射调用可变参数方法 ...................... 259

9、使用反射操作字段 .............................. 260

10、反射和泛型-反射来获取泛型信息 ................ 263

十三、黑马程序员—反射机制 .......................... 266

1、GUI(图形用户界面) ............................. 266

2、布局管理器 .................................... 267

3、事件监听机制组成 .............................. 269

4、Dialog ........................................ 278

5、菜单 .......................................... 283

第 7 页 1、Eclipse的使用技巧 ............................. 288

2、静态导入(1.5特性,好处是不用写类名) ......... 292

3、可变参数 ...................................... 292

5、基本数据类型的自动拆箱与装箱 .................. 294

6、枚举 .......................................... 295

7、反射实现框架功能 .............................. 297

1、内省了解JavaBean ............................ 299

2、内省综合案例和Beanutils工具包 ................ 301

3、注解(Annotation) ............................ 305

4、泛型 .......................................... 310

1、类加载器 ...................................... 317

2、类加载器的委托机制 ............................ 318

3、一个类加载器的高级问题分析 .................... 324

4、 代理的概念与作用 ............................. 324

5、动态代理技术 .................................. 326

6、分析JVM动态生成的类 .......................... 327

8、 实现类似spring的可配置的AOP框架 ............ 338

黑马程序员——面试题之交通灯管理系统 ............. 345

1、面向对象的分析与设计 .......................... 345

2、Road类的编写 .................................. 347

3、Lamp类的编写 .................................. 349

4、LampController类的编写 ........................ 353

第 8 页 5、MainClass类的编写 ............................. 354

黑马程序员——面试题之银行业务系统 ............... 357

1、需求 .......................................... 357

2、需求分析 ...................................... 358

3、NumberManager类 ............................... 359

4、NumberMachine类 ............................... 360

5、CustomerType枚举类 ............................ 361

6、ServiceWindow类 ............................... 362

7、MainClass类与Constants类 ..................... 367

一、黑马程序员—java概述与基础知识

1、何为编程?

编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。

为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。

2、Java语言概述,历史、特点

是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级语言。

第 9 页 是一种面向Internet的编程语言。

随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。

是简单易学,完全面向对象,安全可靠,及平台无关的编程语言。

java5.0之后的三大技术框架

J2EE(Java 2 Platform Enterprise Edition)企业版

在jdk5.0版本后称为JAVAEE,是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如Servlet Jsp等,主要针对于Web应用程序开发。是传智播客就业班和黑马训练营的主要学习内容之一.。

J2SE(Java 2 Platform Standard Edition)标准版

在jdk5.0版本后称为JAVASE,这是在java基础阶段主要学习的内容,也是java的基础,以后不管从事Android开发或者是物联网+云计算的开发,等是建立在JSE基础上的,因此该技术是java的最核心技术,是传智播客基础班的主要上课内容.。

J2ME(Java 2 Platform Micro Edition)小型版

在jdk5.0版本以后称为JAVAME,该技术多应用于一些电子产品的嵌入式开发,以前在手机开发上应用的也比较多,但是随着智能手机的发展,现在手机应用程序(比如Android程序)的开发已经不再使用该技术。

第 10 页 3、什么是跨平台性?原理是什么?JVM

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。(注意不是能在所有的平台上运行,关键是该平台是否能安装相应的虚拟机)。

我的总结:Java程序之所以能够实现跨平台运行,是因为它根本就不直接运行在任何底层平台上,而是需要在哪里运行,就在哪里(如Windows平台)事先准备好自己的Java平台,而这只是仅仅是安装和配置一个软件而已!

4、Jre和Jdk的区别?

JRE:(Java Runtime Environment),java运行环境。包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE 即可。

JDK:(Java Development Kit Java)开发工具包。JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。

其中的开发工具:编译工具() 打包工具()等

简单而言:使用JDK开发完成的java程序,交给JRE去运行。

我的总结:必须熟练的记忆,核心类库,开发工具!

第 11 页 5、java虚拟机JVM

Java Virtual Machine ,简称JVM;

它是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一,JVM读取并处理编译过的及平台无关的字节码(class)文件。

Java编译器针对JVM产生class文件,因此是独立于平台的。

Java解释器负责将JVM的代码在特定的平台上运行。

Java虚拟机是不跨平台的.

6、Java程序运行机制

编译: javac 文件名.文件后缀名

运行: java 类名

我的总结:Java程序的组成:Java源文件,字节码文件。

7、学习java注意的地方

Java语言拼写上严格区分大小写;

一个Java源文件里可以定义多个Java类,但其中最多只能有一个类被定义成public类;

若源文件中包括了public类,源文件必须和该public类同名;

一个源文件中包含N个Java类时,编译后会生成N份字节码文件,即每个类都会生成一份单独的class文件,且字节码文件名和

其对应的类名相同;

我的总结:一个Java源文件只定义一个类,不同的类使用不同的源文件定义;

第 12 页 将每个源文件中单独定义的类都定义成public的;

保持Java源文件的主文件名及源文件中的类名一致;

8、Java语法格式

任何一种语言都有自己的语法规则,Java也一样,既然是规则,那么知道其如何使用就可以了。

代码都定义在类中,类由class来定义,区分 public class 和

class;

代码严格区分大小写,如main 和 Main 是不一样的;

Java中的标识符及关键字;

注释;

main方法的作用:

程序的入口

保证程序的独立运行

被JVM调用

9、代码注释:单行//,多行/* */,文档注释/** */

1.单行注释 //:

//后到本行结束的所有字符会被编译器忽略;

2.多行注释 /* */:

/* */之间的所有字符会被编译器忽略

3.文档注释 /** */:

在/** */之间的所有字符会被编译器忽略,java特有的(用于生成文档);

第 13 页 我的总结:多行和文档注释都不能嵌套使用。

10、Java中的标识符

可简单理解为在Java程序中为了增强阅读性自定义的名称。比如:类名,方法名,变量名等。

命名规则:

(1) 由字母、数字、下划线、$组成,不能以数字开头

注意:此处的字母还可以是中文,日文等;

(2) 大小写敏感

(3) 不得使用java中的关键字和保留字

(4) 别用Java API里面的类名作为自己的类名。

11、java中的常量和变量

变量的概念:

占据着内存中的某一个存储区域;

该区域有自己的名称(变量名)和类型(数据类型);

该区域的数据可以在同一类型范围内不断变化;

为什么要定义变量:

用来不断的存放同一类型的常量,并可以重复使用;

使用变量注意:

变量的作用范围, 初始化值

定义变量的格式:

数据类型 变量名 = 初始化值;

注:格式是固定的,记住格式,以不变应万变。

第 14 页 作用范围:定义开始到定义它的代码块结束;

同一范围内,不允许多个个局部变量命名冲突

12、Java成员变量和局部变量

局部变量:不是声明在类体括号里面的变量;

局部变量使用前必须初始化值;

局部变量没有默认初始化值;

局部变量的作用域是从定义开始到定义它的代码块结束;

成员变量:在方法体外,类体内声明的变量,又称字段(Field)或全局变量;(其实Java中没有全局变量,由于Java是面向对象语言,所有变量都是类成员)

成员变量的作用域是整个类中;

我的总结:注意成员变量和局部变量的区别

package reviewDemo;

public class Demo2 {

public static void main(String[] args) {

int i;

n(i);

}

}

备注:局部变量调用前没有初始化,所以编译的时候就会报错!

第 15 页 package reviewDemo;

public class Demo2 {

static int i;

public static void main(String[] args) {

n(i);

}

}

备注:此时i为全局变量,未初始化会被赋予默认的初始化值!程序正确!

我的总结:

局部变量是定义在方法中的变量,,,出了该方法就不能访问该变量了....

成员变量是在类中定义,,,,并且在类的成员方法中都能访问的变量..

13、基本数据类型

在数据类型中,最常用也是最基础的数据类型,被称作基本数据类型。可以使用这些类型的值来代表一些简单的状态。

第 16 页 Java 语言的基本数据类型总共有以下8 种,下面是按照用途划分出的4 个类别:

定点类型:

整数型是一类代表整数值的类型。当需要代表一个整数的值时,可以根据需要从4 种类型中挑选合适的,如果没有特殊要求的话,一般选择int 类型。4 种整数型区别主要在每个数据在内存中占用的空间大小和代表的数值的范围。

浮点类型:

小数型是一类代表小数值的类型。当需要代表一个小数的值时,可以根据需要从以下2 种类型中挑选合适的。如果没有特殊要求,一般选择double类型。

由于小数的存储方式和整数不同,所以小数都有一定的精度,所以在计算机中运算时不够精确。根据精度和存储区间的不同,设计了两种小数类型。

字符型:

字符型代表特定的某个字符,按照前面介绍的知识,计算机中都是以字符集的形式来保存字符的,所以字符型的值实际只是字符集中的编号,而不是实际代表的字符,由计算机完成从编号转换成对应字符的工作。Java 语言中为了更加方便国际化,使用Unicode 字符集作为默认的字符集,该字符集包含各种语言中常见的字符。在程序代码中,字符使用一对单引号加上需要表达的字符来标识,例

如’A’、’a’等,当然也可以直接使用字符编码,也就是一个非负整第 17 页 数进行表示。

布尔型:

布尔型代表逻辑中的成立和不成立。Java 语言中使用关键字true 代表成立,false 代表不成立。布尔型是存储逻辑值的类型,其实很多程序中都有逻辑值的概念,Java 把逻辑的值用布尔型来进行表达。

14、基本数据类型转换之向上转型和向下转换

向上转换:

整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:

容量小的类型可自动转换为容量大的数据类型;

byte,short,char → int → long → float → double

byte,short,char之间不会相互转换,他们在计算时首先会转换为int类型。

boolean 类型是不可以转换为其他基本数据类型。

Eg:

int i = 123;

long l = i; //自动转换,不需强转

float f = 3.14F;

double d = f;

向下转换:

整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:

第 18 页 容量小的类型可自动转换为容量大的数据类型;

byte,short,char → int → long → float → double

byte,short,char之间不会相互转换,他们在计算时首先会转换为int类型。

boolean 类型是不可以转换为其他基本数据类型。

Eg:

long l = 123L;

int i = (int) l;//必须强转

double d = 3.14;

float f = (float) d;

我的总结:类型转化

小转大,自动!自动类型转换(也叫隐式类型转换)

大转小,强转!强制类型转换(也叫显式类型转换)

15、Java的运算符

运算符是一种特殊符号,用以表示数据的运算、赋值和比较等共分以下几种:

算术运算符(+ 、— 、* 、/ 、%)

赋值运算符(= 、+=、-=、*=、/=,、%=)

关系运算符(>、>=、<、<=、!=)

条件运算符(&&、||、!&、|、^)

位运算符(&、|、^、~、>>、<<、<<<、>>>)

我的总结:

第 19 页 逻辑运算符用于连接布尔型表达式,在Java中不可以写成33 & x<6 。

“&”和“&&”的区别:单及时,左边无论真假,右边都进行运算;双及时,如果左边为真,右边参及运算,如果左边为假,那么右边不参及运算。

“|”和“||”的区别同理,双或时,左边为真,右边不参及运算。

“ ^ ”及“|”不同之处是:当左右都为true时,"^"结果为false。

16、表达式和三目运算符

是由数字、运算符、数字分组符号(括号)等以能求得数值的有意义排列的序列;

a + b

3.14 + a

(x + y) * z + 100

boolean b= i < 10 && (i%10 != 0)

表达式的类型和值:

对表达式中操作数进行运算得到的结果是表达式的值。

表达式值的数据类型即为表达式的类型。

表达式的运算顺序

应按照运算符的优先级从高到低的顺序进行;

优先级相同的运算符按照事先约定的结合方向进行;

“三目运算符”,语法格式:

x ? y : z;

第 20 页 其中x为boolean类型表达式,先计算x的值,若为true,则整个三目运算符的结果是表达式y的值,否则就是z的值。

package reviewDemo;

public class Demo2 {

public static void main(String[] args) {

String s = "lz";

s = (s == "lz" ? "正确" : "错误");

n(s);

输出:正确

17、程序流程控制

顺序结构

分支结构(条件结构)

循环结构

控制循环结构

顺序结构:

如果代码里没有流程控制,程序是至上而下一行一行执行的,一条语句执行完之后继续执行下一条语句,直到程序的最后。

if语句:

基本语法:if(表达式){方法体}else if(表达式){方法体}else(方法体)

几种形式:

三种格式:

第 21 页 if(条件表达式){执行语句;}

if(条件表达式){执行语句;}else{执行语句;}

if(条件表达式){执行语句;}else if (条件表达式){执行语句;}……else{执行语句;}

public class If3

public static void main(String args[])

int i = 3;

if (i > 5)

n("变量i大于5");

else if (i > 4)

n("变量i小于4");

else

n("其他");

switch控制语句

格式:

switch(表达式)

case 表达式可能的结果值1:

执行语句;

break;

case 表达式可能的结果值2:

执行语句;

break;

第 22 页 default:

执行语句;

break;//最后这个一般不写

备注:

case之间及default没有顺序。先执行第一个case,都没有匹配的case值执行default。

结束switch语句的两种情况:遇到break,switch语句执行结束。

如果匹配的case或者default没有对应的break,那么程序会从第一次匹配的case语句开始继续向下执行,运行可以执行的语句,直到遇到break或者switch结束为止。

class switch2

public static void main(String[] args)

int a = 7,b = 5;

switch(a-b)

case 3://表达式可能的值;

n("33!");

break;

case 4:

n("44!");

break;

default://都没有执行则 执行该语句!

n("其它的");

第 23 页 18、三大循环结构:

用于处理需要重复执行的操作;

根据判断条件的成立及否,决定程序段落的执行次数,而这个程序段落我们称为循环体;

while:事先不需要知道循环执行多少次;

do while:同上,只是至少要执行一次(先做,后判断);

for:需要知道循环次数;

循环结构(while & do while)

while语句

格式:

while(条件表达式值为true)

执行语句;

do while语句

格式:

do

执行语句;

while(条件表达式值为true);

我的总结:do while特点是无论条件是否满足,循环体至少被执行一次。

循环里的条件表达式不能直接写false或直接写结果是false的表达式,不过可以使用变量来传递false值;

循环结构(for)

第 24 页 格式:

for(初始化表达式(1);循环条件表达式(2);循环后的操作表达式(3))

执行语句;(4)

执行顺序:(1) → (2) → (4) → (3) → (2) → (4) → (3)

备注:

1, for里面的3个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。

2, while及for可以互换,区别在于for为了循环而定义的变量在for循环结束就在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。

3, 最简单无限循环格式:while(true) , for(;;),无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。

Eg:

用三种循环控制求出100以内前5个3的倍数的数字;

class while

public static void main(String[] args)

int i = 1,k = 0;

while(i<=100)

if(i%3==0)

if(k<5)

第 25 页 n(i);

k++;

i++;

class dowhile

public static void main(String[] args)

int i = 1,k = 0;

do{

if(i%3==0)

if(k<5)

n(i);

k++;

i++;

while(i<=100);

class for

public static void main(String[] args)

int i = 1,k = 0;

for(;i<100;i++)

if(i%3==0&&k<5)

n(i);

k++;

19、嵌套循环及流程控制

嵌套循环:循环里套循环

第 26 页 假设外循环的循环次数是m次,内循环的循环次数是n次,那么内层循环的循环次数需要 m * n次。

Eg:利用for循环语句的嵌套打印出乘法口诀表

class break1

public static void main(String[] args)

for(int i=1;i<=10;i++)//定义i及j的值必须在for循环里面,否则每次跳出循环重新执行就无法取值

for(int j=1;j<=10;j++)

if(j<=i)

(j+"*"+i+"="+i*j+" ");//小注意:print()括号里面

必须传递参数,println()无限制!

n();

流程控制

break语句、 continue语句;

break:终止该层循环;

continue:跳过该层循环

注:

①:若这两个语句离开应用范围,存在是没有意义的。

②:这个两个语句后面都不能有语句,因为执行不到。

③:continue语句是跳过本次循环,继续下次循环。

④:标签的出现,可以让这两个语句作用于指定的循环。

第 27 页 Eg:

package reviewDemo;

public class Demo2 {

public static void main(String[] args) {

int i = 1;

for (; i < 10; i++) {

n(i);

if(i == 8){

break;//流程控制,不会完全执行!

二、黑马程序员—方法与数组

第二篇:

1、什么是方法(Method)?

方法是一组为了实现特定功能的代码块的集合。方法在语法上的功能主要有以下两个:

①:结构化代码

将代码按照功能进行组织,使代码的结构比较清晰,容易阅读和修改,也就是程序的可维护性强。

②:减少代码重复

一个固定的功能,可能会在程序中多次使用,在使用时只需要调用写好的方法,而不用重复书写对应的功能代码。

方法在书写时需要注意以下两点:

第 28 页 ①:逻辑严谨

方法实现的一个完整的功能,所以在书写时要考虑到各种可能的情况,并对每种情况做出恰当的处理。

②:通用性强(可重复利用)

方法实现的是一种功能,在实际实现时,可以根据需要,使方法具备一定的通用性,除非必要,否则不要写专用的方法。在Java 语言中,恰当的使用方法,将使程序更加优雅,便于阅读和使用。

我的总结:

方法:一段可重复使用的代码段;

程序中完成独立功能的一段代码的集合。

2、Java中方法的格式:

[修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……])

执行语句; [return 返回值;]//需要的话

参数列表(参数的类型 ,参数的个数,参数的顺序)

我的总结:只要上述有一个不一样,那么这个参数列表就不一样!对于方法而言,即使同名也不是同一个方法,也就是下面讲的方法签名。

3、方法里的属性

访问控制符:访问控制符限定方法的可见范围,或者说是方法被调用的范围。方法的访问控制符有四种,按可见范围从大到小依次是:public、protected,无访问控制符,private。其中无访问控制符不书写关键字即可。具体的范围在后续有详细介绍。

第 29 页 形式参数:在方法被调用时用于接收外界输入的数据。

实参:调用方法时实际传给方法的数据。

返回值:方法在执行完毕后返还给调用它的环境的数据。

返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回类型 void。

方法签名:方法名和方法的参数列表(能区别方法);//最关键的

java语言中调用方法:对象名.方法名(实参列表)。

实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配。

return 语句终止方法的运行并指定要返回的数据。

4、方法特点

它可以实现独立的功能;

必须定义在类里面;

它只有被调用才会执行;

它可以被重复使用;

方法结束后方法里的对象失去引用;

如何定义一个功能,并通过方法体现出来:

明确该功能运算后的结果.明确返回值类型;

明确在实现该功能过程中是否有未知内容参及运算,确定参数列表;

Eg:

package reviewDemo;

第 30 页 * player 的值分别是1,2,3或者其他值时,该方法返回“大明”,“二明”,“小明”,“我没有这个孩子”。

public class Demo2 {

public static void main(String[] args) {

int player = 5;

n("返回的结果是:"+show(player));

public static String show(int p){

switch (p) {

case 1:

return "大明";

case 2:

return "二明";

case 3:

return "小明";

default:

return "我没有这个孩子!";

5、什么是方法的重载(Overload)?

概念:

在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型或参数顺序不同即可。

存在的原因:

屏蔽了一个对象的同一类方法由于参数不同所造成的差异。

第 31 页 特点:

及返回值类型无关,只看参数列表。

以下是方法重载的示例:

public void a(int a){}

public int a(){}

public void a(int a,String s){}

Eg:

class Chongzai

public static void main(String[] args)

int ret = name(3,4,5);

n(ret);

public static int name(int a, int b)

int c = a+b;

return c;

public static int name(int a, int b, int m)//这就叫做方法的重载,只要参数列表不一样。好处:用户使用时限制很小;

int c = a+b+m;

return c;

我的总结:方法重载,方法名相同,但是参数列表不一致!(和方法覆写不一样,方法覆写的方法名和参数列表都必须一样),注意方法重载和方法覆写的不同!

第 32 页 6、可变参数

从java5开始出现了可变参数,这是对java方法及数组的拓展!

方法中可以接受的参数不再是固定个数的,而是随着具体需求传递的多少来决定。

定义格式: 返回值类型 方法名(参数类型 ... 形式参数){ }

可变参数的特点:

只能出现在参数列表的最后;

... 位于变量类型和变量名之间,前后有无空格都可以;

调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

Eg:

package reviewDemo;

import ;

public class Demo6 {

public static void main(String[] args) {

int []age = {1,2,3,69,36,636,459};

show(age);

public static void a){//此时这里写的就是可变参数,和数组的作用一样!

//把数组给打印出来!

n(ng(a));

第 33 页 7、数组简介:

数组(Array)是Java 语言中内置的一种基本数据存储结构,通俗的理解,就是一组数的集合,目的是用来一次存储多个数据。数组是程序中实现很多算法的基础,可以在一定程度上简化代码的书写。

备注:

1.

数组的好处:数组里的每个元素都有编号,编号从0开始,并且依次递增,方便操作这些元素;

2.

3.

4.

使用Java数组:必须先声明数组,再给该数组分配内存;

数组对应在内存中一段连续空间。

数组元素必须是相同数据类型,也可以是引用数据类型,但是同一个数组中的元素必须是同一类数据类型。

8、一维数组的声明及初始化:

一维数组:可以理解为一列多行、类型相同的数据,其中每个数据被称为数组元素;

一维数组的声明方式:

type varName[]; 或 type[] varName;(推荐)

Eg:int age[]; int []age;

数组的长度一旦确定,就不能改变,也就数组是定长的;

我的总结:java语言声明数组的时候不能指定其长度(元素的个数)

Eg:int a[5]; //非法

初始化:

Java中的数组必先初始化才可以使用,所谓初始化就是为数组的数第 34 页 组元素分配内存,并为每个数组元素赋值;

数组初始化的两种方式:

静态初始化:初始化时由我们自己指定每个数组元素的初始值,由系统决定需要的数组长度;

格式:数组名 = new 数组类型[]{元素1,元素2,元素3...元素n};

简化语法:数组名 = {元素1,元素2,元素3...元素n};

动态初始化:初始化时由我们指定数组的长度,由系统为数组元素分配初始值;

格式:数组名 = new 数组类型[数组长度];

我的总结:

不能静态和动态初始化同时使用:

也就是说不能同时指定数组的长度和元素;

Eg:

package reviewDemo;

* 声明数组及初始化

public class Demo3 {

public static void main(String[] args) {

int []age = new int[10];

//动态初始化

for (int i = 0; i < ; i++) {

age[i] = i;

(age[i]+" ");

第 35 页 输出:0 1 2 3 4 5 6 7 8

9

9、数组的使用:

Java语言的数组索引是从0开始的,也就是说数组里的第一个元素的索引是0,第二个元素的索引是1,依次可以类推。

常见操作:

给数组元素赋值

数组名[索引] = 数组类型的值 ;

访问数组元素

数组类型 变量 = 数组名[索引];

得到数组的长度

int len = 数组名.length; //length是数组的属性

遍历数组(备注:length 属性和循环语句)

数组元素的索引范围(0,长度—1)

Eg:判断数组是否重复

package reviewDemo;

* 判断数组是否重复

public class Demo3 {

public static void main(String[] args) {

int []age = {1,2,3,4,5,6,5};

for (int i = 0; i < -1; i++) {//双层循环,定住一个,再考虑下一个!

第 36 页 for (int j = i+1; j < ; j++) {

if(age[i] == age[j]){

n("有重复的!"+i+" "+j);

break;

求最大值:

package reviewDemo;

public class Demo4 {

public static void main(String[] args) {

int age[] = new int[] { 12, 26, 3, 60, 55, 6, 48, 4, 98 };

int max = age[0];

for (int i = 0; i < ; i++) {

if (max < age[i]) {

max = age[i];

n(max);

经典用法:冒泡法排序

package reviewDemo;

import ;

//冒泡排序

public class Demo6 {

public static void main(String[] args) {

int []age = {1,2,36,363,56,95,12,32,1232,3263};

for (int i = 0; i < ; i++) {

第 37 页 for (int j = i+1; j <= -1; j++) {

if(age[i] > age[j]){

int temp = age[i];

age[i] = age[j];

age[j] = temp;

n(ng(age));

//输出为:[1, 2, 12, 32, 36, 56, 95, 363, 1232, 3263]

10、分配内存空间

分配内存空间

数组名=new 数据类型[数组长度];

new关键字用来实现为数组或对象分配内存

数组具有固定的长度。获取数组的长度: 数组名.length

定义数组+分配内存空间

数据类型[]数组名=new 数据类型[数组长度];

定义数组时不指定长度,分配空间时指定数组长度;如:String

cities[] = new String[6];

数组元素:

数组名[下标值];

数组下标从0开始 scores[0]=75;

数组的内存分配 栈内存和堆内存

如定义一个数组 int[]scores将在栈内存中为scores 分配内存空间,其值是一个不确定的值。

第 38 页 当执行语句scores=new int[5]时,将在堆内存分配连续5个空间,每个空间4个字节,用于存放整型数据,其初始值为0,然后将该段空间首地址,也就是第一个元素的地址,比如0*3000,赋给scores变量。该地址相当于一个指针,指向堆内存中分配的空间。此时堆内存中分配的5个空间可以分别使用scores[0],一直到scores[4]来表示。当执行四个赋值语句时,分别用指定值填充到对应元素位置。如果此时将null值赋给scores时,scores变量将不再指向任何位置,此时堆内存中分配的空间就变成了垃圾,由垃圾回收器在某一时间进行回收。

在方法中定义的变量,包括基本数据类型变量和引用数据类型变量,都将在栈内存中分配空间,当超过变量作用范围后,自动回收

我的总结:初始化=定义数组+分配空间+赋值

11、二维数组:

二维数组:(其实是一个一维数组,它的每一个元素又是一个一维数组),

可以看做是一张表格。

初始化:

动态初始化

int[ ][ ] arr = new int[3][2];

定义了一个二维数组,其中有3个一维数组,每一个一维数组中有2个元素

静态初始化

第 39 页 int[ ][ ] arr = new int[][]{{1,2},{3,4},{5,6}};

int[ ][ ] arr = {{1,2},{3,4},{5,6}};

Eg:

public class Demo3 {

public static void main(String[] args) {

int age[][] = new int[][]{{1,2},{3,4},{5,6,7}};

n(age[0].length);//2

n(age[2].length);//3

12、操作数组的工具类-Arrays

static int binarySearch(type[] a, type key) 使用二分搜索法来搜索key元素在数组中的索引;若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。

static int binarySearch(type[] a, int fromIndex, int toIndex,

type key) 使用二分搜索法来搜索key元素在数组中从fromIndex到toIndex的索引;若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。

static boolean[] copyOf(type[] original, int newLength) 复制指定的数组见下面备注

static byte[] copyOfRange(type[] original, int from, int to)

将数组的指定范围复制到一个新数组。

static boolean equals(type[] a, type[] a2) 如果两个数组长度相等和元素一一相等,则返回 true

第 40 页 static void fill(type[] a, type val) 将a数组所有元素都赋为val。

static void fill(type[] a, int fromIndex, int toIndex, type val)

将a数组从formIndex 到tiondex索引之间的元素都赋为val。

static void sort(type[] a) //sort(int[] arr)对指定的数组按数字升序进行排序。

static void sort(type[] a, int fromIndex, int toIndex) 对指定数组的从formIndex 到tiondex索引之间的元素按数字升序进行排序。

static String toString(type[] a) 返回指定数组内容的字符串表示形式。多个数组元素之间用英文逗号或空格隔开。

我的总结:使用数组工具类可以节省时间,提高效率,注意常查阅api;

Eg:

package reviewDemo;

import ;

//使用Arrays类

public class Demo4 {

public static void main(String[] args) {

int[] age = new int[] { 12, 26, 3, 60, 55, 6, 48, 4, 98 };

n(ng(age));//直接打印出数组的方法

第 41 页 int []age2 = {1,2,3,4,5,6,98,65,23};

int i = Search(age2, 98);

n(i);

13、Java5新特性对数组的支持:

增强for循环 → for-each

for (参数类型 参数名 : 数组名) {

代码块

Eg:

package reviewDemo;

public class Demo6 {

public static void main(String[] args) {

int []age = {1,2,3,69,36,636,459};

for (int i : age) {

n(i);

这样就用for-each把数组遍历输出!

我的总结:for-each用于数组和Iterable对象!在以后的集合学习中还会经常用到for-each循环。

三、黑马程序员—面向对象(1)

第三篇:

1、什么叫面向对象?

面向对象(Object-Oriented,简称OO)就是一种常见的程序结构设计第 42 页 方法。

面向对象思想的基础是将相关的数据和方法放在一起,组合成一种新的复合数据类型,然后使用新创建的复合数据类型作为项目的基础。

面向对象是一个很抽象的概念,它相对面向过程而言。

过程及对象都是一种解决问题的思想。

面向过程:强调的是功能行为,一种过程,先干啥,再干啥;

面向对象:将功能封装到对象里,强调的是具备某功能的对象;

按照面向对象的思想,可以把任何的东西看做对象!

面向对象的三个特征:

封装(Encapsulation);

继承(Inheritance);

多态(Polymorphism)。

我的总结:

面向过程:强调的是具体的功能实现;(执行者)

面向对象:强调的是具备功能的对象。(管理者)

2、类

类(class)是Java 语言的最小编程单位,也是设计和实现Java 程序的基础,本部分将深入介绍类的相关知识。

类的概念

类是一组事物共有特征和功能的描述。类是对于一组事物的总体描述,是按照面向对象技术进行设计时最小的单位,也是组成项目的最第 43 页 基本的模块。类的概念是抽象的,类似于建筑设计中的图纸,是对于现实需要代表的具体内容的抽象。类只包含框架结构,而不包含具体的数据。所以类代表的是总体,而不代表某个特定的个体。

我的总结:类是抽象的,对象是具体的,实实在在的!

类的定义:

[修饰符] class 类名{

1~n个构造方法;

0~n个字段;

0~n个方法

定义类,其实就是定义类里面的对象

对象包含:

状态;(属性)

功能、行为;(方法)

通过类来描述对象;

状态--------成员变量;

功能、行为——方法;

Eg:

class Person{

//属性

private String name;

private int age;

private int sal;

第 44 页 //方法

public void show(){

n("个人情况:"+name+age+sal);

3、构造方法

构造方法:用来构造类的实例(每一个类都默认有一个无参的构造方法,得使用new调用)

字段:类或对象所包含的数据,对类状态的一种描述;

方法:类或对象的特征或行为

作用:

给类中的字段进行初始化,可以用来创建对象。

特点:

方法名及类名相同

不用定义返回值类型

不需要写return语句

我的总结:

注意:

默认构造方法的特点。

多个构造方法是以重载的形式存在的。

构造方法的重载:(需要哪个就去适配哪个,调用哪个)

this([实参]);调用当前类的构造方法

注意: this([实参]);必须放在构造器的第一行;

对象的产生格式:

第 45 页 类名称 对象名 = new 类名称();

因为有(),所以是方法,实际上它就是构造方法,并且是非私有的构造方法。

如:CellPhone cp = new CellPhone();

Eg:

class Person{

private String name;

private int age;

private int sal;

public void show(){

n("个人情况:"+name+age+sal);

public Person(String name) {

super();

= name;

public Person(String name, int age) {

super();

= name;

= age;

public Person(String name, int age, int sal) {

super();

= name;

= age;

第 46 页 = sal;

4、static关键字

特点:

随着类的加载而加载

优先于对象存在

被所有对象所共享

可以直接被类名调用

使用注意:

静态方法只能访问静态成员

但是非静态成员可以访问静态成员;

静态方法中不可以使用this,super关键字

主方法(main)是静态的(可以利用类名去调用静态的main方法,很正常!但是会陷入死循环,导致内存溢出,jvm自动停止!)

public static void main(String[] agrs){}

可修饰字段,方法。

用static 修饰的成员表示它属于这个类共有,而不是属于该类的单个实例。

static 修饰的字段 == 类字段

static 修饰的方法 == 类方法

没使用static修饰的字段和方法,成员属于类的单个实例,

不属于类。

没有static 修饰的字段 == 实例字段

第 47 页 没有static 修饰的方法 == 实例方法

类和实例访问字段和方法的语法:

访问类成员: 类.字段 类.方法

访问实例成员: 实例.字段 实例.方法

我的总结:

static 修饰的字段和方法,既可以通过类调用,也可以使用实例调用;

没static 修饰的字段和方法,只能使用实例来调用(建议使用:类名来调用; 其实在底层,对象调用类成员,也会转换类名调用)

static关键字不能及this,super同时连用!

5、匿名对象

一个没有名字的对象, 创建了一个对象出来,没有赋给一个变量;

特点:

对方法或字段只进行一次调用时;

可作为实际参数进行传递;

只在堆里面开辟存储区域,

只能使用一次, 使用完就被销毁了;

何时使用?只拿来用一次!!

new Person();表示匿名对象,没有名字的对象

new Person().age = 17;//使用一次之后就被销毁了

6、this关键字

特点:this表示当前对象。

第 48 页 当前对象 ←→ 当前正在调用实例成员的对象

换言之:谁调用了方法,谁就是当前对象。

什么时候使用this关键字呢?

方法间的相互调用;

this.字段;

构造器中相互调用,但是此时this([参数])必须写在构造方法第一行。

this不能用在static修饰的方法里和static修饰的代码块里;

Eg:构造方法中的 = name;

7、面向对象之封装

封装的两个含义:

1.把对象的状态和行为看成一个统一的整体,将二者存放在一个独立的模块中(类);

2."信息隐藏", 把不需要让外界知道的信息隐藏起来,尽可能隐藏对象功能实现细节,字段;

封装机制在程序中的体现是:把描述对象的状态用字段表示,描述对象的行为用方法表示,把字段和方法定义在一个类中,并保证外界不能任意更改其内部的字段值,也不允许任意调动其内部的功能方法。

程序中的一种体现:通常将类中的成员变量私有化(private),通过对外提供方法(setXxx,getXxx),可对该变量(xxx)进行访问。

boolean 类型的变量没有getXX,只有 isXX;

Eg:

第 49 页

2023年6月20日发(作者:)

黑马程序员入学Java知识——精华总结

J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结!

一、黑马程序员—java概述与基础知识 .................... 9

1、何为编程? ...................................... 9

2、Java语言概述,历史、特点 ........................ 9

3、什么是跨平台性?原理是什么?JVM ................ 11

4、Jre和Jdk的区别? ............................... 11

5、java虚拟机JVM ................................. 12

6、 Java程序运行机制 .............................. 12

7、 学习java注意的地方 ........................... 12

8、Java语法格式 ................................... 13

9、代码注释:单行//,多行/* */,文档注释/** */ .... 13

10、Java中的标识符 ................................ 14

11、java中的常量和变量 ............................ 14

12、Java成员变量和局部变量 ........................ 15

14、基本数据类型转换之向上转型和向下转换 .......... 18

15、Java的运算符 .................................. 19

16、表达式和三目运算符 ............................ 20

17、程序流程控制 .................................. 21

18、三大循环结构: ................................. 24

19、嵌套循环与流程控制 ............................ 26

第 1 页 二、黑马程序员—方法与数组 ........................... 28

1、什么是方法(Method)? ......................... 28

2、 Java中方法的格式: ............................ 29

3、方法里的属性 ................................... 29

4、方法特点 ....................................... 30

5、什么是方法的重载(Overload)? ................. 31

6、 可变参数 ...................................... 33

7、数组简介: ..................................... 34

8、一维数组的声明与初始化: ....................... 34

9、数组的使用: ................................... 36

10、分配内存空间 .................................. 38

11、二维数组: .................................... 39

12、操作数组的工具类-Arrays ....................... 40

13、Java5新特性对数组的支持: ..................... 42

三、黑马程序员—面向对象(1) ........................ 42

1、什么叫面向对象? ............................... 42

2、类 ............................................. 43

3、构造方法 ....................................... 45

4、static关键字 ................................... 47

5、匿名对象 ....................................... 48

6、this关键字..................................... 48

7、面向对象之封装 ................................. 49

第 2 页 8、访问修饰符 ..................................... 50

9、类的设计分析 ................................... 50

10、面向对象之继承 ................................ 51

11、子类访问父类和方法覆写 ........................ 53

12、super关键字和调用父类构造方法 ................. 54

13、面向对象之多态 ................................ 55

14、引用变量类型转换 .............................. 58

四、黑马程序员—面向对象(2) ........................ 58

1、基本数据类型的包装类 ........................... 58

2、基本数据类型和包装类相互转换 ................... 59

3、基本类型和String之间的转换 .................... 60

4、Object类 ...................................... 61

5、代码块 ......................................... 62

6、构造方法的私有化 ............................... 64

7、 Singleton模式(单例模式) 饿汉式和懒汉式 ........ 65

8、final 关键字 ................................... 67

9、抽象类 ......................................... 68

10、抽象类的体现-模板模式 ......................... 71

11、接口(interface) ............................... 73

12、接口的使用 .................................... 75

13、面向接口编程之制定标准和简单工厂模式 .......... 76

14、面向接口编程之适配器模式 ...................... 78

第 3 页 15、 接口和抽象类的比较 ........................... 79

16、匿名内部类 .................................... 80

17、枚举类 ........................................ 80

五、黑马程序员—异常处理和常用类 ..................... 84

1、异常 ........................................... 84

2、异常处理格式 ................................... 85

3、多异常处理 ..................................... 86

4、异常的分类 ..................................... 87

5、声明异常(throws) ............................. 88

6、throw .......................................... 89

8、throw和catch同时使用 .......................... 91

9、常用类 ......................................... 92

10、String方法 .................................... 95

11、StringBuffer 与 StringBuilder ................. 98

12、Math和Random和UUID ......................... 103

13、Date和Calendar .............................. 105

14、System ....................................... 110

六、黑马程序员—线程技术 ............................ 111

1、进程和线程 .................................... 112

2、创建线程方式 .................................. 113

3、两种进程创建方式比较 .......................... 115

4、线程的生命周期 ................................ 117

第 4 页 5、控制线程 ...................................... 118

6、多线程安全问题 ................................ 121

7、多线程安全问题的解决方法 ...................... 123

8、线程通信 ...................................... 128

七、黑马程序员—集合框架(1) ....................... 133

1、集合类 & 容器 ................................ 133

2、Collection接口 ................................ 134

3、Iterator接口 .................................. 135

4、集合遍历输出方式 .............................. 136

6、TreeSet ....................................... 142

7、List接口 ..................................... 148

8、List接口中常用类 .............................. 151

9、Map接口 ...................................... 156

八、黑马程序员—集合框架(2) ....................... 160

1、Collections类 ................................. 161

2、Arrays ........................................ 164

3、泛型(Generic) ................................. 165

4、泛型的使用 .................................... 165

5、声明多个泛型类型和通配符 ...................... 172

6、泛型的上限与下限 .............................. 173

7、泛型接口和方法 ................................ 176

8、泛型的嵌套(map例子) ......................... 177

第 5 页 九、黑马程序员—IO操作(1) ......................... 179

1、IO的概述和File方法 ........................... 179

2、递归(Recursion) ............................... 182

3、文件过滤器 meFilter ............. 183

4、流 ............................................ 185

5、操作流的步骤(重点) .......................... 186

6、字节流和字符流 ................................ 188

7、文件拷贝 ...................................... 191

8、字节→字符转换流 .............................. 194

9、自动关闭资源的try语句 ........................ 195

十、IO文件操作(2) ................................. 197

1、内存操作流 .................................... 197

2、打印流 ........................................ 200

3、格式化输出 .................................... 202

4、标准流 ........................................ 204

5、Scanner(简单文本扫描器) ....................... 206

6、缓冲流 ........................................ 209

7、合并流(SequenceInputStream) ................. 211

十一、黑马程序员—网络编程 .......................... 213

1、什么是网络编程? .............................. 213

2、网络通讯要素 .................................. 213

3、TCP和UDP的联系和用途 ......................... 214

第 6 页 4、InetAddress与Socket .......................... 216

5、UDP传输 ...................................... 217

6、TCP传输 ...................................... 224

8、小例子 ........................................ 233

十二、黑马程序员—反射机制 .......................... 237

1、反射的概念 .................................... 237

2、获得Class对象 ................................ 239

3、九个预定义Class对象 .......................... 240

4、利用Class获取类的属性信息 .................... 242

5、Class中得到构造方法Constructor、方法Method、字段Field ............................................ 244

6、利用反射创建对象 .............................. 252

7、使用反射调用方法 .............................. 256

8、使用反射调用可变参数方法 ...................... 259

9、使用反射操作字段 .............................. 260

10、反射和泛型-反射来获取泛型信息 ................ 263

十三、黑马程序员—反射机制 .......................... 266

1、GUI(图形用户界面) ............................. 266

2、布局管理器 .................................... 267

3、事件监听机制组成 .............................. 269

4、Dialog ........................................ 278

5、菜单 .......................................... 283

第 7 页 1、Eclipse的使用技巧 ............................. 288

2、静态导入(1.5特性,好处是不用写类名) ......... 292

3、可变参数 ...................................... 292

5、基本数据类型的自动拆箱与装箱 .................. 294

6、枚举 .......................................... 295

7、反射实现框架功能 .............................. 297

1、内省了解JavaBean ............................ 299

2、内省综合案例和Beanutils工具包 ................ 301

3、注解(Annotation) ............................ 305

4、泛型 .......................................... 310

1、类加载器 ...................................... 317

2、类加载器的委托机制 ............................ 318

3、一个类加载器的高级问题分析 .................... 324

4、 代理的概念与作用 ............................. 324

5、动态代理技术 .................................. 326

6、分析JVM动态生成的类 .......................... 327

8、 实现类似spring的可配置的AOP框架 ............ 338

黑马程序员——面试题之交通灯管理系统 ............. 345

1、面向对象的分析与设计 .......................... 345

2、Road类的编写 .................................. 347

3、Lamp类的编写 .................................. 349

4、LampController类的编写 ........................ 353

第 8 页 5、MainClass类的编写 ............................. 354

黑马程序员——面试题之银行业务系统 ............... 357

1、需求 .......................................... 357

2、需求分析 ...................................... 358

3、NumberManager类 ............................... 359

4、NumberMachine类 ............................... 360

5、CustomerType枚举类 ............................ 361

6、ServiceWindow类 ............................... 362

7、MainClass类与Constants类 ..................... 367

一、黑马程序员—java概述与基础知识

1、何为编程?

编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。

为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。

2、Java语言概述,历史、特点

是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级语言。

第 9 页 是一种面向Internet的编程语言。

随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。

是简单易学,完全面向对象,安全可靠,及平台无关的编程语言。

java5.0之后的三大技术框架

J2EE(Java 2 Platform Enterprise Edition)企业版

在jdk5.0版本后称为JAVAEE,是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如Servlet Jsp等,主要针对于Web应用程序开发。是传智播客就业班和黑马训练营的主要学习内容之一.。

J2SE(Java 2 Platform Standard Edition)标准版

在jdk5.0版本后称为JAVASE,这是在java基础阶段主要学习的内容,也是java的基础,以后不管从事Android开发或者是物联网+云计算的开发,等是建立在JSE基础上的,因此该技术是java的最核心技术,是传智播客基础班的主要上课内容.。

J2ME(Java 2 Platform Micro Edition)小型版

在jdk5.0版本以后称为JAVAME,该技术多应用于一些电子产品的嵌入式开发,以前在手机开发上应用的也比较多,但是随着智能手机的发展,现在手机应用程序(比如Android程序)的开发已经不再使用该技术。

第 10 页 3、什么是跨平台性?原理是什么?JVM

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。(注意不是能在所有的平台上运行,关键是该平台是否能安装相应的虚拟机)。

我的总结:Java程序之所以能够实现跨平台运行,是因为它根本就不直接运行在任何底层平台上,而是需要在哪里运行,就在哪里(如Windows平台)事先准备好自己的Java平台,而这只是仅仅是安装和配置一个软件而已!

4、Jre和Jdk的区别?

JRE:(Java Runtime Environment),java运行环境。包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE 即可。

JDK:(Java Development Kit Java)开发工具包。JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。

其中的开发工具:编译工具() 打包工具()等

简单而言:使用JDK开发完成的java程序,交给JRE去运行。

我的总结:必须熟练的记忆,核心类库,开发工具!

第 11 页 5、java虚拟机JVM

Java Virtual Machine ,简称JVM;

它是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一,JVM读取并处理编译过的及平台无关的字节码(class)文件。

Java编译器针对JVM产生class文件,因此是独立于平台的。

Java解释器负责将JVM的代码在特定的平台上运行。

Java虚拟机是不跨平台的.

6、Java程序运行机制

编译: javac 文件名.文件后缀名

运行: java 类名

我的总结:Java程序的组成:Java源文件,字节码文件。

7、学习java注意的地方

Java语言拼写上严格区分大小写;

一个Java源文件里可以定义多个Java类,但其中最多只能有一个类被定义成public类;

若源文件中包括了public类,源文件必须和该public类同名;

一个源文件中包含N个Java类时,编译后会生成N份字节码文件,即每个类都会生成一份单独的class文件,且字节码文件名和

其对应的类名相同;

我的总结:一个Java源文件只定义一个类,不同的类使用不同的源文件定义;

第 12 页 将每个源文件中单独定义的类都定义成public的;

保持Java源文件的主文件名及源文件中的类名一致;

8、Java语法格式

任何一种语言都有自己的语法规则,Java也一样,既然是规则,那么知道其如何使用就可以了。

代码都定义在类中,类由class来定义,区分 public class 和

class;

代码严格区分大小写,如main 和 Main 是不一样的;

Java中的标识符及关键字;

注释;

main方法的作用:

程序的入口

保证程序的独立运行

被JVM调用

9、代码注释:单行//,多行/* */,文档注释/** */

1.单行注释 //:

//后到本行结束的所有字符会被编译器忽略;

2.多行注释 /* */:

/* */之间的所有字符会被编译器忽略

3.文档注释 /** */:

在/** */之间的所有字符会被编译器忽略,java特有的(用于生成文档);

第 13 页 我的总结:多行和文档注释都不能嵌套使用。

10、Java中的标识符

可简单理解为在Java程序中为了增强阅读性自定义的名称。比如:类名,方法名,变量名等。

命名规则:

(1) 由字母、数字、下划线、$组成,不能以数字开头

注意:此处的字母还可以是中文,日文等;

(2) 大小写敏感

(3) 不得使用java中的关键字和保留字

(4) 别用Java API里面的类名作为自己的类名。

11、java中的常量和变量

变量的概念:

占据着内存中的某一个存储区域;

该区域有自己的名称(变量名)和类型(数据类型);

该区域的数据可以在同一类型范围内不断变化;

为什么要定义变量:

用来不断的存放同一类型的常量,并可以重复使用;

使用变量注意:

变量的作用范围, 初始化值

定义变量的格式:

数据类型 变量名 = 初始化值;

注:格式是固定的,记住格式,以不变应万变。

第 14 页 作用范围:定义开始到定义它的代码块结束;

同一范围内,不允许多个个局部变量命名冲突

12、Java成员变量和局部变量

局部变量:不是声明在类体括号里面的变量;

局部变量使用前必须初始化值;

局部变量没有默认初始化值;

局部变量的作用域是从定义开始到定义它的代码块结束;

成员变量:在方法体外,类体内声明的变量,又称字段(Field)或全局变量;(其实Java中没有全局变量,由于Java是面向对象语言,所有变量都是类成员)

成员变量的作用域是整个类中;

我的总结:注意成员变量和局部变量的区别

package reviewDemo;

public class Demo2 {

public static void main(String[] args) {

int i;

n(i);

}

}

备注:局部变量调用前没有初始化,所以编译的时候就会报错!

第 15 页 package reviewDemo;

public class Demo2 {

static int i;

public static void main(String[] args) {

n(i);

}

}

备注:此时i为全局变量,未初始化会被赋予默认的初始化值!程序正确!

我的总结:

局部变量是定义在方法中的变量,,,出了该方法就不能访问该变量了....

成员变量是在类中定义,,,,并且在类的成员方法中都能访问的变量..

13、基本数据类型

在数据类型中,最常用也是最基础的数据类型,被称作基本数据类型。可以使用这些类型的值来代表一些简单的状态。

第 16 页 Java 语言的基本数据类型总共有以下8 种,下面是按照用途划分出的4 个类别:

定点类型:

整数型是一类代表整数值的类型。当需要代表一个整数的值时,可以根据需要从4 种类型中挑选合适的,如果没有特殊要求的话,一般选择int 类型。4 种整数型区别主要在每个数据在内存中占用的空间大小和代表的数值的范围。

浮点类型:

小数型是一类代表小数值的类型。当需要代表一个小数的值时,可以根据需要从以下2 种类型中挑选合适的。如果没有特殊要求,一般选择double类型。

由于小数的存储方式和整数不同,所以小数都有一定的精度,所以在计算机中运算时不够精确。根据精度和存储区间的不同,设计了两种小数类型。

字符型:

字符型代表特定的某个字符,按照前面介绍的知识,计算机中都是以字符集的形式来保存字符的,所以字符型的值实际只是字符集中的编号,而不是实际代表的字符,由计算机完成从编号转换成对应字符的工作。Java 语言中为了更加方便国际化,使用Unicode 字符集作为默认的字符集,该字符集包含各种语言中常见的字符。在程序代码中,字符使用一对单引号加上需要表达的字符来标识,例

如’A’、’a’等,当然也可以直接使用字符编码,也就是一个非负整第 17 页 数进行表示。

布尔型:

布尔型代表逻辑中的成立和不成立。Java 语言中使用关键字true 代表成立,false 代表不成立。布尔型是存储逻辑值的类型,其实很多程序中都有逻辑值的概念,Java 把逻辑的值用布尔型来进行表达。

14、基本数据类型转换之向上转型和向下转换

向上转换:

整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:

容量小的类型可自动转换为容量大的数据类型;

byte,short,char → int → long → float → double

byte,short,char之间不会相互转换,他们在计算时首先会转换为int类型。

boolean 类型是不可以转换为其他基本数据类型。

Eg:

int i = 123;

long l = i; //自动转换,不需强转

float f = 3.14F;

double d = f;

向下转换:

整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:

第 18 页 容量小的类型可自动转换为容量大的数据类型;

byte,short,char → int → long → float → double

byte,short,char之间不会相互转换,他们在计算时首先会转换为int类型。

boolean 类型是不可以转换为其他基本数据类型。

Eg:

long l = 123L;

int i = (int) l;//必须强转

double d = 3.14;

float f = (float) d;

我的总结:类型转化

小转大,自动!自动类型转换(也叫隐式类型转换)

大转小,强转!强制类型转换(也叫显式类型转换)

15、Java的运算符

运算符是一种特殊符号,用以表示数据的运算、赋值和比较等共分以下几种:

算术运算符(+ 、— 、* 、/ 、%)

赋值运算符(= 、+=、-=、*=、/=,、%=)

关系运算符(>、>=、<、<=、!=)

条件运算符(&&、||、!&、|、^)

位运算符(&、|、^、~、>>、<<、<<<、>>>)

我的总结:

第 19 页 逻辑运算符用于连接布尔型表达式,在Java中不可以写成33 & x<6 。

“&”和“&&”的区别:单及时,左边无论真假,右边都进行运算;双及时,如果左边为真,右边参及运算,如果左边为假,那么右边不参及运算。

“|”和“||”的区别同理,双或时,左边为真,右边不参及运算。

“ ^ ”及“|”不同之处是:当左右都为true时,"^"结果为false。

16、表达式和三目运算符

是由数字、运算符、数字分组符号(括号)等以能求得数值的有意义排列的序列;

a + b

3.14 + a

(x + y) * z + 100

boolean b= i < 10 && (i%10 != 0)

表达式的类型和值:

对表达式中操作数进行运算得到的结果是表达式的值。

表达式值的数据类型即为表达式的类型。

表达式的运算顺序

应按照运算符的优先级从高到低的顺序进行;

优先级相同的运算符按照事先约定的结合方向进行;

“三目运算符”,语法格式:

x ? y : z;

第 20 页 其中x为boolean类型表达式,先计算x的值,若为true,则整个三目运算符的结果是表达式y的值,否则就是z的值。

package reviewDemo;

public class Demo2 {

public static void main(String[] args) {

String s = "lz";

s = (s == "lz" ? "正确" : "错误");

n(s);

输出:正确

17、程序流程控制

顺序结构

分支结构(条件结构)

循环结构

控制循环结构

顺序结构:

如果代码里没有流程控制,程序是至上而下一行一行执行的,一条语句执行完之后继续执行下一条语句,直到程序的最后。

if语句:

基本语法:if(表达式){方法体}else if(表达式){方法体}else(方法体)

几种形式:

三种格式:

第 21 页 if(条件表达式){执行语句;}

if(条件表达式){执行语句;}else{执行语句;}

if(条件表达式){执行语句;}else if (条件表达式){执行语句;}……else{执行语句;}

public class If3

public static void main(String args[])

int i = 3;

if (i > 5)

n("变量i大于5");

else if (i > 4)

n("变量i小于4");

else

n("其他");

switch控制语句

格式:

switch(表达式)

case 表达式可能的结果值1:

执行语句;

break;

case 表达式可能的结果值2:

执行语句;

break;

第 22 页 default:

执行语句;

break;//最后这个一般不写

备注:

case之间及default没有顺序。先执行第一个case,都没有匹配的case值执行default。

结束switch语句的两种情况:遇到break,switch语句执行结束。

如果匹配的case或者default没有对应的break,那么程序会从第一次匹配的case语句开始继续向下执行,运行可以执行的语句,直到遇到break或者switch结束为止。

class switch2

public static void main(String[] args)

int a = 7,b = 5;

switch(a-b)

case 3://表达式可能的值;

n("33!");

break;

case 4:

n("44!");

break;

default://都没有执行则 执行该语句!

n("其它的");

第 23 页 18、三大循环结构:

用于处理需要重复执行的操作;

根据判断条件的成立及否,决定程序段落的执行次数,而这个程序段落我们称为循环体;

while:事先不需要知道循环执行多少次;

do while:同上,只是至少要执行一次(先做,后判断);

for:需要知道循环次数;

循环结构(while & do while)

while语句

格式:

while(条件表达式值为true)

执行语句;

do while语句

格式:

do

执行语句;

while(条件表达式值为true);

我的总结:do while特点是无论条件是否满足,循环体至少被执行一次。

循环里的条件表达式不能直接写false或直接写结果是false的表达式,不过可以使用变量来传递false值;

循环结构(for)

第 24 页 格式:

for(初始化表达式(1);循环条件表达式(2);循环后的操作表达式(3))

执行语句;(4)

执行顺序:(1) → (2) → (4) → (3) → (2) → (4) → (3)

备注:

1, for里面的3个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。

2, while及for可以互换,区别在于for为了循环而定义的变量在for循环结束就在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。

3, 最简单无限循环格式:while(true) , for(;;),无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。

Eg:

用三种循环控制求出100以内前5个3的倍数的数字;

class while

public static void main(String[] args)

int i = 1,k = 0;

while(i<=100)

if(i%3==0)

if(k<5)

第 25 页 n(i);

k++;

i++;

class dowhile

public static void main(String[] args)

int i = 1,k = 0;

do{

if(i%3==0)

if(k<5)

n(i);

k++;

i++;

while(i<=100);

class for

public static void main(String[] args)

int i = 1,k = 0;

for(;i<100;i++)

if(i%3==0&&k<5)

n(i);

k++;

19、嵌套循环及流程控制

嵌套循环:循环里套循环

第 26 页 假设外循环的循环次数是m次,内循环的循环次数是n次,那么内层循环的循环次数需要 m * n次。

Eg:利用for循环语句的嵌套打印出乘法口诀表

class break1

public static void main(String[] args)

for(int i=1;i<=10;i++)//定义i及j的值必须在for循环里面,否则每次跳出循环重新执行就无法取值

for(int j=1;j<=10;j++)

if(j<=i)

(j+"*"+i+"="+i*j+" ");//小注意:print()括号里面

必须传递参数,println()无限制!

n();

流程控制

break语句、 continue语句;

break:终止该层循环;

continue:跳过该层循环

注:

①:若这两个语句离开应用范围,存在是没有意义的。

②:这个两个语句后面都不能有语句,因为执行不到。

③:continue语句是跳过本次循环,继续下次循环。

④:标签的出现,可以让这两个语句作用于指定的循环。

第 27 页 Eg:

package reviewDemo;

public class Demo2 {

public static void main(String[] args) {

int i = 1;

for (; i < 10; i++) {

n(i);

if(i == 8){

break;//流程控制,不会完全执行!

二、黑马程序员—方法与数组

第二篇:

1、什么是方法(Method)?

方法是一组为了实现特定功能的代码块的集合。方法在语法上的功能主要有以下两个:

①:结构化代码

将代码按照功能进行组织,使代码的结构比较清晰,容易阅读和修改,也就是程序的可维护性强。

②:减少代码重复

一个固定的功能,可能会在程序中多次使用,在使用时只需要调用写好的方法,而不用重复书写对应的功能代码。

方法在书写时需要注意以下两点:

第 28 页 ①:逻辑严谨

方法实现的一个完整的功能,所以在书写时要考虑到各种可能的情况,并对每种情况做出恰当的处理。

②:通用性强(可重复利用)

方法实现的是一种功能,在实际实现时,可以根据需要,使方法具备一定的通用性,除非必要,否则不要写专用的方法。在Java 语言中,恰当的使用方法,将使程序更加优雅,便于阅读和使用。

我的总结:

方法:一段可重复使用的代码段;

程序中完成独立功能的一段代码的集合。

2、Java中方法的格式:

[修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……])

执行语句; [return 返回值;]//需要的话

参数列表(参数的类型 ,参数的个数,参数的顺序)

我的总结:只要上述有一个不一样,那么这个参数列表就不一样!对于方法而言,即使同名也不是同一个方法,也就是下面讲的方法签名。

3、方法里的属性

访问控制符:访问控制符限定方法的可见范围,或者说是方法被调用的范围。方法的访问控制符有四种,按可见范围从大到小依次是:public、protected,无访问控制符,private。其中无访问控制符不书写关键字即可。具体的范围在后续有详细介绍。

第 29 页 形式参数:在方法被调用时用于接收外界输入的数据。

实参:调用方法时实际传给方法的数据。

返回值:方法在执行完毕后返还给调用它的环境的数据。

返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回类型 void。

方法签名:方法名和方法的参数列表(能区别方法);//最关键的

java语言中调用方法:对象名.方法名(实参列表)。

实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配。

return 语句终止方法的运行并指定要返回的数据。

4、方法特点

它可以实现独立的功能;

必须定义在类里面;

它只有被调用才会执行;

它可以被重复使用;

方法结束后方法里的对象失去引用;

如何定义一个功能,并通过方法体现出来:

明确该功能运算后的结果.明确返回值类型;

明确在实现该功能过程中是否有未知内容参及运算,确定参数列表;

Eg:

package reviewDemo;

第 30 页 * player 的值分别是1,2,3或者其他值时,该方法返回“大明”,“二明”,“小明”,“我没有这个孩子”。

public class Demo2 {

public static void main(String[] args) {

int player = 5;

n("返回的结果是:"+show(player));

public static String show(int p){

switch (p) {

case 1:

return "大明";

case 2:

return "二明";

case 3:

return "小明";

default:

return "我没有这个孩子!";

5、什么是方法的重载(Overload)?

概念:

在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型或参数顺序不同即可。

存在的原因:

屏蔽了一个对象的同一类方法由于参数不同所造成的差异。

第 31 页 特点:

及返回值类型无关,只看参数列表。

以下是方法重载的示例:

public void a(int a){}

public int a(){}

public void a(int a,String s){}

Eg:

class Chongzai

public static void main(String[] args)

int ret = name(3,4,5);

n(ret);

public static int name(int a, int b)

int c = a+b;

return c;

public static int name(int a, int b, int m)//这就叫做方法的重载,只要参数列表不一样。好处:用户使用时限制很小;

int c = a+b+m;

return c;

我的总结:方法重载,方法名相同,但是参数列表不一致!(和方法覆写不一样,方法覆写的方法名和参数列表都必须一样),注意方法重载和方法覆写的不同!

第 32 页 6、可变参数

从java5开始出现了可变参数,这是对java方法及数组的拓展!

方法中可以接受的参数不再是固定个数的,而是随着具体需求传递的多少来决定。

定义格式: 返回值类型 方法名(参数类型 ... 形式参数){ }

可变参数的特点:

只能出现在参数列表的最后;

... 位于变量类型和变量名之间,前后有无空格都可以;

调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

Eg:

package reviewDemo;

import ;

public class Demo6 {

public static void main(String[] args) {

int []age = {1,2,3,69,36,636,459};

show(age);

public static void a){//此时这里写的就是可变参数,和数组的作用一样!

//把数组给打印出来!

n(ng(a));

第 33 页 7、数组简介:

数组(Array)是Java 语言中内置的一种基本数据存储结构,通俗的理解,就是一组数的集合,目的是用来一次存储多个数据。数组是程序中实现很多算法的基础,可以在一定程度上简化代码的书写。

备注:

1.

数组的好处:数组里的每个元素都有编号,编号从0开始,并且依次递增,方便操作这些元素;

2.

3.

4.

使用Java数组:必须先声明数组,再给该数组分配内存;

数组对应在内存中一段连续空间。

数组元素必须是相同数据类型,也可以是引用数据类型,但是同一个数组中的元素必须是同一类数据类型。

8、一维数组的声明及初始化:

一维数组:可以理解为一列多行、类型相同的数据,其中每个数据被称为数组元素;

一维数组的声明方式:

type varName[]; 或 type[] varName;(推荐)

Eg:int age[]; int []age;

数组的长度一旦确定,就不能改变,也就数组是定长的;

我的总结:java语言声明数组的时候不能指定其长度(元素的个数)

Eg:int a[5]; //非法

初始化:

Java中的数组必先初始化才可以使用,所谓初始化就是为数组的数第 34 页 组元素分配内存,并为每个数组元素赋值;

数组初始化的两种方式:

静态初始化:初始化时由我们自己指定每个数组元素的初始值,由系统决定需要的数组长度;

格式:数组名 = new 数组类型[]{元素1,元素2,元素3...元素n};

简化语法:数组名 = {元素1,元素2,元素3...元素n};

动态初始化:初始化时由我们指定数组的长度,由系统为数组元素分配初始值;

格式:数组名 = new 数组类型[数组长度];

我的总结:

不能静态和动态初始化同时使用:

也就是说不能同时指定数组的长度和元素;

Eg:

package reviewDemo;

* 声明数组及初始化

public class Demo3 {

public static void main(String[] args) {

int []age = new int[10];

//动态初始化

for (int i = 0; i < ; i++) {

age[i] = i;

(age[i]+" ");

第 35 页 输出:0 1 2 3 4 5 6 7 8

9

9、数组的使用:

Java语言的数组索引是从0开始的,也就是说数组里的第一个元素的索引是0,第二个元素的索引是1,依次可以类推。

常见操作:

给数组元素赋值

数组名[索引] = 数组类型的值 ;

访问数组元素

数组类型 变量 = 数组名[索引];

得到数组的长度

int len = 数组名.length; //length是数组的属性

遍历数组(备注:length 属性和循环语句)

数组元素的索引范围(0,长度—1)

Eg:判断数组是否重复

package reviewDemo;

* 判断数组是否重复

public class Demo3 {

public static void main(String[] args) {

int []age = {1,2,3,4,5,6,5};

for (int i = 0; i < -1; i++) {//双层循环,定住一个,再考虑下一个!

第 36 页 for (int j = i+1; j < ; j++) {

if(age[i] == age[j]){

n("有重复的!"+i+" "+j);

break;

求最大值:

package reviewDemo;

public class Demo4 {

public static void main(String[] args) {

int age[] = new int[] { 12, 26, 3, 60, 55, 6, 48, 4, 98 };

int max = age[0];

for (int i = 0; i < ; i++) {

if (max < age[i]) {

max = age[i];

n(max);

经典用法:冒泡法排序

package reviewDemo;

import ;

//冒泡排序

public class Demo6 {

public static void main(String[] args) {

int []age = {1,2,36,363,56,95,12,32,1232,3263};

for (int i = 0; i < ; i++) {

第 37 页 for (int j = i+1; j <= -1; j++) {

if(age[i] > age[j]){

int temp = age[i];

age[i] = age[j];

age[j] = temp;

n(ng(age));

//输出为:[1, 2, 12, 32, 36, 56, 95, 363, 1232, 3263]

10、分配内存空间

分配内存空间

数组名=new 数据类型[数组长度];

new关键字用来实现为数组或对象分配内存

数组具有固定的长度。获取数组的长度: 数组名.length

定义数组+分配内存空间

数据类型[]数组名=new 数据类型[数组长度];

定义数组时不指定长度,分配空间时指定数组长度;如:String

cities[] = new String[6];

数组元素:

数组名[下标值];

数组下标从0开始 scores[0]=75;

数组的内存分配 栈内存和堆内存

如定义一个数组 int[]scores将在栈内存中为scores 分配内存空间,其值是一个不确定的值。

第 38 页 当执行语句scores=new int[5]时,将在堆内存分配连续5个空间,每个空间4个字节,用于存放整型数据,其初始值为0,然后将该段空间首地址,也就是第一个元素的地址,比如0*3000,赋给scores变量。该地址相当于一个指针,指向堆内存中分配的空间。此时堆内存中分配的5个空间可以分别使用scores[0],一直到scores[4]来表示。当执行四个赋值语句时,分别用指定值填充到对应元素位置。如果此时将null值赋给scores时,scores变量将不再指向任何位置,此时堆内存中分配的空间就变成了垃圾,由垃圾回收器在某一时间进行回收。

在方法中定义的变量,包括基本数据类型变量和引用数据类型变量,都将在栈内存中分配空间,当超过变量作用范围后,自动回收

我的总结:初始化=定义数组+分配空间+赋值

11、二维数组:

二维数组:(其实是一个一维数组,它的每一个元素又是一个一维数组),

可以看做是一张表格。

初始化:

动态初始化

int[ ][ ] arr = new int[3][2];

定义了一个二维数组,其中有3个一维数组,每一个一维数组中有2个元素

静态初始化

第 39 页 int[ ][ ] arr = new int[][]{{1,2},{3,4},{5,6}};

int[ ][ ] arr = {{1,2},{3,4},{5,6}};

Eg:

public class Demo3 {

public static void main(String[] args) {

int age[][] = new int[][]{{1,2},{3,4},{5,6,7}};

n(age[0].length);//2

n(age[2].length);//3

12、操作数组的工具类-Arrays

static int binarySearch(type[] a, type key) 使用二分搜索法来搜索key元素在数组中的索引;若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。

static int binarySearch(type[] a, int fromIndex, int toIndex,

type key) 使用二分搜索法来搜索key元素在数组中从fromIndex到toIndex的索引;若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。

static boolean[] copyOf(type[] original, int newLength) 复制指定的数组见下面备注

static byte[] copyOfRange(type[] original, int from, int to)

将数组的指定范围复制到一个新数组。

static boolean equals(type[] a, type[] a2) 如果两个数组长度相等和元素一一相等,则返回 true

第 40 页 static void fill(type[] a, type val) 将a数组所有元素都赋为val。

static void fill(type[] a, int fromIndex, int toIndex, type val)

将a数组从formIndex 到tiondex索引之间的元素都赋为val。

static void sort(type[] a) //sort(int[] arr)对指定的数组按数字升序进行排序。

static void sort(type[] a, int fromIndex, int toIndex) 对指定数组的从formIndex 到tiondex索引之间的元素按数字升序进行排序。

static String toString(type[] a) 返回指定数组内容的字符串表示形式。多个数组元素之间用英文逗号或空格隔开。

我的总结:使用数组工具类可以节省时间,提高效率,注意常查阅api;

Eg:

package reviewDemo;

import ;

//使用Arrays类

public class Demo4 {

public static void main(String[] args) {

int[] age = new int[] { 12, 26, 3, 60, 55, 6, 48, 4, 98 };

n(ng(age));//直接打印出数组的方法

第 41 页 int []age2 = {1,2,3,4,5,6,98,65,23};

int i = Search(age2, 98);

n(i);

13、Java5新特性对数组的支持:

增强for循环 → for-each

for (参数类型 参数名 : 数组名) {

代码块

Eg:

package reviewDemo;

public class Demo6 {

public static void main(String[] args) {

int []age = {1,2,3,69,36,636,459};

for (int i : age) {

n(i);

这样就用for-each把数组遍历输出!

我的总结:for-each用于数组和Iterable对象!在以后的集合学习中还会经常用到for-each循环。

三、黑马程序员—面向对象(1)

第三篇:

1、什么叫面向对象?

面向对象(Object-Oriented,简称OO)就是一种常见的程序结构设计第 42 页 方法。

面向对象思想的基础是将相关的数据和方法放在一起,组合成一种新的复合数据类型,然后使用新创建的复合数据类型作为项目的基础。

面向对象是一个很抽象的概念,它相对面向过程而言。

过程及对象都是一种解决问题的思想。

面向过程:强调的是功能行为,一种过程,先干啥,再干啥;

面向对象:将功能封装到对象里,强调的是具备某功能的对象;

按照面向对象的思想,可以把任何的东西看做对象!

面向对象的三个特征:

封装(Encapsulation);

继承(Inheritance);

多态(Polymorphism)。

我的总结:

面向过程:强调的是具体的功能实现;(执行者)

面向对象:强调的是具备功能的对象。(管理者)

2、类

类(class)是Java 语言的最小编程单位,也是设计和实现Java 程序的基础,本部分将深入介绍类的相关知识。

类的概念

类是一组事物共有特征和功能的描述。类是对于一组事物的总体描述,是按照面向对象技术进行设计时最小的单位,也是组成项目的最第 43 页 基本的模块。类的概念是抽象的,类似于建筑设计中的图纸,是对于现实需要代表的具体内容的抽象。类只包含框架结构,而不包含具体的数据。所以类代表的是总体,而不代表某个特定的个体。

我的总结:类是抽象的,对象是具体的,实实在在的!

类的定义:

[修饰符] class 类名{

1~n个构造方法;

0~n个字段;

0~n个方法

定义类,其实就是定义类里面的对象

对象包含:

状态;(属性)

功能、行为;(方法)

通过类来描述对象;

状态--------成员变量;

功能、行为——方法;

Eg:

class Person{

//属性

private String name;

private int age;

private int sal;

第 44 页 //方法

public void show(){

n("个人情况:"+name+age+sal);

3、构造方法

构造方法:用来构造类的实例(每一个类都默认有一个无参的构造方法,得使用new调用)

字段:类或对象所包含的数据,对类状态的一种描述;

方法:类或对象的特征或行为

作用:

给类中的字段进行初始化,可以用来创建对象。

特点:

方法名及类名相同

不用定义返回值类型

不需要写return语句

我的总结:

注意:

默认构造方法的特点。

多个构造方法是以重载的形式存在的。

构造方法的重载:(需要哪个就去适配哪个,调用哪个)

this([实参]);调用当前类的构造方法

注意: this([实参]);必须放在构造器的第一行;

对象的产生格式:

第 45 页 类名称 对象名 = new 类名称();

因为有(),所以是方法,实际上它就是构造方法,并且是非私有的构造方法。

如:CellPhone cp = new CellPhone();

Eg:

class Person{

private String name;

private int age;

private int sal;

public void show(){

n("个人情况:"+name+age+sal);

public Person(String name) {

super();

= name;

public Person(String name, int age) {

super();

= name;

= age;

public Person(String name, int age, int sal) {

super();

= name;

= age;

第 46 页 = sal;

4、static关键字

特点:

随着类的加载而加载

优先于对象存在

被所有对象所共享

可以直接被类名调用

使用注意:

静态方法只能访问静态成员

但是非静态成员可以访问静态成员;

静态方法中不可以使用this,super关键字

主方法(main)是静态的(可以利用类名去调用静态的main方法,很正常!但是会陷入死循环,导致内存溢出,jvm自动停止!)

public static void main(String[] agrs){}

可修饰字段,方法。

用static 修饰的成员表示它属于这个类共有,而不是属于该类的单个实例。

static 修饰的字段 == 类字段

static 修饰的方法 == 类方法

没使用static修饰的字段和方法,成员属于类的单个实例,

不属于类。

没有static 修饰的字段 == 实例字段

第 47 页 没有static 修饰的方法 == 实例方法

类和实例访问字段和方法的语法:

访问类成员: 类.字段 类.方法

访问实例成员: 实例.字段 实例.方法

我的总结:

static 修饰的字段和方法,既可以通过类调用,也可以使用实例调用;

没static 修饰的字段和方法,只能使用实例来调用(建议使用:类名来调用; 其实在底层,对象调用类成员,也会转换类名调用)

static关键字不能及this,super同时连用!

5、匿名对象

一个没有名字的对象, 创建了一个对象出来,没有赋给一个变量;

特点:

对方法或字段只进行一次调用时;

可作为实际参数进行传递;

只在堆里面开辟存储区域,

只能使用一次, 使用完就被销毁了;

何时使用?只拿来用一次!!

new Person();表示匿名对象,没有名字的对象

new Person().age = 17;//使用一次之后就被销毁了

6、this关键字

特点:this表示当前对象。

第 48 页 当前对象 ←→ 当前正在调用实例成员的对象

换言之:谁调用了方法,谁就是当前对象。

什么时候使用this关键字呢?

方法间的相互调用;

this.字段;

构造器中相互调用,但是此时this([参数])必须写在构造方法第一行。

this不能用在static修饰的方法里和static修饰的代码块里;

Eg:构造方法中的 = name;

7、面向对象之封装

封装的两个含义:

1.把对象的状态和行为看成一个统一的整体,将二者存放在一个独立的模块中(类);

2."信息隐藏", 把不需要让外界知道的信息隐藏起来,尽可能隐藏对象功能实现细节,字段;

封装机制在程序中的体现是:把描述对象的状态用字段表示,描述对象的行为用方法表示,把字段和方法定义在一个类中,并保证外界不能任意更改其内部的字段值,也不允许任意调动其内部的功能方法。

程序中的一种体现:通常将类中的成员变量私有化(private),通过对外提供方法(setXxx,getXxx),可对该变量(xxx)进行访问。

boolean 类型的变量没有getXX,只有 isXX;

Eg:

第 49 页