JavaSE基础
通过这几天的网络学习,对于老师们的耐心讲解与引导,对Java这门课程有了新的认识。
首先是三个学习:1.该技术是什么? 2.该技术该如何使用? 3.该技术的特点是什么?之后是三个编写:1.明确需求 2.分析思路 3.代码实现
以下便是最近几天的学习心得。
Java的三大版本
JAVASE:标准版(一般用于桌面程序,控制台开发...)
JAVAME:嵌入式开发(一般用于手机,小家电...)
JAVAEE:企业开发(web端,服务器开发...)
JDK:java开发者工具
JRE:java运行环境
JVM:java虚拟机
Dos命令
-
- dir :查看当前目录所有信息
- cls :清除屏幕
- exit:退出终端
- cd..:返回上一个级目录
- 打开应用:(calc:计算机)( mspaint:画图 )(notepad:记事本)
- ping命令:ping www.baidu.com
- 文件命令:md 目录名=创建目录
- cd>文件名=创建文件
- rd 目录名=删除目录
- del 文件名=删除文件
标识符中的关键字
java所有组成的部分都需要名字,类名,变量名以及方法名都被成为标识符
标识符的构造规则:只能由字母数字和下划线组成,数字不能再第一个位置上,不能使用java的关键字
数据类型
1. 整数类型:int,long,byte,short
2. 浮点类型:double,f\'loat
3. 字符类型:char
4. boolean类型:只有true与false
拓展:(进制表达)
int a=10;//十进制
int b=010;//八进制:0
int c=0x10;//十六进制0x A~F 10~15
(面试题)银行业务怎么表示?钱
答:银行业务使用的是BigDecimal 数学工具类表示,flat与double虽然也可以表示浮点数,但是它们的特点是:舍入误差,大约接近,但不等于。
拓展:(字符类型)
所有的字符本质都是数字,由Uincode编码,取值范围在:U0000~UFFFF.
类型转换
强制转换:(类型)变量名 由高---到低
int a=120;
byte b=(byte)a;
自动转换:由低---到高
int a=120;
double b=a;
注:不能对boolean类型转换
不能把类型转换为不相干的类型
转换的过程中可能会出现内存溢出,精度误差问题
变量
类变量:在main方法体外,用static修饰
实例变量:在main方法体外,从属于对象,如果没给初始值,将自动设为默认值(0或者0.0或者null)
boolean默认值为:false
局部变量:在main方法体内,必须声明和初始化这个值
命名规范:
常量
关键字:final
final(类型)变量=值
运算符
逻辑运算:和(&&)或(||)非(取反)
位运算符:与(&) 或(|)异或运算(^)取反(~)左移(>>)右移(<<)
面试题:2*8 怎么运算最快?
答:使用二进制位运算,因为在计算机中所有的运算均需要二进制,所以采用二进制最快。将2右移3位(2<<3),相当于2*3的平方计算结果。
字符串连接符:+
面试题:
在以下案例中,输出结果有何不同?
int a=10;
int b=20;
System.out.println(""+a+b);
System.out.println(a+b+"");
答:+起到了拼接的作用,字符串在前,将会先于后面的a做拼接,在做计算。字符串在后,将会先计算前面a+b的值,再去做拼接。
三元运算符:?:
例:int a=60;
String arr=a<60?"成绩不及格":"成绩及格";
Scanner的定义与使用
Scanner:相当于键盘扫描仪,可以将用户输入的内容扫描,并打印在控制台
Scanner scanner = new Scanner:创建一个变量名为scanner的扫描仪
String arr = scanner.next();空格之前的所有字符
String arr2 =scanner.nextInt();回车之前的所有字符
注:输入输入为IO流 特点:使用完资源以后一定要释放资源。变量名.close;释放资源
if语句判断
if语句+if嵌套:if(判断语句){
}else if(判断语句){
}else if(判断语句){
}else{
}
switch多选择结构
switch语句:switch(匹配一个具体的值){
case 变量:
break;
case 变量:
break;
default:
}
循环
while循环:只要循环表达式为布尔类型,且为true,则无限循环。条件不满足无法进入循环(先执行 后判断)
do while循环:至少执行一次。(先判断 后执行)
for循环:for循环语句是支持迭代的一种通用结构,是最灵活最有效的循环结构。
增强for:for(声明语句:表达式){代码句子} 主要用于数组与集合遍历。
九九乘法表:
public class JJfor {
public static void main(String[] args) {
for (int j = 0; j <= 9; j++) {
for (int i = 1; i <=j; i++) {
System.out.print(j+"*"+i+"="+i+"\t");
}
System.out.println();
}
}
}
分析:
1.先打印第一列for(int i=1;i<=9;i++)
2.把固定的1,再用循环包裹起来
3.去掉重复项:i<=j
4.调整样式
JAVA方法
java方法:1.是语句的集合,他们在一起执行一个功能。
2.再程序中创建,在其他地方引用。
3.一个方法只做一个功能!
如果返回值是类型参数,需要return返回值
方法的调用:1.如果这个方法返回的是一个值,那么这个方法一般当作一个值使用。
2.如果这个方法返回的是一个void,那么这个方法一定是条语句。
方法重载规则:1.方法名必须相同
2.参数列表必须不同
递归
递归:指的就是自己调用自己方法,它可以用简单的程序来解决复杂的问题,大大减少程序的代码量。
递归的结构包含了:1.递归头:什么时候不调用自己方法(如果没有头,将陷入死循环)
2.递归体:什么时候调用自己方法
数组
数组:是一个相同类型数据的有序集合,有一定的先后顺序,每一个数据,称为数组的元素,每个数组元素可通过一个下标来访问它们。
数组变量属于引用类型,在使用的时候用.(点)给引用出来。
静态数组:静态初始化 = 创建 + 赋值
例: int[] arr = new {1,2,3} //直接赋值
arr [0];
arr [1];
动态数组:
例: int[] arr = new[10]; //手动赋值
arr [0] = 1;
arr [1] = 2;
java内存
堆:存放new出来的对象和数组
栈:存放基本变量类型
方法区:可以被所有的线程共享
冒泡排序
这个算法的时间复杂度为:O(n2):n的2次方
代码为:
import java.util.Arrays; public class Q4 { public static void main(String[] args) { int[] arr={3,432,65,4,54,5,63}; System.out.println(Arrays.toString(tp(arr)));//调用并打印数组 }
//下面是编写的方法体 public static int[] tp(int[]arr){ int p=0;//声明一个第三方的变量,并且初始化 for (int i = 0; i < arr.length-1; i++) {//第一层循环数组 for (int j = 0; j < arr.length-1-i; j++) {//第二层比较大小 if (arr[j+1]<arr[j]){//如果后一个的值比前面的大 p=arr[j];//首先把前一个值给第三方 arr[j]=arr[j+1];//再把后一个的值给前一个 arr[j+1]=p;最后把第三方的值给后一个,实现两者数组的交替 } } } return arr; } }
优化代码:加入Boolean判断
import java.util.Arrays; public class Q4 { public static void main(String[] args) { int[] arr={3,432,65,4,54,5,63}; System.out.println(Arrays.toString(tp(arr))); } public static int[] tp(int[]arr){ int p=0; boolean flag=false; for (int i = 0; i < arr.length-1; i++) { for (int j = 0; j < arr.length-1-i; j++) { if (arr[j+1]<arr[j]){ p=arr[j]; arr[j]=arr[j+1]; arr[j+1]=p; flag=true; } } if (flag==false){ break; } } return arr; } }
面向对象编程
本质就是以类的方式组织代码,以对象的组织(封装)数据
三大特性:1.封装 2.继承 3.多态
创建与初始化对象
使用new关键字创建对象,会默认初始化值,还会调用类中的构造方法
类中的构造器又称构造方法,在创建对象的时候是必须要调用的,构造方法有两个特点,1.必须和类的名字相同,2.必须没有返回类型,也不能使用void
无参构造默认就有,一旦定义了有参构造,无参就不存在。想要使用必须重新生成。
一旦定义有参构造以后,还想要使用无参构造,就必须再定义一个无参构造。
this. 代表这个类,必须放在第一行
类是一个模板,类是抽象的
对象是一个具体的实例
引用类型:对象是通过引用来操作的,说白了就是指向对象的一个地址
高内聚:类的内部数据由自己完成,不允许外部干涉。
低耦合:仅暴漏少量的方法给外部使用。
封装:1.提高程序的安全性 2.隐藏代码的实现细节 3.统一接口 4.增加程序的可维护性
GET:获取 SET:设置
继承:extends
super:调用父类构造方法,必须放在第一行,只能出现再字类方法中,并且与this只能有一个调用。
面试题
super与this的区别:
1.前提不同:super必须在有继承的情况下才可以使用。
this 再没有继承的情况下也可以使用。
2.代表的对象不同:super代表的是父类的对象引用。
this代表的是本身调用者这个对象。
3.构造方法不同:super是父类构造。
this是本类构造。
重写(override):父类的功能,字类不一定需要,或者不一定满足
1.需要有继承关系,字类重新父类的方法
2.方法名必须相同
3.修饰符:范围可以扩大,不能缩小:public>protected>Default>private
4.抛出的异常:范围可以缩小,不能扩大:ClassNotFoundException------>Exception(大)。
总结:重写,字类的方法与父类的方法必须一致,方法体不同!
如果方法是(static:静态 finl:常量 private:私有)是无法重新方法的
多态
1.多态是方法的多态,属性是没有多态的
instanceof:类型转换(自动转换/强制转换)--->引用类型
2.存在的条件:有继承关系,并且方法重新,父项指向字类对象
abstract 抽象类
抽象方法只有方法名,没有方法的实现。
例:
不能new这个抽象类,只能靠字类去实现它,就是一个约束
抽象的抽象就是约束
接口(interface)
接口就是规范:定义的是一组规则,比如:你是什么...就必须...的思想!
接口的本质就是契约,定义好了以后大家都去遵守它
利用接口可以实现多继承
作用:1.约束 2.定义一些方法让不通过的人实现 3.隐藏的public static final 常量 4.隐藏的public abstract 抽象的 5.接口不能被实例化,接口中没有构造方法 7.必须重新接口
内部类
内部类:就是再一个类里面再定义一个新的类,比如再A类里面定义一个B类,那么B类就是A的内部类
内部类分为:1.成员内部类:再一个类里面再写进另外一个calss就是内部类
2.静态内部类:加上static就是一个静态的内部类
3.局部内部类:再方法里写入另一个class就是局部内部类
4.匿名内部类:没有名字的初始化类,不将实例保存到变量中
异常:(Error / Exception)
Throwable:最高异常--->包含了Error异常与Exception异常
Error:通常是灾难性的致命错误。是程序无法处理和处理的,当出现这种异常时,java虚拟机(JVM)就会终止线程。
Exception:一般情况下是可以被程序处理,应尽可能的再程序中处理这些异常。
Error异常报错: Virtual MachineError:java虚拟机运行错误
OutOfMemoryError:JVM不在执行所需的内存资源时
Exception异常报错:RuntimeException:运行时异常
ArraylndexOutOfBoundsException:数组下标越界
NullpointerException:空指针异常
ArithmeticException:算术异常
MissingResourceException:丢失资源
ClassNotFoundException:找不到类
异常处理机制
快捷键:选择可能出现异常的语句 ctrl+alt+T 自动捕获异常
抛出异常:
案例1:在方法内抛出异常
public static void main(String[] args) {
}
public void arr(int a,int b) throws ArithmeticException{ //throws 在方法上抛出异常(如果throw解决不了就用throws)
if (b==0){
throw new ArithmeticException(); //throw 在方法内抛出异常
}
}
}
捕获异常:捕获多个异常,要从小到大。
案例:
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
System.out.println("执行语句a/b"+a/b);
}catch (Throwable i){
System.out.println("程序捕获到异常,执行该语句");
}finally {
System.out.println("无论有没有异常,我都会执行");
}
}
}
关键字:try catch finally throw throws