
Java不采用ASCII字符集,而采用Unicode字符集。
| abstract | assert | boolean | break | byte | case |
|---|---|---|---|---|---|
| catch | char | class | const | continue | default |
| do | double | else | extends | final | finally |
| float | for | goto | if | implements | import |
| instanceof | int | interface | long | native | new |
| null | package | private | protected | public | return |
| short | static | strictfp | super | switch | synchronized |
| this | throw | throws | transient | try | void |
| volatile | while |
变量是空间,变量名是空间的名称,数据是空间中储存的东西,我们通过变量名来操作变量。
java是强类型语言,即强制类型定义的语言,每一个变量都要定义其数据类型,一旦定义必须通过强制类型转换才能改变其数据类型,弱类型语言的数据类型可以通过不同的环境而改变,不用通过强制转换。
主函数:psvm
输出:sout
看类的源码:ctrl+左键
自动生成构造器、get、set方法、equals等:alt+insert
查看错误:alt+enter

| 类型 | 声明位置 | 从属于 | 生命周期(作用域) |
|---|---|---|---|
| 局部变量 | 方法或语句块内部 | 方法/语句块 | 从声明位置开始,直到方法或语句块执行完毕,局部变量消失 |
| 成员变量(实例变量) | 类内部,方法外部 | 对象 | 对象创建,成员变量也跟着创建。成员消失,成员变量也跟着消失 |
| 静态变量(类变量) | 类内部,static修饰 | 类 | 类被加载,静态变量就有效,类被卸载,静态变量就消失 |
| 数据类型 | 初始值 |
|---|---|
| int | 0 |
| double | 0.0 |
| char | ‘\u0000’ |
| boolean | false |
在java语言中,用关键字final定义常量,常量一旦被初始化后就不能再改。
声明格式:
final type varName=value;
常量命名通常用大写字母,单词之间用下划线隔开
1、2、3、’a‘、’b‘这些叫做字符常量,用final修饰的常量叫做符号常量。
整数型数据字节数:1、2、4、8
浮点型:4、8
字符型:4
布尔型:1或4
引用数据类型(4个字节):

浮点常量默认类型是double,要转为float数据后面需要加f
3.14E2:科学计数法,等于314

java中string不是一个类型,而是一个类




“+”运算苻两侧的操作数中只要有一个是字符串(String)类型,系统就会自动将另一个操作数转换为字符串然后再进行连接,其他的都是加号的意思。

自动类型转换

强制类型转换
type(var)
导入包:
import java.util.Scanner
Math.random()该方法用于产生0到1区间的double类型的随机数,但是不包括1。
用来完成某种特定功能的代码片段,类似于函数。
用于定义该类或该类的实例的行为特征和功能实现。
面向对象中,最基本的单位是类。
方法中的变量只能用于自己,外部不能使用。
重载指完全不同的,参数列表不一样的只是名称相同的方法。
很常见的算法,比如DFS,自己调用自己
包括两个部分,定义递归头和递归体。
递归头解决什么时候不调用自身方法,递归体解决什么时候需要调用自身方法。
面向过程重点关注如何执行,面向对象更倾向于设计。
对象是类的实例。
一个java文件可以同时定义多个class
类有三种成员:属性field、方法methon和构造器constructor
属性用于定义该类或该类对象包含的数据或者说静态特征,方法用于定义该类或者该类实例的行为特征和功能实现。
类的信息放在方法区,包括方法代码和常量池,方法区中的常量池中存放类中的常量,还有static属性和方法。
当开始执行main方法时,栈中就会有一个main方法的栈帧,其中存放main方法中的变量,只要执行方法就会开辟一个方法的栈帧。
构造的对象放在栈区里,与方法区不同的是,栈区内的对象更加具体,方法区是代码。
构造器用于对象的初始化,而不是创建对象

4个要点:
与普通方法的重载一样,改变参数,不过没有方法类型,不返回任何值。
栈
堆
方法区(特性也是堆)
java中,方法的所有参数都是“值传递”,如果是基本数据类型参数的传值,副本不会影响原件,如果是引用类型参数的传值,引用类型指的是“对象的地址”,副本和原参数都指向同一个地址,改变副本指向地址对象的值,原件的也会改变。
内存管理
java的内存管理很大程度上就是:堆中对象的管理,其中包括对象空间的分配和释放
对象空间的分配:使用new关键字创建对象即可
对象空间的释放:将对象赋值null即可
垃圾回收过程
无用的对象指的就是没有任何变量引用该对象。java的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。
引用计数法
堆中的每个对象都对应一个引用计时器,当有引用指向这个对象时,引用计时器加1,当指向该对象的引用失效时(引用变为null),引用计时器减1,最后如果该对象的引用计时器的值为0,该java垃圾回收器会认为该对象是无用对象并进行回收,优点是算法简单,缺点是“循环引用的无用对象”(没有引用指向的对象互相引用)无法识别。
引用可达法
程序把所有的引用关系都看作一张图,从一个节点GD ROOT开始,寻找对应的引用节点,找到这个节点以后继续寻找这个节点的引用节点,当所有的引用节点寻找完毕以后,剩余的节点则被认为是没有被引用到的结点,即无用节点。

