JavaSE
IDEA设置
https://www.bilibili.com/video/BV1Kb411W75N?p=412&spm_id_from=pageDriver
JDK、JRE、JVM
JDK : Java开发者工具,包含JRE
JRE : Java运行时环境,包含JVM
JVM : Java虚拟机,跨平台技术。
安装开发环境
https://www.bilibili.com/video/BV12J41137hu?p=17&spm_id_from=pageDriver
Java程序运行机制
- 编译型 :一次性翻译,相当于翻译一本书
- 解释型 :翻译人员,不可重复使用
IDEA安装
https://www.bilibili.com/video/BV12J41137hu?p=20 ,并选择相应的JDK,SDK 1.8 ,就对应下面的SDK 8
标识符
只能以字母,$ 或者 _ 开头,且标识符只能由 字母、数字 ,$ 或者 _ 三者组成,或由中文组成。
数据类型 :基本类型 、引用类型
- 基本数据类型(不包含String)
byte | short | int | long | float | double | char | boolean | |
---|---|---|---|---|---|---|---|---|
占字节数 | 1字节 | 2字节 | 4字节 | 8字节 | 4字节 | 8字节 | 2字节 | 1位(1bit) |
范围 | -128~127 | -32768~32767 | 正负21亿 | ... | true、false | |||
规则 | 1byte = 8bit = 1字节 | 1000L | 20.5F | 'a'✔、'ab'❌ | 不能对 boolean进行转换 | |||
默认值 | 0 | 0 | 0 | 0 | 0.0 | 0.0 | ‘’ | false |
- 引用数据类型
"除了八大基本类型,其他都是引用类型"
变量
局部变量 | 实例**(成员)**变量 | 全局变量( static ) | |
---|---|---|---|
位置 | 方法内部 | 类内部,方法外部 | 方法外部 |
规则 | 必须声明、赋初值 | 不需要初始化,有默认值 | static修饰 |
默认值 | ❌ | 除了八大基本类型,其余默认值为null | 除了八大基本类型,其余默认值为null |
位运算(二进制,了解)
/* 假设 A B 为 二进制数
A = 0011 1100;
B = 0000 1101;
-------------------------------------------
A&B = 0000 1100; // 都为1 ,则为0
A|B = 0011 1101; // 一个为1,则为1
A^B = 0011 0001; // 异或 :相同得0,不同得1
~A = 1100 0011; // 取反
a<<b 左移 a*(b^2)
a>>b 右移 a/(b^2)
*/
2<<3 ==> 16
16>>2 ==> 4
文档注释
public class Mytest {
static byte a;
/**
* @author 作者名
* @version 版本号
* @spine 指明需要最早使用的jdk版本
* @param
* @return 返回值情况
* @throws Exception
*/
public static void main(String[] args) {
Mytest mytest = new Mytest();
System.out.println(16>>2);
}
/**
* @author 作者名
* @version 版本号
* @spine 指明需要最早使用的jdk版本
* @param name
* @return
* @throws Exception
*/
public String method(String name){
return "hello";
}
}
IDEA 的 JavaDoc 生成功能在菜单
Tools->Generate JavaDoc 项里面。
选择Output directory 导出位置。
Other command line arguments设置为 :-encoding UTF-8 -charset UTF-8
用户交互Scanner
Scanner scanner = new Scanner(Sysrem.in);
//判断是否还有输入
while(scanner.hasNext()){
/* 不常用: 获取有效字符前,遇到的空格自动去除,
获取有效字符后,遇到空格或回车结束*/
String str01 = scanner.next();
// 常用: 获取输入的这行字符串,回车结束
String str02 = scanner.nextLine();
}
scanner.close(); "一定要关闭"
switch case
switch (expression){
case value:
//语句
break;
case value:
//语句
break;
default:
//语句
}
expression可以是 :byte、short、int、char 从JavaSE 7 开始:支持 String
value必须为 字符串常量 或 字面量(如1,2,3,4,a,b,c,d,'a','A' ... )
Java 内存分析
栈 | 存放基本变量类型以及值,引用对象的变量(会存放这个引用在堆里的具体地址) |
---|---|
堆 | 存放new的对象和数组以及唯一class,可以被所有线程共享,不会存放别的对象引用 |
方法区(属于堆) | 可以被所有线程共享,都包含了所有的class和static变量 |
多维数组
int[行][宽][高]
面向对象三大特性 :封装、继承、多态
- super VS this
super 注意事项:
1.super 调用父类的构造方法,必须在构造方法的第一个。
2.super 必须只能出现在"子类" 的方法 or 构造方法。
3.super 与 this 不能同时调用构造方法。
4.super 只能在继承条件下才能使用
5.this() :本类构造方法
6.super(): 父类构造方法
- 重写要求
static 方法属于类,不能被重写
final 是常量,加在方法上,不能被重写,加在类上面,断子绝孙了,不能extends了
private 也不能被重写
方法名,参数列表必须相同
修饰符只能扩大不能缩小 public > protected > default > private
抛出的异常范围只能缩小
- 多态 (继承):基于 重写(非静态方法)
子父类相同 static 方法,调用规则:只和左边对象类型有关。
子类重写了父类方法,调用子类方法,如果子类没重写,调用父类方法。
父类不能调用子类独有的方法,要强转为子类类型才行。
注意多态是方法的多态,属性不存在多态
//父类B
public class B{
public static void test(){sout("B==>test()");}
public void sleep(){sout("B睡觉了");}
}
//B的子类A
public class A extends B{
public static void test(){sout("A==>test()");}
public void sleep(){sout("A睡觉了");}
}
psvm(String[] args){
A a = new A();
a.test(); //===> A==>test()
a.sleep(); //===> A睡觉了
B b = new A();
b.test(); //===> B==>test()
b.sleep(); //===> A睡觉了
}
结论:方法的调用只和左边对象类型有关,左边是A就调用A的test(),是B就调用B的test()。
子类重写了父类方法,调用子类方法,如果子类没重写,调用父类方法
- A instanceof B :完全有关系才成立
Person子类 :Student 和 Teacher ,Student 和 Teacher 没有关系
Object o = new Student();
o instanceof Student ==> true
o instanceof Person ==> true
o instanceof Object ==> true
o instanceof Teacher ==> false
o instanceof String ==> false
//=================================
Person p = new Student();
p instanceof Student ==> true
p instanceof Person ==> true
p instanceof Object ==> true
p instanceof Teacher ==> false
p instanceof String ==> 编译报错 :Person p = new Student() 与 String 毫无关联
//=================================
Student s = new Student();
s instanceof Student ==> true
s instanceof Person ==> true
s instanceof Object ==> true
s instanceof Teacher ==> 编译报错 :Student p = new Student() 与 Teacher 毫无关联
s instanceof String ==> 编译报错 :Student p = new Student() 与 String 毫无关联
结论 :A instanceof B 如果返回true,那么A要和B都有关系,像 p是由Person 、Student构成
而Teacher只和Person是继承关系,和Student不是继承关系,所以返回 false
static 关键字
在同一类中 ,非静态方法可以直接调用静态方法,因为静态方法和类同生。
在同一类中 ,静态方法只能调用static修饰的资源,不能直接调用非静态资源,
因为静态资源和类同生,静态资源生成时,非静态资源还没生成。
异常
运行时异常不用处理
编译时异常一定要处理
throw 和 throws的区别
throw(方法体中):手动生成异常对象,向外"抛"出一个异常
throws(函数上):处理异常对象,"捕获处理"别人抛的异常,控制台爆红
>#### 注意点
```java
局部变量(方法里面)必须声明和"赋初值"
实例变量(类里面,方法外面)不需要初始化,有默认值
全局变量(类里面,方法外面 static修饰)不需要初始化,有默认值
String 不是 关键字,不是基本数据类型 , 是引用类型,是类(对象)
String str1 = new String("hello");
String str2 = new String("hello");
str1 == str2 false 因为new了对象,使用地址不一样
String str1 = "hello";
String str1 = "hello";
str1 == str2 true 公用字符串
int i1 = 10; 十进制 : 10
int i2 = 010; 八进制 : 8
int i3 = 0x10; 十六进制 : 16
浮点数是有限的,离散的,大约值 ==>
最好不要使用浮点数去比较(例如在银行中),一般用BigDecimal数学工具类比较。
int money = 10_0000_0000;
int years = 20;
int total01 = money*years; //会溢出
long total02 = money*years; //会溢出,因为在赋值给long 类型total前,已经溢出
//================================解决方法,运算前先把一个数转换为long
long total03 = money*((long)years);
int a=10; int b=20;
sout(""+a+b); ==> "1020"
sout(a+b+""); ==> "30"
java属于值传递
abstract 类 一定有抽象方法,也可以有普通方法,有抽象方法的类是抽象类。有构造器
interface 接口 都是抽象方法,不能实现方法。接口里的方法只需写:
"返回值 方法名(参数);" 没有构造器
一个java文件只能有一个public class,但是可以有多个class类