Java数据类型
Java是一种强类型语言。每个变量都必须要有一种数据类型。Java一共有八种基本的数据类型。其中有4种整型,2中浮点型,一种用于表示Unicode编码的字符单元的字符类型char类型,和一种用于表示真值的boolean类型。(注意:String不是基本数据类型)
1. 整型整型用于表示没有小数部分的数值,它允许是负数。类型如下:
类型
字节大小
取值范围
byte
1字节
-128 ~ 127
short
2字节
-32 768 ~ 32 767(3万左右)
int
4字节
-2 147 483 648 ~ 2 147 483 647(20亿左右)
long
8字节
-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807
此外,可以用不同的前后缀来表示不同的进制:
0x 前缀表示十六进制数值
0 前缀表示八进制数值
0b 前缀表示二进制数值
在书写较大的数字时,可以用_来分割,例如 0b000_111_010_100 表示468,Java编译器回去除这些下划线。
注意:在c和c++中,int ...
Java接口
接口实际上是一种规范。实现接口,是对 Java 单继承的一种补充。接口也具有多态性。
注意事项:
接口不能被实例化
接口中的所有方法都是 public 类型,接口中的抽象方法可以不用 abstract 修饰
一个普通类实现接口就必须将接口中的所有方法实现
抽象类去实现接口时,可以不实现接口的抽象方法
一个类可以实现多个接口
接口中的属性,只能是 final,而且是 public static final 修饰符
接口中属性的访问形式:接口名.属性名
接口不能继承其他的类,但是可以继承多个别的接口
接口的修饰符只能是 public 和默认,和类的修饰符一样
例子如下:
123456789101112131415//camera.javapackage com.pushihao.接口;public class camera implements machine { @Override public void work() { System.out.println("the camera is working"); ...
Java常用类
1. 枚举类enumeration(enum)
枚举是一组常量的集合。也就是说枚举属于一种特殊的类,里面只包含一组有限的特定的对象。
1.1 自定义枚举类实现方法:
将构造器私有化,防止直接new出来
去掉set方法,防止属性被修改
直接在内部创建固定的对象
对外暴露对象(通过为对象添加 public static 修饰符)
优化:加入一个final修饰符
123456789101112131415161718192021222324252627282930313233343536//Season.javapublic class Season { private String name; private String desc; private Season(String name, String desc) { this.name = name; this.desc = desc; } public static final Season SPRING = new Season(" ...
Java命令行工具的使用
主要的工具
javac 编译
java 运行(控制台及图形界面程序)
javaw 运行图形界面程序
appletViewer 运行applet程序
另外常用的几个工具
jar 打包工具
javadoc 生成文档
Javap 常看类信息及反汇编
一、使用package时的编译
文件及路径一致
程序中使用package语句
使用import语句
编译及运行
假设文件路径为:
则 javac -d classes src\edu\pku\tds\ui\*.java src\edu\pku\tds\util\*.java src\edu\pku\tds\*.java
java -cp classes edu.pku.tds.PackageTest
二、使用jar打包
编译 javac A.java
打包 jar cvfm A.jar A.man A.class
c表示创建(create),v表示显示详情(verbose),f表示指定文件名,m表示清单文件
其中A.man是清单文件(manifest),内容如下(清单文件可以任意命名,常见的是用MANIFE ...
Java对象和类
类的五大成员:属性、方法、构造器、代码块、内部类
1. 定义1.1 完整的类定义123类声明 成员变量声明(可有多个) 方法定义及事项(可有多个)
123456[public][abstract | final] class className [extends superclassName] [implements InterfaceNameList]{ [public | protected | private][static][final][transient][volatile] type variableName [public | protected | private][static][final | abstract][native][synchronized] returnType methodName ([paramList]) [throws exceptionList]{ statement; }}
1.2. 完整的Java源文件
源文件的名称必须与属性为 public ...
Java反射
反射机制允许程序在执行期借助于 Reflection API 取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性以及方法。反射在设计模式和框架底层都会用到。
加载完类之后,在堆中就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象包含了类的完整结构信息。可以通过这个对象得到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射。
在反射中,可以把方法视为对象
Java 程序在计算机执行有三个阶段
1. 反射相关的主要类
java.lang.Class 代表一个类,Class 对象表示某个类加载后在堆中的对象
java.lang.reflect.Method 代表类的方法,Method 对象表示某个类的方法
java.lang.reflect.Field 代表类的成员变量,Field 对象表示每个类的成员变量
java.lang.reflect.Constructor 代表类的构造方法,Constructor 对象表示构造器
这些类在 java.lang.reflecti ...
Java动态代理
动态代理有两种实现方式:
JDK 动态代理(重要)
CGLIB 动态代理
1. CGLIB(了解)使用继承机制,通过在子类中重写同名方法完成对父类的代理
其要求被代理的类不能为 final,方法也不能为 final
要求较宽松,只要类能被继承就能使用此方法,效率相对较高
2. JDK 动态代理2.1 重要的类和方法Proxy 类:用于创建代理对象的类,其中有很多静态方法
静态方法:newProxyInstance
123public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
参数:
ClassLoader loader 要代理的目标对象的类加载器,负责向内存中加载对象,可以通过反射获取
Class<?>[] interfaces 目标对 ...
Java使用Stream流快速编程
一、概述
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 StreamAPI 对集合数据进行操作,就类似于使用 SQL 执行的数据路查询
官方文档对它的介绍如下:
1A sequence of elements supporting sequential and parallel aggregate operations.
大概意思为:
1支持顺序和并行聚合操作的元素序列。
可以看出 Stream
是一个元素序列
支持对元素的串行和并行操作
所有对流的操作并不会改变原集合的值
那么串行操作和并行操作有什么区别呢?
我的理解是:
串行操作类似于单线程,处理数据时是一条一条处理的,所以处理的数据自然也是有序的
并行操作类似于多线程,多条数据一起处理,虽然处理时效率较高,那么处理时数据自然也是无序的
总体来说,使用 Stream 的基本步骤为:
生成 Stream 操作(创建操作)
中间操作(转换操作)
终结操作(聚合操作)
这里我以 Student 类来举例具体操作(gett ...
Map接口
Map 接口实现类的特点(JDK8):
Map 与 Collection 并列存在,用于保存具有映射关系的数据:Key-Value
Map 中的 Key 和 Value 可以是任何引用类型的数据,会封装到 HashMap$Node 对象中,常用 String 类作为Key
Map 中的 Key 不允许重复,原因和 HashSet 一样
Map 中的 Value 可以重复
Map 的 Key 可以为 null,value 也可以为 null
Key 和 Value 之间存在单向一一对应关系,即通过 Key 总能找到对应的 value
Map 存放数据的 key-value 示意图,一对 k-v 是放在一个 Node 中的,又因为 Node 实现了 Entry 接口,有些书也说一对 k-v 就是一个 Entry
Map 接口常用方法
put
remove
get
size
isEmpty
clear
containsKey
Lambda表达式的简单使用
lambda 表达式三要素:形式参数,箭头,代码块
1、Lambda 表达式的标准格式格式:
( 形式参数 ) -> { 代码块 }
1234new Thread(() -> { System.out.println("多线程启动了!");}).start();
形式参数:如果有多个参数,参数之间用逗号隔开。如果没有参数,留空即可
->:固定写法
代码块:具体要做的内容
2、Lambda 表达式注意事项
有一个接口,并且接口中有且仅有一个抽象方法
必须要有上下文环境,才能推导出 Lambda 对应的接口(也就是说Lambda表达式不能单独使用)
3、Lambda 表达式实例3.1 既没有参数也没有返回值的情况12345678910111213public class lambda01 { public static void main(String[] args) { myPrint(() -> { System.out.println( ...