JAVA自学整理
JDK(程序开发工具包):包含了JRE(JAVA运行环境)和开发人员工具
JRE:包含了JVM和运行时需要的核心类库
第一个代码:输出HelloWorld
public class HelloWorld{
public static void main(String[] args){
System.out.println(“HelloWorld”);
}
}
其中class HelloWorld 为类名称必须与文件名称保持一致,包括大小写
类:JAVA中所有源代码的基本组织单位。
数据类型
四大基本数据类型:
1整数型:①byte(内存空间8位 取值范围-128~127):作为成员变量未赋值,默认值为0
①short(内存空间16位 取值范围-32768~32767):作为成员变量未赋值,默认值为0
①int(内存空间32位 取值范围-2147483648~2147483647):作为成员变量未赋值,默认值为0
①long(内存空间64位 取值范围-9223372036854775808~9223372036854775807):作为成员变量未赋值,默认值为0
2.浮点型:①float(内存空间32位 取值范围1.4E-45~3.4028235E38)
②double(内存空间64位 取值范围4.9E-324~1.7976931348623157E308)
3.字符型:char
4.布尔型:boolean 只有true 或者false两种。不能与其他类型进行转换
引用数据类型:字符串、数组、类、接口、Lambda 所有引用数据类型都可以赋值为null,代表其中什么都没有
注意事项:1.整数型数据默认声明的为int类型 需要使用int的话需要加上后缀L
例:Sytem.out.println(100L)
2.浮点型数据默认声明为double类型,需要使用float 需加上后缀F
例:Sytem.out.println(3…14F)
数据类型转换
一、隐式类型转换:从低级数据类型向高级数据类型的转换,系统自动进行。 精度从低到高排序 byte<short<int<long<float<double。 例:int x=50; float y=x; 输出y结果为50.0 int类型数据自动转换为float类型数据并赋值给y
二、强制类型转换:从高级数据类型转换为低级数据类型,会造成精度损失(小数转换为整数出现)。
例:int a=(int)3.14; 3.14为double类型数据 利用(int)进行强制类型转换。
注意事项:1.复合赋值运算符中会隐含一个强制类型转换
byte num =30;
num=num+5; //实际为num=(byte)(num+5),(byte)被隐藏了
其中5为int类型 num为byte数据类型 计算过程中会num会自动转换为int类型(隐式转换)后与5相加,得到结果为int类型 赋值给byte类型的num 不会出错。
2.把一个整数值赋给byte、short、int、long型变量时,不可超过这些值的取值范围否则需要加上强制类型转换。 例:byte b=(byte)300;
变量与常量
1变量的作用域:从定义变量的一行开始,一直到直接所属的的大括号结束
例: public class Number{
static int a=0; //成员变量,在整个类中都有效
public static void mian(String[]args){
int b=0 //局部变量 在主方法内有效
while(b==0){
int c=3;//局部变量 作用范围只在 while循环内
b++;
}
System..out.println(a);输出0
System..out.println(b);//输出1
System..out.println(c); //会报错
}
}
注意事项:1.局部变量存放与栈内存中,一旦超出作用域就会从栈内存中消失
2.局部变量与成员变量名字可以相同,那么在主方法中成员变量会失效由局部变量代替
例:
public class Number{
static int time=3;
public static void main(String[]args){
int time=4;
System.out.println(times);//输出结果为4
System.out.println(this.times);//输出结果为3 利用this.成员变量名的方法进行调用
}
}
局部变量和成员变量
1.定义位置不同
局部变量:在方法内定义
成员变量:在方法外定义,直接写在类中
2.作用范围
局部:只有在方法中才能使用
成员:整个类都可以使用
3.默认值
局部:没有默认值,想要使用必须手动赋值
成员:如若没有赋值,会有默认值 规则与数组的默认值像疼痛
4.内存位置不同
局部:存放于栈(stack)内存中
成员:存放于堆(Heap)内存中
5.生命周期
局部:随着方法进栈而诞生,随着方法出栈而消失
成员:随着对象创建而诞生,随着对象被垃圾回收而消失
访问有private修饰的成员变量 不能直接通过对象名.成员变量进行调用,需要创建getter/setter方法进行获取和设置
set:不能有返回值,一定要有参数 参数类型和成员变量对于 setXxx()
get:一定要有返回值,不能有参数 返回值类型和成员变量相同 getXxx 对于boolean则改为isXxx
逻辑运算符
与:&&
或:||
以上二者具有短路效果,如果根据左边的判断已经能得到结果那么右边的代码将不再执行,节省一定的性能
例: int a=10;
System.out.println(a>11&&++a<20)//输出结果为false,且a++并不在执行 a仍为10
int b=11
System..out.println(b>3||b++<20)//输出结果为true b++不执行 b仍为11
方法
方法:将一个功能抽取出来,单独定义在一个大括号内形成单独的动能,需要时进行调用,需要在类中定义
方法定义的基本格式:public 修饰符 返回值类型 方法名称(方法参数可留空){
方法体
return 返回值;//return作用停止当前方法,将返回值还给调用出
}
注意事项 1.方法定义的先后顺序无所谓
2.各方法定义不能产生嵌套包含关系,不能再方法内定义其他方法
3.方法定义后若不被调用则不会执行
4.方法有返回值,那么必须写上return+返回值
调用方法格式:方法名称()
方法的重载:多个方法名称相同,参数列表不同(个数不同,类型不同)与方法的返回值无关,与参数名称无关
例:public static int sun(int a,int b)
public static int sun(int a,int b,int c)
public static int sun(double a,int b)
以上为sum方法的重载
public static int sun(int a,int b)
public static int sun(int c,int d)
此不称为方法的重载
JAVA内存5个部分
一.栈(stack)内存:1.存放方法中的局部变量(①方法的参数②方法内部的局部变量)一旦局部变量超出作用域,立即会从栈内存中消失。2.方法的运行再栈内存中进行
二、堆(Heap)内存:1.存放new出来的东西,都有相对应的地址值2.字符串常量池
堆内存中数据都有默认值 int,short,byte,long:默认值都为0 float,double:默认值为0.0 char:默认值为‘\u0000’ boolean:默认值为false 引用数据类型:默认值为null
三、方法区(Method Area):存储.class相关信息,包含方法信息
四、本地方法栈:与操作系统相关
五、寄存器(PC Registter):与CPU相关
数组
数组特点
1.数组为一种引用类型数据
2.数据的数据类型需要统一
3.数组的长度在运行期间不可变
声明数组的方式
int [] array=new int[12] 动态初始化声明数组
int [] array={1,2,3} 静态初始化声明数组
动态初始化数组,数组中的元素会自动拥有一个默认值
整数型:0
浮点型:0.0
字符型:’\u0000’
boolean:false
引用数据类型:null
直接打印数组名称得到的是数组的内存地址(除字符型数组会打印数组内容外)
注意事项:1.数组必须进行new初始化才能使用其中元素,若只是赋值null未经过new创建会发生空指针异常错误
2.任何数据类型都可作为数组的元素类型,自定义的类也可作为数组的元素类型
格式:类名称 [] array=new 类名称[];
例:Person [] array=new Person[3];//数组中的元素存放的应为Person类的对象
Person one=new Person;
Person two=new Person;
Person three=new Person;
array[0]=one; //实际存放为对象的地址值
array[0]=two;
array[0]=three;
遍历数组:获取数组中的每个元素(利用for循环)
获取数组长度:数组名称.length 返回int类型数据为数组长度 例:int [] array={1,2,3}; int b=array.length b的值为3
Array.toString[数组名]:以[数组元素,数组元素。。。。]的形式进行输出
对象
面向语言的特点:①封装性②继承性③多态性
自定义类的两个注意事项
1.成员变量直接定义在类中且在方法外
2.成员方法不要用static进行修饰
通常情况下一个类不能直接用,需要根据类创建对象
创建对象步骤
1.导包:import.包名称.类名称 (对于和当前类属于同一个包的情况下可以省略导包语句)
2.创建: 类名称 对象名=new 类名称()
3.使用:①使用成员变量:对象.成员变量名 ②使用成员方法:对象.方法名() 使用方法结束后,方法会立即从栈内存中消失称为出栈
类也可以作为方法返回值的对象,此时返回值为对象的地址值
例:public static void main(String[]args){
Phone two=getphone(); //调用getphone方法,将对象one的地址值赋给对象two的地址值
Systtem.out.println(two.brand);//输出结果为“苹果”
}
public static Phone getphone(){
Phone one =new Phone();
one.brand ="苹果";//对对象中的brand成员变量进行赋值
return one; //返回对象one的地址值
}
自定义类
一个标准类由4个部分组成
1.所有的成员变量都用private进行修饰
2.为每个成员变量编写一堆getter,setter从而对成员变量进行间接使用修改
3.创建一个无参构造方法:public 类名称(){方法体}
4创建一个有参构造方法:public 类名称(参数){方法体}
这样的标准类也叫java ben
常用API
Scanner:实现键盘输入数据到程序中 Scanner sc=new Scanner(System.in)
Random:产生随机数字 Random r=new Random()
①对象名.nextInt():产生一个int范围的一个随机数包含正负并进行返回
②对象名.nextInt(int a):产生一个[0,a)范围内的数进行返回 不包含a
ArrayList集合
与数组区别:数组长度在程序运行期间不可变,ArrayList集合长度可以随时变化
声明方式:ArrayList list=new ArrayList()
E:为泛型指集合中元素的数据类型 注意:E只能是引用类型不能是基本类型
对于ArrayList集合的打印得到的是集合中的元素内容[元素,元素。。],若无元素则输出[ ]而非集合对象的地址值。
若期望向集合中存入基础数据,需要使用基础数据的包装类
基本类型(对应的包装类):byte(Byte) 、short(Short)、int(Integer)、long(Long)、float(Float)、double(Double)、char(Character)、boolean(Boolean)
自动装箱:基本类型自动转换为包装类型
自动拆箱:包装类型自动转换为基本类型
ArrayList的常用方法
1.public boolean add(E e):向集合中添加元素,参数类型与泛型E一致,返回值为boolen类型是判断添加是否成功,ArrayList添加一定成功,其他集合不一定成功list.add(E e)
2.public E remove(int index):移除集合中参数索引位置的元素,并将移除元素进行返回list.remove(int index)
3.public E get(int index):从集合中获取参数位置索引号的元素并将该元素进行返回 list.get(int index)
4.publlic int size():获取集合的长度,返回值是几个中包含的元素个数 list.size()
String
字符串特点
1.字符串的内容永远不可变,字符串为常量
2.正是由于字符串不可变,所以字符串可以共享使用
3.字符串效果上相当于char[]字符数组,但是底层原理是byte[]字节数组
创建字符串的3+1种方式
①:public String():创建空白字符串,不包含由任何内容
②:public String(char[] array):根据字符数组的内容创建对于的字符串
例: char[] a={'a','b','c'};
String str1=new String(a); //字符串str1中的内容为abc
③:public String(Byte[] aray):根据字节数组的内容来创建对应的字符串
例:byte[] a={'97','98','99'};
String str1=new String(a); 字符串str1种的内容为ASCII码97~98的字符
一种直接创建: String str1="abc”//存储于堆内存的字符串常量池中
字符串常量池:程序中直接用“”写上的字符串,都存放于字符串常量池中
对于基本数据= = 比较的是数值大小
对于引用数据= =比较的是数据的地址值
字符串的常用方法:
一、比较方法
1.字符串内容比较
public boolean equals(Object obj):参数可以是任何对象 str1.equals(str2)判断str1与str2两字符串内容是否完全相同,相同返回true 不同返回false
注意点:如果比较双方字符串 一个为常量 一个为变量名 推荐把常量字符串写在前面
如比较“abc”和str1是否相同 推荐 ”abc“.equals(str1)这么写
2.字符串内容比较(忽略大小写)
public booleam equalsIgnoreCase(String str1):忽略字符串的大小写不同进行比较
二、获取方法
1.public int length():获取字符串的长度 并进行返回 str1.length
2.public String concat(String str1):将当前字符串与参数字符串进行拼接,并返回为一个新的字符串
str1.concat(str2) 得到的为一个新的字符串 内容为str1与str2的拼接
3.public char CharAt(int index):获取参数索引位置的单个字符,并进行返回 str.CharAt(int index)
4.public int indexOf(String str):查找参数字符串在本字符串中首次出现的索引位置并进行返回,若没有出现则返回-1 str1.indexOf(str2)
例:String str1="Hello";
System.out,println("el".indexOf(str1)) //输出值为1 第一次出现el e的索引位置为1
System.out,println("qq".indexOf(str1)) //输出值为-1 str1中没有出现过”qq“
三、截取方法
①public String substring(int index):截取从参数索引位置到末尾,获取截取后的新字符串并进行返回str.substring(int index)
例
String str1=“Hello”;
String str2=str1.substring(1);
System.out.println(str2);//输出结果为”ello“
②public String substring(int begin,int end):从参数1位置开始截取到参数2位置 str.substring(int begin,int end)
四、字符串的转换方法
①public char[] toCharArray():将当前字符串拆分成字符数组作为返回值 str.toCharArray
②public byte[] getBytes():获取当前字符串底层的字节数组 str.getBytes
③public String replace (char oldstring,char newstring):将字符串中出现的参数1字符修改为参数2字符得到一个新的字符串 进行返回 str.replace(char oldstring,char newstring)
五、字符串的分割方法
public string[] split(String regex):按照参数规则,将字符串切割成若干部分,若干部分保存为字符串数组进行返回 str.split(String regex)
例:String str1="1,2,3,4,a,b";
string[] str2=str1.split(",");//以”,“对str1进行分割
for(i=0;i<str2.length;i++)
System.out.println(str2[i]);//结果为 1 2 3 4 a b
split方法中的参数为正则表达式 如果想以”.“进行切分 必须写为”\.“ 直接把参数写为”.“会切割失败