Jvm:Java Virtual Machine Java虚拟机
Jre:Java Runtime Environment Java运行环境
Jdk:Java Development Kit Java 开发环境
Jdk Jre Jvm关系(从JAVA11版本之后不会再单独提供JDK了)
选择Oracle官网:https://www.oracle.com/index.html
注意安装路径不能含有中文或者空格
电脑>属性>高级系统设置>环境变量>系统变量path>添加变量(到JDK bin的路径)
在这里插入图片描述
记事本打开>cmd后输入notepad
在记事本中编写程序保存
打开cmd 输入源文件根目录 eg: d:
输入:javac+空格+源文件名.java eg:javac Hello.java 得到类文件(源文件名字打到一半可以用Tab键补齐)
输入:java+空格+类名(不是类文件名) eg:java A
在记事本中含有中文编写的源码在javac中输出后为什么是乱码?
答:是因为二者使用编码不同,记事本中源文件编码使用UTF-8 javac中编码使用的是GBK
1.更换源文件编码
如何解决中文乱码问题?(思想:让二者编码保持一直,向左看齐,或者向右看齐)
2.更换javac编码
单行注释: //人民有信仰
多行注释: /*国家有力量 */
文档注释:/** 民族有希望 */
缺点:降低了一部分性能
开发者工具IDE((IDE Integrated Development Environment))
实用工具
Fluent(微软商店)
输入:使用者告诉程序要操作的数据
输出:程序向使用者展示执行的结果
输入输出源有多种:比如app,网页,终端程序
关键字:
Java所有组成的部分都需要名字。类名,变量名以及方法名都被称为标识符
标识符注意点
合法的标识符举例:AS568,$_565,
不合法标识符举例:7asH,A&232
强类型语言(Java)
要求变量的使用要严格符合规定,所有的变量都必须先定义后才能使用(提高了安全性,但降低了速度)
Java的数据类型分为俩大类
基本类型(primitive type)
引用类型(reference type)
浮点类型:float,double
布尔类型:boolean
//八大基本数据类型
//整数
int num1=10;//最常用
byte num2=20;
short num3=30;
long num4=40L;//long类型要在后面加个L
//小数 //浮点数
float num5=50.1F;//float后面要加F
double num6=3.123456;
//字符
char name='B';char name5='国'; //char字符类型用单引号''
//字符串,String不是关键字,是类
String name7="托尔";
//布尔值
boolean flag=true;
boolean flag1=false;
//Ctrl+B查看类详细情况
什么是字节
//整数拓展 进制 二进制0b 十进制 八进制0 十六进制0x
int i = 10;
int i2 = 010;
int i3 = 0b10;
int i4 = 0x10; //16进制常用0-9 A-F表示 其中A-F表示为10-15的数字
银行业务使用浮点数类型操作会怎么样?
//浮点数拓展? 银行业务怎么表示? 钱
float _1 = 0.01f;
double A777 = 0.1 / 10;
System.out.println(_1 == A777);
System.out.println(_1);
System.out.println(A777);
float $5 = 77777777775623f;
double _xiaowang = $5 + 1;
第一组俩个变量的数值都相等,但返回的结果是false
第二组可以看出俩个变量的数值不相等,但结果确返回了true
结论:浮点数表示的字长是有限的,会存在舍入误差 的情况,只会得到一个大约数(即接近但不等于)
//字符拓展?
//===========================================
System.out.println("============================================");
char c1 = 'A';
char c2 = '中';
System.out.println(c1);
System.out.println((int) c1);//强制转换
System.out.println(c2);
System.out.println((int) c2);//强制转换
//所有字符本质都是数字
//编码 Unicode 有一个编码表:97=a 65=A 2字节 0-65536 早些年用的 Excel 2*16=65536
//u0000 uffff区间范围
//转义字符
// \t 制表符
// \n 换行
System.out.println("Hello\tWorld");
System.out.println("Hello\nWorld");
对象,内存分析
String sa = new String("hello world");
String sb = new String("hello world");//original 是String后在括号中打双引号自己生成的
System.out.println(sa == sb);
String sc = "hello world";
String sd = "hello world";
System.out.println(sc == sd);
boolean flag=true;
if(flag==true){}
if(flag){}//二者完全相同 第一种是新手写法 第二种是老手写法
//Less is more! 代码要精简
低------------------------------------------------------------------>高
byte,short,char->int->long->float->double
int i=128;
byte b= (byte) i;// 内存溢出(超出数据类型的取值范围)
//强制类型转换 格式:(类型)变量名 由高到低
byte z=123;
int _7=z;
System.out.println(z);
System.out.println(_7);
注意点:
char c='a';
int d=c+1;
System.out.println(d);
System.out.println((char)d);
//操作比较大的数的时候,注意溢出问题
int money=10_0000_0000; //JDK7新特性,数字之间可以用下划线分割
int year=20;
int total1=money*year;
long total2=money*year;
long total3=money*(long)year;
System.out.println(total1);//-1474836480 计算的时候已经溢出了
System.out.println(total2);//-1474836480 计算之前就已经溢出了
System.out.println(total3);//先把一个数转换高级类型,可以解决溢出问题
//eg:在类型转换中,后面跟的字母要写大写,避免小写 L 和 l
type varName [=value] [{,varName[=value]}];
//数据类型 变量名 = 值;可以使用逗号隔开来声明多个同类型变量
注意事项:
//int a,b,c
//int a=1,b=2,c=3; 不提倡把定义变量写在一行,程序要注重可读性
//举例定义一些变量
int a=7;
double pai=3.1415926;
String namen="Wang xuebin";
char A='B';
不提倡把定义变量写在一行,保证程序的可读性
类变量,实例变量,局部变量
public class Demo0601 {
//类变量 static
static double salary=2500;
//实例变量:从属于对象:如果不自行初始化,这个类型的默认值为 0或0.0
//布尔值:默认是false
//除了基本类型,其余默认值都是null
String name;
int age;
//属性:变量
//main方法
public static void main(String[] args) {
//局部变量:必须声明和初始化,作用在括号内
//eg:
int i=10;
System.out.println(i);
//变量类型 变量名字=new com.kuang.base.Demo0601();
Demo0601 demo0601 = new Demo0601();
System.out.println(demo0601.age);
System.out.println(demo0601.name);
System.out.println(salary);
}
final 常量名 = 值;
final double PI = 3.14; //用final关键字
//修饰符不分先后顺序 变量类型前面的都是修饰符
final static double PI=3.14;//等同于 static final double PI=3.14;
public static void main(String[] args) {
System.out.println(PI);
}
Java语言支持如下运算符
了解即可
int a=10;
int b=15;
int c=20;
int d=25;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*d);
System.out.println(a/c); //要注意结果范围
System.out.println(a/(double)c);
System.out.println(a/(float)c);
long a=1234567;
int b=123;
short c=10;
byte d=7;
System.out.println(a+b+c+d);//long类型
System.out.println(b+c+d);//int类型
System.out.println((String) (c+d));//int类型 结果类型为最高容量级 cast:转换
//关系运算符返回的结果:正确 错误 布尔值形式
int a=10;
int b=20;
int c=21;
System.out.println(c%a);//取余数,在java里称之为 模运算 模运算 模运算
System.out.println(a>b);
System.out.println(a<b);
System.out.println(a==b);
System.out.println(a!=b);
//++ -- 自增 自减 一元运算符
int a=3;
int b=a++; //++和=不相邻 先赋值在自增
int c=++a; //++和=相邻 先自增再赋值
System.out.println(a);
System.out.println(b);
System.out.println(c); //a++等同于a+1
//幂运算 在java中没有如下形式 2^3或2*2*2 很多运算,我们会使用一些工具类来操作
double pow = Math.pow(2, 3);//alt+回车键 pow 幂运算单词 ctrl+b查看源码
double pow1 = Math.pow(6, 8);
逻辑运算符
//与(and) 或(or) 非(取反)
boolean a=true;
boolean b=false;
System.out.println("a && b:"+(a&&b));//与运算俩变量都为真,结果输出ture
System.out.println("a || b:"+(a||b));//或运算一变量为真,则结果为ture
System.out.println("!(a && b):"+(!(a&&b)));//非运算,如果为真则输出假;反之结果为假则输出真
短路运算
int c=5;
boolean d=(c<4)&&(c++<4);//在与运算中先运行的结果为false 则后续不执行 如下:
System.out.println(d);
System.out.println(c);//若继续执行 则C结果输出应该为6
位运算
A = 0011 1100
B = 0000 1101
----------------------------------------------------
A&B =0000 1100 1和1相对应结果为1,其余都为0
A|B =0011 1101 0和0相对应结果为0,其余都为1
A^B =0011 0001 异或 俩位相同结果为0,不同为1
~B 1111 0010 取反 原0取1,原1取0
常见面试题 问2*8如何运行最快?
2*8 =2*2*2*2
<< 左移= *2
>> 右移= /2
0000 0000 0
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
0001 0000 16
0010 0000 32
0100 0000 64
1000 0000 128
*/
System.out.println(2<<6); //结果等于128
<< >> (X)=把二进制的1向左,向右移动几位。
扩展赋值运算符
//扩展赋值运算符
int a=10;
int b=20;
a+=b; //a = a+b
a-=b; //a = a-b
//字符串连接符 + String:""
System.out.println(""+a+b); //结果为1020 变为String下的字符 连接起来
System.out.println(a+b+""); //结果为30 因为先运算的a+b
//+有用来表示输出的作用
//X ? Y : Z
//如果x==true,则结果为y,否则结果为z
//三元运算符
int score=60;
String type = score > 60 ? "及格" +1: "不及格"; //必须掌握 开发中常用 多加练习
System.out.println(type);
包的本质就是文件夹
/**
* @author Kuangshen
* @version 1.0
* @since 1.8
*/
/**
*
* @param name
* @return
* @throws Exception
*/
public String test(String name) throws Exception {
return name;
}
// 通过命令行 javacdoc Java文件
//作业:学会查找使用IDEA生产JavacDoc文档! 面向百度编程!
JavaDoc生成文档
得到结果:
之前学习的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入
基本语法
Scanner s = new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine判断是否还有输入的数据
//创建一个扫描对象,用于接受键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNext()==true){
//使用next方式接收
String str = scanner.next();
System.out.println("输出的内容为:"+str);
}
//凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关掉
scanner.close();
// 从键盘接收数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
//判断是否还有输入
if (scanner.hasNextLine()==true){
String str =scanner.nextLine();
System.out.println("输出的内容为:"+str);
}
scanner.close();
结论
next():
nextLine():
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");
String str = scanner.nextLine();
System.out.println("输出的内容为:"+str);
scanner.close();
}
小数和整数在Scanner中的使用
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//从键盘接收数据
int i = 0;
float f = 0.0f;
System.out.println("请输入整数:");
if(scanner.hasNextInt()){
i = scanner.nextInt();
System.out.println("整数数据:"+ i);
}
else {
System.out.println("输出的不是整数数据!");
}
System.out.println("请输入小数:");
if(scanner.hasNextFloat()){
f = scanner.nextFloat();
System.out.println("小数数据:"+ f);
}
else {
System.out.println("输出的不是小数数据!");
}
public static void main(String[] args) {
//我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果
Scanner scanner = new Scanner(System.in);
//和
double sum = 0;
//计算输入了多少个数字
int m = 0;
//通过循环判断是否还有输入,并在里面对每一次进行求和统计
while (scanner.hasNextDouble()){
double x = scanner.nextDouble();
m=m+1; //m++
sum=sum+x;
System.out.println("你输入了第"+m+"个数据,当前的结果sum="+sum);
}
System.out.println(m+"个数的和为"+sum);
System.out.println(m+"个数的平均值是"+(sum/m));
scanner.close();
顺序结构
JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行
顺序结构是最简单的算法结构
即在没有任何干预的情况下,由上到下输出结果
很多时候需要去判断一个东西是否可行,然后我们才去执行,这样的一个过程在程序中用if语句来表示
语法
if(布尔值表达式){
//如果布尔值表达式为true将执行的语句
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
System.out.println("请输入内容");
//equals:判断字符串是否相等
if(s.equals("Hello")){
System.out.println(s);
}
System.out.println("END");
scanner.close();
}
if(条件表达式){
执行代码块1;
}else{
执行代码块2;
}
public class IfDemo02 {
public static void main(String[] args) {
System.out.println("请输入成绩");
Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();
//考试大于60就是及格,小于60就是不及格
if (score>60){
System.out.println("成绩合格");
}
else{
System.out.println("成绩不合格");
}
scanner.close();
}
if-else-if语句
if(条件表达式1){
//如果布尔表达式1的值为true执行代码块1;
}else if(条件表达式2){
//如果布尔表达式2的值为true执行代码块2;
}
......
else{
//如果以上布尔值都不为true执行代码块n;
}
public static void main(String[] args) {
System.out.println("请输入成绩");
Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();
if (score == 100) {
System.out.println("成绩合格");
} else if (80<=score && score<100){
System.out.println("成绩优秀");
}else if (score<80 && score>=60){
System.out.println("成绩很差");
}else if (score>=0 && score<60){
System.out.println("不及格");
}
else {
System.out.println("完蛋了");
}
scanner.close();
}
嵌套的if结构
多选择结构还有一个实现方式就是switch case语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每一个值被称为一个分支
switch语句中的变量类型可以是:
switch(表达式){
case 常量1:
语句1;
break;//可选
case 常量2:
语句2;
break; //可选
case 常量N:
语句N;
break; //可选
default:
语句;
break; //可选
}
public static void main(String[] args) {
char grade = 'B';
//case:具有穿透性 //switch:是匹配具体的一个值
switch (grade){
case 'A':
System.out.println("成绩为优秀");
break;
case 'B':
System.out.println("成绩为良");
case 'C':
System.out.println("成绩为不及格");
default:
System.out.println("再接再厉");
}
}
public static void main(String[] args) {
String name = "秦疆";
//case:具有穿透性 //switch:是匹配具体的一个值
switch (name){
case "秦疆":
System.out.println("秦疆");
break;
case "狂神":
System.out.println("狂神");
default:
System.out.println("不知道你谁啊");
}
}
while循环是最基本的循环
只要布尔值表达式为true,就会一直执行下去(死循环),正常的业务中应该尽量避免死循环
大多数情况会让循环停止下来的,需要一个让表达式失效的方式来结束循环
少部分情况需要循环一直执行,比如服务器的监听
表达式
while(布尔表达式){
}
while循环 输出0~100
public static void main(String[] args) {
int i = 0;
while (i<100){
i++;
System.out.println(i);
}
}
当while循环为true的时候 死循环
public static void main(String[] args) {
while (true){
//
//
//...
}
}
public static void main(String[] args) {
//计算1+2+3+...100?
int i = 0;
int sum = 0;
while (i<100){
i=i+1;
sum=sum+i;
}
System.out.println(sum);
}
public static void main(String[] args) {
//计算1+2+3+...100?
int i = 0;
int sum = 0;
while (i<100){
i=i+1;
sum=sum+i;
}
System.out.println(sum);
}
do…While和While的区别
表达式:
do{
//代码语句
}while(布尔值表达式);
public static void main(String[] args) {
int a =0;
double sum=0;
do {
a++;
sum=sum+a;
}while(a<50);
System.out.println("总和为="+sum);
}
while和do…while区别
public static void main(String[] args) {
int a =0;
while (a<0){
a++;
System.out.println(a);
}
System.out.println("===================");
do {
a++;
System.out.println(a);
}while(a<0);
}
for循环可以使结构变得更加简单
for循环语句是支持迭代的一种通用结构,是最有效,最灵活的循环结构
for循环执行的次数在执行前就是确定的,语法格式:
for(初始化;布尔表达式;更新){
//代码语句
}
int i =0;
int sum=0;
int sum1=0;
while (i<50){
i++;
sum+=i;
System.out.println(sum);
}
System.out.println("====================================");
for ( int a=0; a< 50; a++) {
sum1+=a;
System.out.println(sum1);
}
//死循环
for( ; ;i++){
}
}
public static void main(String[] args) {
int oddsum=0;
int evensum=0;
for (int i = 0; i < 100; i++) {
if ( i%2 == 0){
evensum+=i;
}else{
oddsum+=i;
}
}
System.out.println("偶数的和为="+evensum);
System.out.println("奇数的和为="+oddsum);
}
public static void main(String[] args) {
//输出0~1000内被5整除的数,每行输出三个
for (int i = 0; i <= 1000; i++) {
if (i%5 == 0){
System.out.print(i+"\t");
}
if (i%15 == 0) {
System.out.println();
}
}
}
public static void main(String[] args) {
for (int i = 1; i <=9; i++) {
for (int j = 1; j <=i; j++) {
System.out.print(j+"*"+i+"="+(j*i)+"\t");
}
System.out.println();
}
}
Java5引入了一种主要用于数组集合的增强for循环
Java增强for循环语法格式如下:
for(声明语句:表达式){
//代码句子
}
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配,其作用域限定在循环语块,其值与此时数组元素的值相等
表达式:表达式是要访问数组名,或者返回值为数组的方法
public class ForDemo05 {
public static void main(String[] args) {
int[] number={10,20,30,40,50};
for(int i=0;i<5;i++){ //第一种
System.out.println(number[i]);
}
System.out.println("========================");
for (int y:number){ //第二种
System.out.println(y);
}
}
public static void main(String[] args) {
int i =0;
while (i<100){
i++;
System.out.println(i);
if (i==30){
break;
}
}
}
public class Continue {
public static void main(String[] args) {
int i =0;
while (i<100){
i++;
if (i%10==0){
System.out.println();
continue;
}
System.out.print(i);
}
}
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
for (int j = 5; j >= i; j--) {
System.out.print(" ");
}
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
for (int j = 1; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
}
public static void main(String[] args) {
// int sum = add(1, 2);
// System.out.println(sum);
test();
}
//加法 加一个static 让它成为类方法
public static int add(int a,int b){
return a+b;
}
//方法:
public static void test(){
for (int i = 0; i <= 1000; i++) {
if (i % 5 == 0) {
System.out.print(i + "\t");
}
if (i % 15 == 0) {
System.out.println();
}
}
}
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个犯非法包含以下语法
方法包含一个方法头和方法体,下面是一个方法的所有部分
修饰符:是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型
返回值类型:可能会返回值,returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值,在这种情况下,returnValueType是关键字void.
方法名:是方法的实际名称,方法名和参数表共同构成方法名
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数,这个值被称为实参或者变量,参数列表是指方法的参数类型,顺序和参数的个数。参数是可选的,方法可以不包含任何参数
方法体:方法体包含具体的语句,定义该方法功能
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
public static void main(String[] args) {
int max = max(10, 20);
System.out.println(max);
}
//比大小
public static int max(int num1,int num2){
int result=0;
if (num1==num2) {
System.out.println(num1 == num2);
return 0; //return有终止方法的作用
}
if (num1>num2){
result=num1;
}else{
result=num2;
}
return result;
}
public static int max(double num1,double num2){
int result=0;
if (num1==num2) {
System.out.println(num1 == num2);
return 0; //return有终止方法的作用
}
if (num1>num2){
result=(int)num1;//方法的重载
}else{
result=(int)num2;
}
return result;
}
方法的调用
调用方法:对象名,方法名(实参列表)
Java支持俩种调用方法的方式,根据方法是否返回值来选择。
当方法返回一个值的时候,方法调用通常被当做一个值,例如
int larager = max(20,60);
如果方法返回值是void,方法调用一定是一条语句
System.out.println("Hello,kuangshen!");
拓展了解:值传递和引用传递
public static void main(String[] args) {
double larage = max(10, 20);
System.out.println(larage);
}
//比大小
public static int max(int num1,int num2){
int result=0;
if (num1==num2) {
System.out.println(num1 == num2);
return 0; //return有终止方法的作用
}
if (num1>num2){
result=num1;
}else{
result=num2;
}
return result;
}
public static int max(double num1,double num2){
int result=0;
if (num1==num2) {
System.out.println(num1 == num2);
return 0; //return有终止方法的作用
}
if (num1>num2){
result=(int)num1;//方法的重载
}else{
result=(int)num2;
}
return result;
}
public static void main(String[] args) {
//args.length 数组长度
for(int i=0;i<args.length;i++){
System.out.println("args["+i+"]"+args[i]);
}
}
public static void main(String[] args) {
Demo04 demo04 = new Demo04();//ail+回车自动补全
demo04.test(x:1,...i:2,34,56);
}
public void test(int x,int...i){ //int x必须放在int...i前面
System.out.println(i[0]);
System.out.println(i[1]);
System.out.println(i[2]);
}
public static void main(String[] args) {
//5!5*4*3*2*1 阶乘
System.out.println(a(5));
}
public static int a(int n){
if ( n==1 ){
return 1;
}else{
return n*a(n-1);
}
}
首先必须声明数组变量,才能在程序中使用数组,下面是声明数组变量的语法:
dateType[] arrayRefVar; //首选的方法
dateType arrayRefVar[]; //效果相同,但不是首选方法
Java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRefVar = new dataType[arraySize];
数组元素是通过索引访问的,数组索引从开始
获取数组长度:
public class ArrayDemo01 {
//变量的类型 变量的名字 = 变量的值;
//数组类型
public static void main(String[] args) {
int[] nums;//建议使用这一种数组声明方式 1.声明一个数组
nums=new int[10]; //这里面可以存放10个int类型的数据 2开辟一块空间,创建一个数组
int[] nums2 = new int[5];
//3给数组元素中赋值
nums2[0]=10;
nums2[1]=9;
nums2[2]=8;
nums2[3]=7;
nums2[4]=6;
//计算所有元素的和
int sum=0;
//获取数组的长度:arrarys.length
for(int i=0;i< nums2.length;i++){
sum=sum+nums2[i];
}
System.out.println("总和为:"+sum);
}
静态初始化
int[] a = {1,2,3};
Man[] mans = {new Man(1,1),new Man(2,3)};
动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
数组的默认初始化
public static void main(String[] args) {
//静态初始化:创建+赋值
int[] a={2,3,4,7,9};
System.out.println(a[3]);
//动态初始化:包含默认初始化
int[] b=new int[10];
}
数组的四个基本特点
长度是确定的。数组一旦被创建,它的大小就是不可改变的
其元素必须是相同类型,不允许出现混合类型
数组中的元素可以是任何数据类型,包括基本类型和引用类型
数组变量是引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其它对象类型
数组对象本身是在堆中的
数组边界
下标的合法区间:[0,length-1],如果越界就会报错
int[] a =new int[2];
System.out.println(a[2]);
ArrayIndexOutOfBoundsException():数组下标越界异常
小结
int[] a ={1,2,3,4,5,6,7,8};
for (int i = 0; i <=a.length; i++) {
System.out.println(a[i]);
基础使用 for循环
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
//打印全部的整数元素
for (int i = 0; i < arrays.length; i++) {
System.out.println(arrays[i]);
}
System.out.println("============");
//计算所有元素的和
int sum=0;
for (int i = 0; i <arrays.length ; i++) {
sum+=arrays[i];
}
System.out.println("sum="+sum);
System.out.println("============");
//查找最大元素
int max = arrays[0];
for (int i = 0; i <arrays.length ; i++) {
max=arrays[i];
}
System.out.println("MAX="+max);
}
array.for自动生成增强for循环数组
public static void main(String[] args) {
int[] arrays = {1,2,3,4,5};
//JDK1.5没有下标
for (int array : arrays) {
System.out.println(array);
}
}
打印数组元素
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
printArray(arrays);
}
//打印数组元素
public static void printArray(int[] arrays){
for (int i = 0; i <arrays.length ; i++) {
System.out.print(arrays[i]+" ");
}
}
反转数组 reverse(反转)
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
int[] reverse = reverse(arrays);
printArray(reverse);
}
//反转数组 reverse反转
public static int[] reverse(int[] arrays){
int[] result = new int[arrays.length];
//反转的操作
for (int i = 0,j=result.length-1; i < arrays.length; i++,j--) {
result[j]=arrays[i];
}
return result;
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组
二维数组
int a[][] = new int[2][5];
以上二维数组a可以看成一个俩行五列的数组
public static void main(String[] args) {
int[][] array = {{1,2},{3,4},{5,6},{7,8}};
for (int i = 0; i <array.length ; i++) {
for (int j = 0; j <array[i].length ; j++) {
System.out.println(array[i][j]);
}
}
}
打印数组/对数组进行排序
public static void main(String[] args) {
int[] a ={1,2,88,56,986,8745,12,8};
//打印数组元素 Arrays.toString
System.out.println(Arrays.toString(a));
//对数组进行排序
Arrays.sort(a);
System.out.println(Arrays.toString(a));
}
数组填充
//数组填充
Arrays.fill(a,0);
System.out.println(Arrays.toString(a));
public class ArrayDemo07 {
public static void main(String[] args) {
int[] a={1,4,5,6,72,2,2,2,25};
int[] sort = sort(a);//调用完我们自己写的排序方法以后,返回一个排序后的数组
System.out.println(Arrays.toString(sort));
}
//冒泡排序
//1.比较数组中,俩个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
//2.每一次比较,都会产生出一个最大,或者最小的数字
//3.下一轮则可以少一次排序
//4.依次循环,直到结束
public static int[] sort(int[] array){
int temp=0;
//外层循环,判断我们这个要走多少次;
for (int i = 0; i < array.length-1 ; i++) {
//内层循环,比价判断俩个数,如果第一个数,比第二个数大,则交换位置
for (int j = 0; j < array.length-1-i ; j++) {
if (array[j+1]>array[j]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
return array;
}
优化后的
public class ArrayDemo07 {
public static void main(String[] args) {
int[] a={1,4,5,6,72,2,2,2,25};
int[] sort = sort(a);//调用完我们自己写的排序方法以后,返回一个排序后的数组
System.out.println(Arrays.toString(sort));
}
//冒泡排序
//1.比较数组中,俩个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
//2.每一次比较,都会产生出一个最大,或者最小的数字
//3.下一轮则可以少一次排序
//4.依次循环,直到结束
public static int[] sort(int[] array){
int temp=0;
//外层循环,判断我们这个要走多少次;
for (int i = 0; i < array.length-1 ; i++) {
boolean flag = false; //通过flase标识位减少没有意义的比较
//内层循环,比价判断俩个数,如果第一个数,比第二个数大,则交换位置
for (int j = 0; j < array.length-1-i ; j++) {
if (array[j+1]<array[j]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
if (flag==false){
break;
}
}
return array;
}
面向对象&面向过程
什么是现象对象
方法的定义
修饰符
返回值类型
//Demo01 类
public class Deom01 {
//main方法
public static void main(String[] args) {
}
/*
修饰符 返回值类型 方法名(...){
//方法体
return 返回值;
}
*/
public String sayHello(){
return "Hellow world";
}
public int max(int a,int b){
return a>b ? a:b; //三元运算符
}
break:跳出switch,结束循环和return的区别
//结束方法,返回一个结果
public String sayHello(){
return "Hellow world";
}
public void A77(){
return ;
}
方法名:注意规范就OK 见名知意原则
参数列表:(参数类型,参数名)…
异常抛出:疑问,后面讲解
静态方法下调用
非静态方法调用
静态类调用非静态类(报错)
值传递和引用传递
public class Demo05 {
//值传递
public static void main(String[] args) {
int a=1;
System.out.println(a);// 1
Demo05.change(a);
System.out.println(a);// 1
}
//返回值为空
public static void change(int a){
a=10;
}
public class Demo06 {
public static void main(String[] args) {
Perosn perosn = new Perosn();
System.out.println(perosn.name);//null
Demo06.change(perosn);
System.out.println(perosn.name);//秦疆
}
public static void change(Perosn perosn){
//perosn是一个对象:指向的--->Perosn perosn = new Perosn();这是一个具体的人
perosn.name ="秦疆";
}
}
//定义了一个Perosn类,有一个属性:name
class Perosn{
String name;
}
类是一种抽象的数据类型,它是对某一事物整体描述/定义/,但是并不能代表某一个具体事物
对象是抽象概念的具体实例
创建对象与初始化
一个项目里只能有一个main方法
构造器
//java-calss
public class Person {
//一个类即是什么都不写,它也会存在一个方法
//显示的定义构造器
String name;
//alt+insert快捷键生成有参无参
//实例化初始值
//1.使用new关键字,必须要有构造器
public Person() {
this.name = "秦疆";
}
//有参构造:一旦定义了有参构造,无参构造必须显示定义
public Person(String name){
this.name= name;
}
}
/* public static void main(String[] args) {
//new 实例化了一个对象
Person person = new Person("kuangshen");
System.out.println(person.name);//qinjiang
}
构造器:
1.和类名相同
2.没有返回值
作用:
1.new本质在调用构造方法
2.初始化对象的值
注意点:
1.定义有参构造之后,如果想使用无参构造,显示的定义的一个无参构造
Alt+Insert
this.当前类 = 传进来的参数的值
*/
类与对象
方法
对应的引用
属性:字段Field 成员变量
默认初始化
修饰符 属性类型 属性名 = 属性值!
对象的创建和使用
类:
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
extends 的意思是“扩展”。子类是父类的阔爱还在那
JAVA中类只有单继承,没有多继承!
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖,组合。聚合等
继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
子类和父类之间,从意义上讲应该具有“is a”的关系
在JAVA中,所有的类,都默认直接或者间接继承object
super注意点:
VS this:
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提:
this:没有继承也可以使用
super:只能在继承条件下才可以使用
构造方法:
this();本类 的构造
super():父类的构造!
去掉static
总结
多态
多态注意事项
抽象:封装,继承,多态
//static:在类中使用就修饰成员变量 在方法中使用就修饰成员方法
public class Student {
private static int age;//静态成员变量
private double score; //非静态成员变量
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(Student.age);
//System.out.println(Student.score);
System.out.println(s1.age);
System.out.println(s1.score);
}
抽象类的所有方法,继承了它的子类,都要去替他实现
interface定义接口类 implements实现接收
//interface 定义的关键字,接口都需要有实现类
public interface UserService {
//接口中的所有定义其实都是抽象的public abstract
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
接收:
作用:
内部类就是在一个类的内部在定义一个类,比如A类中定义一个B类。那么B类相对于A类来说就被称为内部类,而A类相对B类来说就是外部类了
局部内部类
匿名内部类
什么是异常
简单分类
异常体系结构
Exception
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;
Error和Exception的区别: Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
异常处理机制
快捷键自动生成Ctrl+alt+t(截图错误)
手动结束程序 System.exit
主动抛出异常 throw
主动抛出异常throws
实验应用中的经验总结
处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
在多重catch块后面,可以加一个catch (Exception)来处理可能会被遗漏的异常
对于不确定的代码,也可以加上try-catch,处理潜在的异常
尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
具体如何处理异常,要根据不同的业务需求和异常类型去决定
尽量添加finally语句块去释放占用的资源IO~Scanner