java 学习日志 (IDEA)7.12
java 学习日志 (IDEA)7.12
下载所需环境变量 jdk安装包
oracle官网jdk下载
https://www.oracle.com/java/technologies/downloads/archive/
Java SE 8 (8u211 and later)
配置系统环境变量 PATH里必须 添加jdk根目录下的bin和jre\bin 否则无法使用
CLASSPATH 环境变量 是java的类库
配置完成后 使用cmd运行 java -version javac 查看是否安装成功
Linux环境下
下载jdk安装包gz
配置环境变量文件 /etc/profile
最后一行添加
JAVA_HOME=/usr/java/jdk1.8.0_331
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME
JDK :java Development kit
JRE :java runtime environment`
JVM:java virual machine
JDK:java开发者工具
JRE:java运行环境
JVM:java虚拟机
jdk包含jre jre运行jvm
jvm:内存管理 可跨平台 安全
JMM:java内存模型。jmm是一种抽象的概念,并不真实存在,它描述的是一种规范,通过这种规范定义了程序中的各个变量的访问形式。
编译型:
编译整个文件,使计算机可执行,程序
解释型:
实时编译,写一句编译一句,网页
java、javac 编译 运行
javaoc 生成文档
jar:打包应用
java在计算机把java文件转化为java字节码class文件,jre提供Java类
java虚拟机采用基于栈的架构,操作码和操作数组成,这些字节码指令叫opcode
运行class文件时相当于启动了一个jvm进程,jvm会翻译这些字节码转化为机器码,他有两种执行方式,一种是解释执行,将opcode+操作数编译成机器代码;另一种是jit,即时编译,在一定条件下将字节码编译成机器码后在执行
java文件->java编译器->class文件->类装载器->字节码校验器->解码器->系统平台
规范
文件名和类名保持一致
方法名和变量名使用驼峰命名法
类名首字母大写
常量大写加下划线
避免使用中文或拼音命名
包机制
域名倒写
防止命名冲突
package
import
JSE 、JEE 、JME区别
JSE:java standard edition 标准版
JEE:java enterprise edition 企业版
JME:java mirco edition 移动版
spring 是 JEE轻量级替代品
spring boot是spring+自动化配置
IDEA
破解链接:jetbrains全家桶系列产品免费激活教程和方法 | ide激活网 (idejihuo.com)
IDE:集成开发环境,提供程序开发环境
忽略大小写提示IDEA默认严格区分大小写提示
File->settings->editor->General->code completion
case sensitive completion
Maven
Maven:项目管理工具
Maven – Download Apache Maven [1]
配置conf文件下setting.xml文件
1.设置repo本地仓库地址
D:\Maven\repository
2.设置镜像仓库
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>ibiblio</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>
</mirror>
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
maven setting.xml 中文配置详解(全配置)_mildness丶的博客-CSDN博客_maven setting.xml配置
3.设置IDEA maven配置
file->setting->build,execution,depleyment->Bulid Tools->Maven
Maven home path 设置为maven的解压目录
项目添加module-> bild system选择Maven
JAVA语法
/**
* 文档注释
* @author 作者名
* @version 版本号
* @since 知名需要的最早使用的jdk版本
* @param 参数名
* @retrun 返回参数情况
* @throws 异常抛出情况
*/
main程序入口
public static void main(String[] args) {}变量
byte 字节 、short 短整数 、int 整数、long 长整数、float 单浮点、double 浮点数、boolean 布尔值、char 字符、String 字符串
运算符
%余 ||或 &与 !非 |并 ^异或 短路运算&& ||
<< 位移
输入输出
字节流(基础类):Outputstream、Inputstream
字符流(基础类):Reader、Write
处理流:Bufferinputstream、Bufferoutputstream、bufferRead、bufferwrite、
DatainputStream、Dataoutputstream
转换流(字节流转换字符流):Inputstreamreader、Outputstreamwrite
过滤: Filter
文件:File
打印流:PrintStream、PrintWriter
输入流:把数据从其他设备读到内存中
输出流:把数据从内存中读到其他设备
字节流:以字节为单位,适合读取音频,视频、二进制等文件
字符流:以字符为单位 ,适合读取文本文件
序列化<-->反序列化 serializable 前提需要继承接口
transient (透明的)某个关键字不需要序列化则使用
System.out.println(); [2]
判断
if(boolean){}else{}
switch(value
){case value
: ;case value
: ;}
循环
for(int i
;boolean;i
++){} [3]
while(boolean){}
do{}while(boolean);
int list[]={0,1,2,3,4,5,6,7};
for(int x:list) {
System.out.println(x);
}
Java练习
// int a = 0;
// int b = 0;
// Scanner sc = new Scanner(System.in);
// a = sc.nextInt();
// b = sc.nextInt();
// System.out.println(a + b);
// System.out.printf("a+b=%d\n", a + b);
// int year = sc.nextInt();
// if (year % 100 == 0) {
// if (year % 400 == 0) {
// System.out.printf("%d是闰年\n", year);
// } else {
// System.out.printf("%d\n不是闰年", year);
//
// }
// }else{
// if(year%4==0){
// System.out.printf("%d是闰年\n", year);}
// else {System.out.printf("%d\n不是闰年",year);}}
// int list[]={0,1,2,3,4,5,6,7};
// for(int x:list) {
// System.out.println(x);
// }
// }
// Integer []a={5,3,6,4,2,1};
// Arrays.sort(a,((x,y)->y-x)); //自定义函数传入两个变量比较方式,x-y返回负数x<y否则x>y 需要int对象
// System.out.println(Arrays.deepToString(a));
//判断二维数组某一行的平均值或者求和
// Scanner sc=new Scanner(System.in);
// int l=sc.nextInt();
// String op= sc.next();
// double [][] w=new double[12][12];
// for(int i=0; i<12;i++) {
// for (int j = 0; j < 12; j++) {
// w[i][j] = sc.nextDouble();
// }
// }
// double sum=-0;
// for(int i=0;i<12;i++)
// sum+=w[l][i];
// if("M".equals(op)) //==判断地址相同,equals判断字符相同
// System.out.printf("%.1f",sum/=12);
// System.out.printf("%.1f",sum);
// String str= String.format("age is %d",18);
// double pi= Double.parseDouble("3.1415926"); //字符串转换
// for (int i = 0; i < str.length(); i++) {
// System.out.print(str.charAt(i));//只能读取不能写入 相当于str[i]
// }
// System.out.println();
// System.out.println(pi);
//String 不能被修改如果修改会创建新的字符串而不是引用
//StringBUilder 线程不安全(无锁),速度快
//StringBuffer 线程安全,速度慢
//StringBUilder 和StringBuffer 会在自己的基础上添加和修改
//可以使用 setCharAt 修改字符串 append添加字符
//容器:继承父类Collection List 接口 ArrayList 容器类 Stack 容器 LinkedList 容器类
//Set 接口 HashSet 容器类 TreeSet 容器类
// Map 接口 HashMap 容器类 TreeMap 容器类
//Iterator迭代器接口 Collections 工具类
(缺少JAR包依赖可在此下载)Download JAR files with all dependencies (jar-download.com)
稀疏数组:二维数组中只记录有效数值,记录到一个小数组中从而减少存储空间
面向对象
1.以类的方式组织代码,以对象的方式封装数据
封装 继承 多态
class classname{
int number=0;//类变量
classname(){
//构造函数
}
}
在new对象时会在栈区创建一个引用的变量类名指向堆区创建的空间地址
1.类与对象:类是一个模板,抽象,对象是一个具体的实例
2.方法:定义、调用
3.对应引用:8个基本类型
4.属性:字段、成员变量,默认初始化
修饰符 属性类型 属性名=属性值
5.对象创建使用:必须使用new 、
6.类:静态的属性、动态的方法
封装
高内聚,低耦合
隐藏内部数据,只利用接口修改内部数据不允许其他方式修改内部内容。提高程序的安全性,保护数据,隐藏实现细节,统一接口,系统可维护性
属性私有,get/set
继承
extands 子类继承父类
继承是对某一批类的抽象,从而实现对现实世界更好的建模
java只有单继承,没有多继承
object类
super 指向父类
this 指向当前类
方法重写
继承是is-a 继承关系。关系具有传递性,不具有对称性,声明时确定关系
组合是has-a 包含和整体关系,用以描述一个类由多个部件类构成,uses-a,依赖关系,一个类部分使用另一个类,运行时确定关系
继承与组合都是面向对象中代码复用的方式。父类的内部细节对子类可见,其代码属于白盒式的复用,而组合中,对象之间的内部细节不可见,其代码属于黑盒式复用。继承在编码过程中就要指定具体的父类,其关系在编译期就确定,而组合的关系一般在运行时确定。继承强调的是is-a的关系,而组合强调的是has-a的关系。
只能在当前类和子类中访问的成员设置为protected 保护修饰符
抽象类
抽象类关键字 abstract
1.不能new抽象类,只能靠子类去实现它
2.抽象类可以写普通方法
3.抽象类方法必须在抽象类中
5.类继承抽象类 关键字extends
6.抽象类由构造方法
7.抽象单继承
因为各个子类需要实现方法会有不同,所以需要一个抽象类作为模板
抽象类可以提高开发效率,扩展性高
接口类
接口关键字 interface
1.接口中的所有定义都是public的抽象方法
2.类实现接口需要关键字implements
3.接口类中不能写普通方法
- 接口的属性都是常量
- 接口没有构造方法
6.接口多继承(继承其他接口类)
实现了接口的类就需要重写所有接口方法
内部类
类里面写类
实例化内部类需要先实现外部类
一个java文件能有多个class类,但只能由一个public类
成员内部类 内部类可以访问外部类的私有属性
静态内部类 内部类是一个静态类
局部内部类 在方法中写内部类
匿名内部类 内部类不存入变量中
多态
多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。
1.要有继承
2.要有重写 (重载是名字相同参数列表不同)
3.父类引用指向子类对象
异常机制
检查性异常:编译时发生的异常
运行时异常:运行时发生的异常
Error 异常:jvm虚拟机异常、AWT异常(GUI)
Exception:运行时异常:下标越界、空指针、算术异常、丢失资源、找不到类异常,IO异常
抛出异常
throw new Exception(); 主动抛出异常 为了发现和处理异常
throws Exception //方法上使用
捕获异常
try{
//监测代码
}catch(Exception e){
//出异常执行
e.printStackTrace //打印错误栈信息
}finally{
//无论是否报错都运行,比如关闭资源
}
自定义异常类
需要继承异常类
方法中使用 throw 抛出异常
使用方法时去捕获异常
多进程、线程
进程和线程,一个进程可以有多个子线程
Thread :start0 本地方法java无权限 由c处理
Runnable :函数式接口 lambda ()->{方法体}
Callable :可以有返回值
静态代理 :new Thread([^Runnable] ()->{}).start();
Lambda表达式 :函数式编程,避免内部类过多
线程状态:新建、就绪、运行、阻塞、死亡
方法:
run 线程入口点
sleep 指定时间内让当前执行线程暂停,也不释放锁
wait 会释放锁并等待notify方法唤醒
join 等待线程对象终止
yield 会让线程回到就绪状态等待执行
isAlive 查看线程是否完成
start 通过调用run()方法启动一个线程
setpriority 设置线程的优先级
interrupt 中断线程
-
a: 是否是多线程环境
-
b: 是否存在共享数据
-
c: 是否存在多条语句同时操作共享数据
线程同步(锁)多个对象操作同一个资源,并发问题,会导致线程不安全所以需要加锁(队列+锁)
synchronized 同步方法(占用资源)、同步代码块
当线程对资源操作时会拿到锁、其他线程等待锁释放
死锁:互斥(一个资源不能被两个线程使用)请求与保持(线程不能因为资源阻塞而不释放锁)不剥夺推荐(线程获得了资源在没有使用结束不能被其他线程占用)循环等待条件(没有队列)
Lock (JUC)ReentrontLock lock trylock unlock (优先级高)
线程通信: 缓存区:消息队列 标志位
wait();等待 notifyAll();唤醒
线程池(POOL) 池化技术、设置池大小、连接时间、保持时间、超时时间、阻塞队列、线程工厂、拒绝策略
网络编程
-
ip
-
端口
-
socket编程
-
Tcp三次握手、四次挥手、面向连接
-
UDP 无连接、Packet 发送
-
URL
GUI
-
AWT
- Frame
- 监听事件 鼠标 键盘 窗口文本框 动作事件
-
swing
- 文本框
- 标签
- 按钮
- 文本框
- 面板
- 布局方式
- 关闭窗口
- 列表
注解与反射
注解
- 元注解
- 内置注解
- 自定义注解
- 反射读取注解
反射
-
Class
-
Class.forName()
-
newinstance()
-
-
类加载机制
-
Method
- invoke()
- 存在重载,获取需要写参数类型
-
Field
- set()
-
Consstruct
- newinstance()
- 获取需要传递class类型
-
破坏私有关键字 setAccessible(true)
-
性能分析
- 正常>检测关闭的反射>默认的反射
-
反射获得的注解,泛型
开发规范
阿里技术精华干货整理-阿里云开发者社区 (aliyun.com)
23种设计模式
单例设计模式
public class Only {
private static volatile Only on; //volatile 保证可见性 有序性 不保证原子性
private Only(){}
public static Only getclass(){
if(on==null){
on=new Only();
}
return on;
}
}
快捷键
ctrl+/ 快速注释
shift+F10 编译运行
alt+ins 快速插入各种函数
ctrl+alt+T 快捷使用功能代码块包裹代码