指堆内存由于某种原因程序未释放,造成内存浪费,导致运行速度减慢甚至系统崩溃等等。

本质就是创建好的对象的地址
普通方法中,this指调用该方法的对象
构造方法中,this指要初始化的对象
static方法中不能使用this
this()表示调用构造方法,必须要处于第一行
this是作为普通方法的隐式参数,由系统传入方法中

静态变量/静态方法生命周期和类相同,在整个程序执行期间都有效。它有如下特点:
构造方法用于对象的初始化,静态初始化块用于类的静态成员初始化操作,在静态初始化块中不能直接访问非static成员。
static{
#为静态成员赋值,调用静态方法
}
包(package)相当于文件夹对文件的作用,用于管理类、用于解决类的重名问题。
JDK中的主要包

如果要使用其他包的类,需要使用import。
用于导入指定类的静态属性和静态方法
import static java.lang.Math.*
不要重新建造轮子,而是去改善它。
英文字母:extends
public class first {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(s1 instanceof Student);
}
}
class Person{
String name;
int age;
void Person(){
this.name="first";
this.age=20;
}
}
class Student extends Person{
public void output(){
System.out.println(this.age);
}
}
用于检测该类是否继承于另一类。

子类的新方法把父类的方法直接覆盖掉了
第二点返回值类型小于等于父类的意思是,返回值的类型可以是父类,也可以是子类,但是父类的返回类型只能是父类及以上。
#####final关键字
#####组合
除了继承,组合也能实现代码的复用。组合的核心是“将父类对象作为子类的属性”
如果是“is -a”关系建议使用继承,“has-a”关系建议使用组合
eg:Student is a Person用继承,笔记本has a芯片用组合。
如果只考虑复用,组合更灵活一些,但是如果考虑逻辑性,用继承。
#####equals
equals()默认是比较两个对象的hashcode(地址)。但可以根据自己的要求重写equals方法。
#####toString的重写
public class first{
String name;
String pwd;
int id;
public first(String name,String pwd,int id){
this.name=name;
this.pwd=pwd;
this.id=id;
}
@Override//覆盖关键字,不用管
public String toString() {
return "first{" +
"name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", id=" + id +
'}';
}
public static void main(String[] args) {
first one=new first("sunjie","123",45);
System.out.println(one.toString());
}
}
这里并没有重写,只是调用了格式,如果要重写的话就改变toString里面的内容
构造方法的调用顺序:
构造方法第一句总是:super()来调用父类对应的构造方法。所有流程是先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前的子类为止。
静态初始化块调用顺序与构造方法调用顺序一样,不再重复
子类建立之前一定会先调用父类的构造方法。
理念:高内聚,低耦合(封装的越复杂,调用的时候越简单越好)
高内聚就是类的内部数据操作细节自己完成,不允许外部干涉,丢和就是仅暴露少量的方法给外部使用,尽量方便外部调用

这里的子类指不在同一个包的子类
属性一般使用private访问权限
属性私有后,提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(boolean变量的get方法是is开头的)
方法:一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。
同一个方法调用,不同的对象行为完全不同
父类引用调用子类对象的意思是,Dog类是Animal类的子类,Animal a=new Dog(),此时a是父类的引用,它调用了子类对象。
Animal animal=new Dog();//向上转型
Dog d=(Dog)animal;//向下转型
//这里的d和animal是同一个对象
包含抽象方法的类就是抽象类,抽象类可以包含普通属性和方法。
public abstract class Animal {
public abstract void rest();
public abstract void run();
public abstract void shout();
}
class Dog extends Animal{//子类必须实现父类的接口
@Override
public void rest() {
System.out.println("rest");
}
@Override
public void run() {
System.out.println("run");
}
@Override
public void shout() {
System.out.println("shout");
}
}
接口就是一组规范,所有实现类都要遵守,全部是抽象方法。
接口和实现类不是父子关系,是实现规则的关系。

