Java小总结
JDK > JRE > JVM
JDK:Java开发工具包,是整个Java开发的核心,集成了jre和一些其他工具,是编写程序的程序员使用的
JRE:Java运行时的环境,包含了JVM和Java的一些基本类库,是运行程序的用户使用的
JVM:只认识以class为后缀的类型的文件,能够将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作,即Java能跨平台的核心
环境变量
DOS环境运行黑窗口
数据类型
- 整型
type——一字节 -2^7~~ 2^7-1
short——二字节 -2^15~~ 2^15-1
int——四字节 -2^31~~ 2^31-1
long——八字节 -2^63~~ 2^63-1
- 浮点型
double————双精度
float————单精度
- 字符型
char
- 布尔
boolaen
- 引用数据
输入输出
public static void main(String[] args)
{
Sannner in = new Scanner(System.in);
int a=in.nextInt();
System.out.println(a+"\n");
double b= in.nextDouble();
System.out.println(b+"\n");
String c=in.next();
System.out.println(c+"\n");
String d = in.nextLine();
System.out.println(d+"\n");
long e = in.nextLong();
System.out.println(e+"\n");
short f = in.nextShort();
System.out.println(f+"\n");
type g = in.nextType();
System.out.println(g+"\n");
boolean h = in.hasNext();
System.out.println(h+"\n");
float i = in.nextFloat();
System.out.println(i+"\n");
}
命名
标识符命名原则:
- 由数字、字母、下划线组成
- 首字母不能是数字
驼峰命名法:每个单词首字母大写
运算符
加号———“+”
减号——“-”
乘号———“*”
除号——“/”
百分号(取余)——“%”
变量作用域
变量在其作用域内被创建,离开其作用域时被撤消
全局变量:作用域为整个程序 成员变量: 局部变量:
成员变量与局部变量区别
成员变量:直接定义在类中;只在定义它的类中有效;存在于堆内存中,随对象的产生而存在,消失而消失
局部变量:定义在方法上,参数上,语句中;存在于栈内存上随着所属区域的运行而存在,结束则释放
类、包结构和创建方法
类
/*修饰符 class 类名()
{
变量
构建器
方法
}
*/
class Employee
{
//变量
private String name;
private double salary;
//构建器
public Employee(String n,double s)
{
name = n;
salary = s;
}
//方法
public string getName()
{
return name;
}
public double getSalary()
{
return salary;
}
}
包
包内每一个类都需要:package 包名;
流程控制
顺序结构
/*判断a是否比b大;是输出a否则b*/
if(a>b)
{
System.out.println(a);
}
else
{
System.out.println(b);
}
/*三目运算符*/
a>b?a:b
选择结构
/*分数(score)等级判断1——优秀,2——良好。3——及格,4——不及格*/
switch(score)
{
case 1 : System.out.println("优秀"); break;
case 2 : System.out.println("良好"); break;
case 3 : System.out.println("及格"); break;
case 4 : System.out.println("不及格"); break;
default: break;
}
循环结构
/*计算 n 个数相加和 N*/
int N=0;
int i=1;
/*for循环*/
for(i=1 ; i <= n ; i++)
{
N+=i;
}
/*while循环*/
while(i<=n)
{
N+=i;
i++;
}
/*do while循环*/
do
{
N+=i
}while(i++<n);
/*for each循环——用于数组-可遍历数组每个元素,不需要下标
例如:*/
int number[] = {1、2、3 ~ ~ n-1、n };
for(int num : number)
{
N+=num;
}
修饰符
final (不可变):类字段,方法,字段
修饰类:不可被继承,不能被扩展
修饰变量:值不可改变,同时要初始化
修饰方法:不可被重写
static(静态) :内部类,字段,方法
修饰内部类:说明该内部类属于外部类而非外部类的某个实例 修饰方法:说明该类方法属于类而非类实例
abstract (抽象):类和方法
抽象类:不能被实例化,必须机型扩展
抽象方法:必须被子类重写
权限访问修饰符:(都可以修饰类,方法,字段)
public : 包 内外,类内,子类
private : 类内
default : 包内 类内
protected :包内 类内 子类内
面向对象的设计思想
对象里面定义的那些变量称之为属性,属性实际的值标识着对象本身的状态,行为是指对象的方法。一般情况下行为会影响属性,属性不同会产生不同的行为。
Java三大特性
继承
封装
多态
代码调试(不太懂)
1.debug。断点调试。
2.输出消息。system.out.println();来调试。
3.动态代理(Dynamic Proxy)。动态代理是一个特定的Java特性,它允许开发者引入proxy类,加进某一给定类之前,并通过某一给定接口截获所有调用。你可以在很短时间内用一个普通代理设置一个虚拟事件处理器,来查看事件发生顺序。当需要理解事件处理器时这是最简单和快捷的方法。
4.运行时剖析器(Run-time Profiler)。剖析器是通过特定的JVM hooks在系统中跟踪所有调用的强大工具。但是用它来跟踪执行过程是大才小用。
5.Aspects。面向方面编程。它是截获你的代码执行既快速又容易的方法。你可以围绕方法、构造器、属性访问等等有选择地设置hook,而不需要修改原始代码。在这些hook中,你可以打印调试消息。
集合与泛型的使用(还没涉及)
集合(容器)类
主要负责保存、盛装和管理对象
集合类主要有 四大体系:
Set(集):代表无序、不可重复集合
List(列表):代表有序、可重复集合
Map(映射):代表具有映射关系的集合
Quque(双端队列
):代表队列,实现元素的先进先出管理
数组:是一种集合类,可随机存储和访问引用序列的诸多方法中最高效的一种
集合框架:
是一种用来表示和操作集合的统一架构,包含实现集合的接口和类
目标:
高性能:保证算法的实现效率
互操作性
高扩展性:只需实现特定的接口
基于统一的方式组织和管理对象:
1. 接口:接口定义了集合操作的行为规范,形成集合的高层视图
2. 实现类:是集合接口的具体表现,本质是可重复使用的数据结构
3. 算法:实现集合操作中常用的算法,算法通过多态实现,即相同的方法在相似的接口上有着不同的实现
集合接口:
集合框架定义了一组接口,接口申明了对待定类型的集合可以执行的操作
Java集合类集合框架的跟接口:
Collection Map
哈希表数据定位方法尤为突出
集合类型 | 哈希表 | 可调整大小的数组 | 平衡树 | 链表 | 哈希表+链表 |
---|---|---|---|---|---|
interface | Hash Table | Resizable Array | Balanced Tree | Linked List | Hash Table+Linked List |
set | 哈希集(HashSet) | 树集(TreeSet) | 链式散列集(LinkedHashSet) | ||
List | 数组列表(ArrayList) | 链表(LinkedList) | |||
Deque | 数组双端队列(ArrayDeque) | 链表(LinkedList) | |||
Map | 散列映射(Hash Map) | 矩形树图(TreeMap) | 链表哈希映射(LinkedHashMap) |
所有实现Collocation接口的类都必须提供两个标准的构造函数:
无参数构造函数———用于创建一个空的Collection
使用Collection类型作为参数的构造函数——用于创建一个新的Collection,目的是复制
泛型
泛型允许在定义类、接口、和方法时使类型成为参数,声明的类型参数在使用时用具体的类型替换
泛型应用于具体的集合框架中
泛型的优势:
1.提高程序的类型安全
2.有助于避免(强制)转型,使得编译器能够在编译时发现转型错误而不用等到运行时
3.实现通用算法
泛型类:
定义和声明:
类名之后通过<>指定一个或者多个类型参数的名字, 同时还可以对类型参数取值范围进行限定,多个类型参数之间使用逗号分隔
public class Matrix <T>
{
······
}
使用:
定义完类型参数后,可在该类几乎任意地方(静态块、静态属性,静态方法除外)使用类型参数
注:父类定义的类型参数不能被子类继承
/*实例化泛型类*/
Matrix<Float> ft = new Matrix<Float>();
方法:
当泛型方法是静态时,不能使用类的类型参数当 T 上的类型约束对于方法局部时,这意味着没有在类的另一个方法签名中使用相同类型的T的约束。
泛型方法的类型参数是局部的,可以简化封闭类型的签名
声明泛型方法:
public <T> T ifThenElse(boolean b,T first ,T second)
{
return b ? first : second;
}
泛型类是在实例化类时指明泛型的具体类型泛型方法是在调用方法时指明泛型的具体类型编译器会允许调用下面的代码推理出 T 的类型,并用实际参数代替 T
String s=ifThenElse(b,"a","b");
Integer i=ifThenElse(b,new Integer(1),new Integer(2));
类型限制:
类型通配符(?),Matrix<?>表示任意的泛型类型
/*表示add()可以接受任意泛型类型的参数*/
public void add(Matrix<?> m);
此情况下,add()范围太宽泛了
限定参数的具体类型
例如:只希望接受Number及其子类的类型的变量,而不接受Random、Locale等类型的变量,需要对通配符进行限制
如Martrix类,使用类型参数 T;让Number类作为类型上界来限制这个类型参数:
/*表示Matrix中包含的参数类型是Number及其子类*/
public class Matrix<T extends Number>{···}
同里用Number类作为类型下界
/*表示Matrix中包含的参数类型是Number及其子类*/
public class Matrix<? super Number> {···}
类型擦除:
定义:在使用泛型时加上的类型参数,会被编译器在编译时去掉
泛型是在编译器层次上实现的,在生成的字节代码中是不包含泛型类型的信息的
编译器在编译时尽可能的发现可能出错的地方,但仍然无法避免在运行时出现类型转换异常情况
擦除过程:
1.找到运来替换类型参数的具体类,若指定类型参数上界的话,则使用上界
2.把代码中的类型参数都替换成具体类型,同时去掉出现的类型声明,即< >的内容
编译器禁止某些泛型的使用方式,是为了确保类型的安全性
静态变量是被泛型类的所有实例共享的,即泛型不能用于静态变量
泛型的类型参数不能用在异常处理的catch语句中,因为异常处理是由JVM在运行时刻进行的。由于类型擦除,JVM已经无法区分源于同一泛型类型的两个不同类型的异常。
开发泛型类:
/*泛型类*/
public class Lhist<V>{···}
/*创建泛型类实例*/
Lhist<Integer> li = new Lhist<Integer>(30);
泛型实践:
1.在代码中避免泛型类和原始类型混合,如List<String>和List不应共同使用
2.在使用通配符(?)的泛型时,需要明确通配符所代表的一组类型的概念
3.不能实例化泛型类型变量,然后利用反射的newInstance来创建实例,不能创建一个范型的数组
4.不忽视编译器的警告
swing与awt组件
awt是抽象组件窗口工具包,是Java最早的用于编写图形应用程序的开发包;AWT组件称为重量级组件。
Swing是为了补充awt的一些功能性的缺失问题而开发的包,以awt为基础的,称之为轻量级组件
awt是基于本地方法的C/C++程序,运行速度比较快,消耗资源少;Swing是基于awt的Java程序,所以运行速度慢。对于嵌入式应用,往往采用AWT;通常在标准的Java应用中,使用Swing牺牲运行速度换取开发效率和功能
相对路径与绝对路径
绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径。
相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在 Servlet中,"/"代表Web应用的根目录。和物理路径的相对表示,例如:"./" 代表当前目录, "../"代表上级目录。这种类似的表示,也是属于相对路径。
监听类
事件监听
内部类 外部类 匿名内部类 自身接口类
键盘监听
接口implements KeyListener
if(e.getKeyCode == keyEvent.VK_?)
异常处理机制
(1)偶然性。程序运行中,异常并不总是会发生。
(2)可预见性。异常的存在和出现是可以预见的。
(3)严重性。一旦异常发生,程序可能终止,或者运行的结果不可预知
IO流
回收机制
意义:垃圾回收可以有效地防止内存的泄露,有效的使用空闲的内存
内存泄漏(游离对象):该内存空间使用完毕之后未回收,在不涉及复杂数据结构情况下,Java的内存泄漏表现为一种内存对象的生命周期超出了程序需要使用它的时间轴长度
程序入口及加载顺序
父类的静态变量、父类的静态代码块、子类的静态变量、子类的静态代码块、 父类的非静态变量、父类的非静态代码块、父类的构造函数、 子类的非静态变量、子类的非静态代码块、子类的构造函数
本人原创#.#