访问修饰符:是能是public或者默认
接口名:和类名采用相同命名机制
extends:接口可以多继承
常量:接口中的属性只能是常量,总是public static final修饰,不写也是
方法:接口中的方法只能是public abstract
其实和抽象类差不多,实现类调用的时候用implements,可以更好地表示现实的逻辑。
接口不能创建实例,但是可以声明类型。
Volant a2=new Angel();//Volant是接口,Angel是类
允许给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做默认方法(扩展方法)
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法可以重写也可以不重写。
所有子类都可以继承默认方法。
可以在接口中直接定义静态方法的实现,这个静态方法直接属于接口(接口是特殊的类),可以通过接口名调用,如果子类中定义了相同名字的静态方法,那是完全不同的方法,不是重写,而是同名的不同的方法罢了。
子类并不继承接口中的静态方法。
类只能单继承,但是接口可以多继承,子接口extends父接口,会获得父接口的一切。

实际上内存分析中的”常量池“分为以下三种:全局字符串常量池、class文件常量池、运行时常量池,我们只关注运行时常量池即可。

| 方法 | 解释说明 |
|---|---|
| char charAt(int index) | 返回字符串中第index个字符 |
| boolean equals(String other) | 如果字符串与other相等,返回true,否则返回false |
| boolean equalslgnoreCase(String other) | 如果字符串与other(忽略大小写)相等,返回true,否则返回false |
| int indexOf(String str) | 返回从头开始查找第一个子字符串str在字符串中的索引位置。如果未找到子字符串str,则返回-1 |
| lastIndexOf() | 返回从末尾开始查找第一个子字符串str在字符串中的索引位置。如果未找到子字符串str,则返回-1 |
| int length() | 返回字符串的长度 |
| String replace(char oldChar,char newChar) | 返回一个新串,它是通过用newChar替换此字符串中出现的所有oldChar而生成的 |
| boolean startsWith(String prefix) | 如果字符串以prefix开始,返回true |
| boolean endsWith(String prefix) | 如果字符串以prefix结束,返回true |
| String substring(int beginIndex) | 返回一个新字符串,该串包含从原始字符串beginlndex到串尾 |
| String substring(int beginIndex,interesting endlndex) | 返回一个新字符串,该串包含从原始字符串beginlndex到串尾或endlndex-1的所有字符 |
| String toLowerCase() | 返回一个新字符串,该串将原始字符串中的所有大写字母改成小写字母 |
| String toUpperCase() | 返回一个新字符串,该串将原始字符串中的所有小写字母改成大写字母 |
| String trim() | 返回一个新字符串,该串删除了原始字符串头部和尾部的空格 |
下载地址:https://www.oracle.com/java/technologies/javase-jdk8-doc-downloads.html
解压,docs——>api——>index.html


把一个类放在另一个类内部进行定义就称为内部类。
内部类的两个要点:
非静态内部类的要点:
内部类的访问:
外部类中定义内部类:new Inner();
外部类以外的地方使用非静态内部类:
Outer.Inner varname=new Outer().new Inner().
定义方式:
static class ClassName{
//类体
}
使用要点:
静态内部类可以访问外部类的静态成员,但是不能访问外部类的普通成员
静态内部类看作外部类的一个静态成员
外部类以外的地方使用非静态内部类:
Outer.Inner varname=new Outer().Inner().
适合只需要使用一次的类,比如键盘监听操作等等。
语法:
new 父类构造器(实参类表)\实现接口(){
//匿名内部类类体
}
不专门创建接口的实现类,而直接在使用的时候new一个匿名的对象。
定义在方法内部的,作用域仅限于本方法的类称为局部内部类。
数组也是对象

数组的四个特点:
type[] arr_name;//方式一
type arr_name[];//方式二
public class first{
public static void main(String[] args) {
int s[];//声明
s=new int[10];//定义
for (int i = 0; i < 10; i++) {
s[i]=i;
}
System.out.println(s[0]);
}
}

静态初始化
直接在定义数组的时候就为数组元素分配空间并赋值
int[] a={1,2,3};
Man[]mans={new Man(1,1),new Man(2,2)};
动态初始化
数组定义与为数组元素分配空间并赋值的操作分开进行
int[]a1=new int[2];
a1[0]=1;
a1[1]=2;
默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
int a2[]=new int[2];//默认值:0,0
boolean[] b=new boolean[2];//默认值:false,false
for-each(专门用于读数组或容器中的所有元素)
String ss={"aa","bb"};
for(String temp:ss){
System.Out.println(temp);
}
temp指正在被遍历的元素
普通的for循环
System.arraycopy(object src,int srcpos,object dest,int destpos,int length)

以数组为元素的数组就是多维数组,声明方式与一维数组差不多,只不过方框数不一样。
System.out.println(Object)实际上就是调用 object的toString方法。
接口中只有一个方法:
public int compareTo(Object obj),obj为要比较的对象