Java学习笔记1

2018-10-22  本文已影响0人  海洋_5ad4

注释

注释概述:用于解释说明程序的文字
Java中注释分类格式
单行注释 格式://注释文字
多行注释 格式:/* 注释文字 */

文档注释 格式:/** 注释文字 */
养成先写注释后写代码的习惯
单行注释可以嵌套,多行注释不能嵌套

关键字

关键字概述:被java语言赋予特定含义的单词
关键字特点:组成关键字的字母全部小写
关键字注意事项:goto和const作为保留字存在,目前并不使用

标识符

标识符概述:就是给类,接口,方法,变量等起名字时使用的字符序列
组成规程:英文大小写字母、数字字符、$和_
注意事项:不能以数字开头、不能是Java中的关键字、区分大小写

示例

包(其实就是文件夹,用于解决相同类名问题)
举例
包名要求全部小写,一般是公司的域名倒着写
com.heima.包的作用
类或者接口
一个单词和多个单词分别举例
如果是一个单词,要求首字母大写,如果是多个单词,要求每个单词首字母大写(驼峰命名)
方法和变量
一个单词和多个单词分别举例
如果是一个单词,每个字母都小写,如果是多个单词,从第二个单词开始首字母大写
常量
一个单词和多个单词分别举例
如果是一个单词,所有字母大写,如果是多个单词也是所有字母大写,但是用_分开
MAX
MAX_VALUE

常量

什么是常量?在程序执行的过程中其值不可以发生改变
Java中常量的分类?字面值常量、自定义常量(面向对象部分讲)
字面值常量的分类

class Demo1_Constant {
    public static void main(String[] args) {
        /*
        字符串常量    用双引号括起来的内容
        整数常量                  所有整数
        小数常量                  所有小数
        字符常量      用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号
        布尔常量      较为特殊,只有true和false
        空常量        null(数组部分讲解)
        */
        System.out.println("abc");    //字符串常量
        System.out.println(123);      //整数常量
        System.out.println(12.3);   //小数常量
        System.out.println('1');      //''中必须放的是单个字符,10代表的是1字符和0字符
        //System.out.println('');     //''中什么也不放,也是不可以的,因为代表不了任何字符
        System.out.println(' ');      //代表空格字符
        System.out.println(true);   //boolean类只有两个字符,true和false
    }
}

进制

1byte = 8bit
1k = 1024b
1m = 1024k
1g= 1024m
1t = 1024g
二进制的数据表现形式:由0,1组成,以0b(b可以大写也可以小写)开头
八进制的数据表现形式:以0开头
默认为是十进制
十六进制的数据表现形式:以0x开头

实例

0b100
0100
100
0x100

进制转换1.jpg
进制转换2.jpg

原码反码补码

原码:就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
通过一个字节,也就是8个二进制位表示+7和-7
0(符号位) 0000111
1(符号位) 0000111
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

变量

什么是变量?在程序执行的过程中,在某个范围内其值可以发生改变的量
变量的定义格式 数据类型 变量名(合法的标识符) = 变量值
为什么要定义变量? 用来不断的存放同一类型的常量,并可以重复使用

数据类型

为什么有数据类型?Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间
数据类型的分类:基本数据类型、引用数据类型(面向对象部分讲解)
基本数据类型分类(4类8种)
整数型
byte 占一个字节 -128到127
short 占两个字节 -2^15 ~ 2^15-1
int 占四个字节 -2^31 ~ 2^31-1
long 占八个字节 -2^63 ~ 2^63-1
浮点型
float 占四个字节 -3.403E38~3.403E38 单精度
double 占八个字节 -1.798E308~1.798E308 双精度
字符型
char 占两个字节 0~65535
布尔型
boolean理论上是占八分之一字节,因为一个开关就可以决定是true和false了,但是java中boolean类型没有明确指定大小

class Demo1_DataType {
    public static void main(String[] args) {
        //整数类型
        byte b =10;  //占一个字节
        short s = 20;  //占两个字节
        int i = 30;    //占四个字节,整数默认是int类型
        long x = 8888888888L; //占八个字节,如果long类型后面加L进行标识最好加大L,因为小l太像数字1了。
        System.out.println(b);
        System.out.println(s);
        System.out.println(i);
        System.out.println(x);
        //浮点类型
        float f = 12.3F;     //占四个字节
        double d = 33.4;     //占八个字节     小数默认的数据类型是double,double类型后面也可以用D或者d标识,但是一般不加
        System.out.println(f);
        System.out.println(d);
        //字符类型
        char c = 'a';     //占两个字节
        System.out.println(c);

        //布尔类型
        boolean b1 = true;
        boolean b2 = false;
        System.out.println(b1);
        System.out.println(b2);
    }
}

使用变量的注意事项:
1.作用域问题:同一个区域不能使用相同的变量名
2.初始化值的问题:局部变量在使用之前必须赋值
3.一条语句可以定义几个变量 int a,b,c,...;

类型转换

类型转换1.jpg
类型转换2.jpg

1.隐式转换
从小到大,可以隐式转换,数据类型将自动提升。
2.强制转换
从大到小(如果你明确知道数据是可以用该数据类型来表示的,可以用强制转换)
int a = 10
byte b = 20
b = (byte)(a+b)
1.a + b会首先将b转化为int类型再相加,这是隐式转换
2.(byte)(a+b)会将a+b的结果(是int型)强制转化为byte型,这是强制转换
3.如果强制转换超出了被赋值的数据类型的取值范围,得到的结果会与你期望的结果不同。

class Demo3_DataTypeConversion {
    public static void main(String[] args) {
        /*00000000 00000000 00000000 10000010   130的二进制
          10000010                              -126的补码
          10000001                              -126反码
          11111110                              -126原码
        */
        byte b = (byte)(126 + 4);
        System.out.println(b);
        /*00000000 00000000 00000001 00101100   300的二进制
          00101100                              44原码
        */
        byte b2 = (byte)(300);
        System.out.println(b2);
    }
}

面试题

class Test1_DataTypeConversion {
    public static void main(String[] args) {
        //面试题:看下面程序是否有问题,如果有问题,请指出并说明理由。
        byte b1 =3;
        byte b2 =4;
        //byte b3 = b1 + b2;
        //System.out.println(b3);
        /*
        从两方面
        1.byte与byte(或short,char)进行运算的时候会提升为int,两个int类型相加的结果也是int类型
        2.b1和b2是两个变量,变量储存的值是变化的,在编译的时候无法判断里面具体的值,相加有可能会超出byte的取值范围
        */
        byte b4 = 3 + 4;   //java编译器有常量优化机制
        System.out.println(b4);
    }
}

long和float的取值范围谁大谁小

进行混合运算的时候,byte,short,char不会相互转化,都会自动类型提升为int类型,其他类型进行混合运算的是小的数据类型提升为大的
byte,short,char >> int >> long >> float >> double

class Test2_DataTypeConversion {
    public static void main(String[] args) {
        float f = 12.3f;//4个字节
        long x = 12345;//8个字节

        //f = x;               //隐式转换
        //System.out.println(f);

        x = (long)f;         //强制转化
        System.out.println(x);

        /*
        float占4个字节
        IEEE 754
        4个字节是32个二进制位
        1位是符号位
        8位是指数位
        00000000 - 11111111
        0到255
        0代表0
        255代表无穷
        1 ~ 254
        减去127
        -126 ~ 127
        23位代表尾数位
        */
    }
}

1.它们底层的储存结构不同
2.float表示的数据范围比long的范围要大
long:2^63-1
float: 3.4 * 10^38 > 2 * 10^38 > 2 * 8^38 = 2 * 2^3 ^38 = 2 * 2^114 >2^63-1

class Demo4_DataTypeConversion {
    public static void main(String[] args) {
        System.out.println('a' + 1);       //98,因为有ASCII码表,a字符对应的是int类型的97
        System.out.println((char)('a'+1));
        // '0' 48 'A' 65 'a' 97
        System.out.println("hello"+'a'+1);  //任何数据类型用+与字符串相连接都会产生新的字符串
        System.out.println('a'+1+"hello");
        System.out.println(" 5 + 5 = " + (5 + 5));
    }
}

char数据类型

class Demo5_char {
    public static void main(String[] args) {
        char c = 'a';
        System.out.println(c);

        byte b = 100;
        char c1 = 97;   //0 ~ 65535
        System.out.println(c1);
        char c2 = 3;
        char c3 = 4;
        char c4 = 5;
        char c5 = 6;
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);

        //char类型可以储存中文
        char c6 = '中';
        System.out.println(c6);
    }
}

Java语言中的字符char可以储存一个中文汉字吗?为什么呢?
可以。因为Java语言采用的是Unicode编码。 Unicode编码中的每个字符占用两个字节。中文也是占的两个字节,所以Java中的字符可以储存一个中文汉字

算术运算符

什么是运算符?就是对常量和变量进行操作的符号
运算符的分类:算数运算符、赋值运算符、比较(关系或条件)运算符、逻辑运算符、位运算符、三目(元)运算符
算数运算符有哪些:+,-,*,/,%,++,--

class Demo1_Operator {
    public static void main(String[] args) {
        /*
        a:+号在java中有三种作用,代表正号,做加法运算,字符串的连接符
        b:整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型
        c:/获取的是除法操作的商,%获取的是除法操作的余数
        %运算符
           当左边的绝对值小于右边的绝对值时,结果是左边
           当左边的绝对值等于右边或者右边的倍数时,结果是0
           当左边的绝对值大于右边的绝对值时,结果时余数
           %运算符结果的符号只和左边有关系,与右边无关
           任何一个正整数%2结果不是0就是1可以用来当作切换条件
         */
         System.out.println(10 / 3);  //整数相除结果只能时整数
         System.out.println(10 / 3.0);  //如果想得到小数,把其中一个数变成小数,另一个数在运算的时候会自动类型提升
         System.out.println(13 % -5);   //结果是3
    }
}

++--运算符

a:单独使用:
放在操作数的前面和后面效果一样
b:参与运算使用:
放在操作数的前面,先自增或自减,然后再参与运算。
放在操作数的后面,先参与运算,再自增或自减。

实例
byte b = 10
b++ //底层会帮着实现b = (byte)(b+1)
b = b + 1 //会报错,右边会提升为int类型后在相加,赋给左边的byte类型的b会报错

赋值运算符

把右边的值赋值给左边的变量,左边必须是变量。
有以下赋值运算符
=
+=
-=
/=
%=
*=
short s=1;s=s+1;会报错,会提升为int,然后赋给short类型时会报错
short s=1;s+=1;不会报错 底层会自动实现s = (short)(s + 1)

class test {
    public static void main(String[] args) {
        int i = -1;
        System.out.println(Integer.toBinaryString(i));
        i >>>= 10;
        System.out.println(Integer.toBinaryString(i));
        long l = -1;
        System.out.println(Long.toBinaryString(l));
        l >>>= 10;
        System.out.println(Long.toBinaryString(l));
        short s = -1;
        System.out.println(Integer.toBinaryString(s));
        s >>>= 10;
        System.out.println(Integer.toBinaryString(s));
        byte b = -1;
        System.out.println(Integer.toBinaryString(b));
        b >>>= 10;
        System.out.println(Integer.toBinaryString(b));
        b = -1;
        System.out.println(Integer.toBinaryString(b));
        System.out.println(Integer.toBinaryString(b>>>10));
    }
}

关系运算符(比较运算符,条件运算符)

==,!=,>,>=,<,<=
结果是boolean类型
==号不能写成=号,一个是比较,一个是赋值。

逻辑运算符

逻辑运算符有哪些
* &,|,^,!
* &&,||

&&和&的区别?

||和|的区别?

位运算符

class test {
    public static void main(String[] args) {
        System.out.println(~6);
        /*
        00000000 00000000 00000000 00000110 6的原码反码补码都是本身
        11111111 11111111 11111111 11111001 对6取反
-       00000000 00000000 00000000 00000001
---------------------------------------------------
        11111111 11111111 11111111 11111000 反码
        10000000 00000000 00000000 00000111 原码(-7)
        */
    }
}
位异或运算符的特点及面试题
class test {
    public static void main(String[] args) {
        int x = 10;
        int y = 5;
        //交换x和y
        //不需要定义第三方变量,有弊端,有可能会超过int的取值范围
        /*x = x + y;    //10 + 5 = 15
        y = x - y;    //15 - 5 = 10
        x = x - y;    //15 - 10 = 5
        System.out.println("x = " + x + ",y = " + y);*/

        //不需要第三方变量,通过^来做
        x = x ^ y;       // 10 ^ 5
        y = x ^ y;       // 10 ^ 5 ^ 5 y = 10
        x = x ^ y;       // 10 ^ 5 ^ 10 x = 5
        System.out.println("x = " + x + ",y = " + y);   
    }
}

位运算符2

class test {
    public static void main(String[] args) {
        /*
        *  <<:左移    左边最高位丢弃,右边补齐0
        *  >>:右移    最高位是0,左边补齐0;最高为是1,左边补齐1
        *  >>>:无符号右移 无论最高位是0还是1,左边补齐0
        *  最有效率的算出2 * 8的结果
        */

        //左移,向左移动几位就是乘以2的几次幂
        System.out.println(12 << 1);      //24
        System.out.println(12 << 2);      //48
        /*
        00000000 00000000 00000000 00001100   12的补码
     (0)00000000 00000000 00000000 00011000   24的补码
    (00)00000000 00000000 00000000 00110000   48的补码
        */
        //右移,向右移动几位就是处以2的几次幂
        System.out.println(12 >> 1);
        System.out.println(12 >> 2);

        //*  最有效率的算出2 * 8的结果
        System.out.println(2 << 3);
    }
}

三元运算符

class test {
    public static void main(String[] args) {
        /*三元运算符的格式
            *(关系表达式) ? 表达式1 : 表达式2;
            为true表达式1,为false表达式2
        */
        int x = 10;
        int y = 5;
        int z;
        z = (x > y) ? x : y;
        System.out.println("z = " + z);
    }
}

键盘录入的基本格式

/*如何实现键盘录入呢?
    * 先照格式来。
    * a:导包
        * 格式:
            * import java.util.Scanner; 
        * 位置:
            * 在class上面。
    * b:创建键盘录入对象
        * 格式:
            * Scanner sc = new Scanner(System.in);
    * c:通过对象获取数据    
        * 格式:
            * int x = sc.nextInt();
*/
import java.util.Scanner;          //导入包中的类Scanner
class test {
    public static void main(String[] args) {
        //录入两个整数
        Scanner sc = new Scanner(System.in);     //创建键盘录入对象
        System.out.println("请输入第一个整数:");
        int x = sc.nextInt();                    //将键盘录入的数据储存在x中
        System.out.println(x);

        System.out.println("请输入第二个整数:");
        int y = sc.nextInt();                    //将键盘录入的数据储存在y中
        System.out.println(y);
    }
}

顺序结构语句

选择结构if语句格式1及其使用

        if(比较表达式) {
            语句体;
        }

选择结构if语句注意事项

选择结构if语句格式2及其使用

        if(比较表达式) {
            语句体1;
        }else {
            语句体2;
        }

if语句的格式2和三元的相互转换问题

选择结构if语句格式3

        if(比较表达式1) {
            语句体1;
        }else if(比较表达式2) {
            语句体2;
        }else if(比较表达式3) {
            语句体3;
        }
        ...
        else {
            语句体n+1;
        }
import java.util.Scanner;
class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数:");
        int x = sc.nextInt();
        int y; 
        if (x >= 3) {
            y = 2 * x + 1;
        }else if (x > -1 && x < 3) {
            y = 2 * x;
        }else if (x <= -1) {             //else{  或者 else if{
            y = 2 * x - 1;
        }
        //要么初始化y,要么判断语句以else结尾(这样可以包含所有情况,即y总能被赋值)
        //即使程序逻辑上包含了所有的情况,判断语句最后是if的话,程序也会报错。
        System.out.println(y);
    }
}
class test {
    public static void main(String[] args) {
        int a = 40;
        int b = 50;
        int c =30;

        if (a > b) {
            if (a > c) {
                System.out.println(a + "是最大值");
            }else {
                System.out.println(c + "是最大值");
            }
        }else {
            if (b > c) {
                System.out.println(b + "是最大值");
            }else {
                System.out.println(c + "是最大值");
            }
        }
    }
}

选择结构switch语句的格式

        switch(表达式) {       //基本数据类型可以接收byte,short,char,int
              case 值1:        //引用数据类型可以接收枚举(JDK1.5)和String字符串(JDK1.7)
                语句体1;
                break;
                case 值2:
                语句体2;
                break;
                …
                default:    
                语句体n+1;
                break;
        }
class test {
    public static void main(String[] args) {
        String name = "123";
        String grade = "FG";
        switch (grade) {
        case "A":
            System.out.println(name  + "等级是" + grade);
            break;
        case "B":
            System.out.println(name  + "等级是" + grade);
            break;
        case "C":
            System.out.println(name  + "等级是" + grade);
            break;
        case "D":
            System.out.println(name  + "等级是" + grade);
            break;
        case "E":
            System.out.println(name  + "等级是" + grade);
            break;
        default:
            System.out.println("找不到等级");
            break;
        }
    }
}

选择结构switch语句的注意事项

循环结构概述和for语句的格式及其使用

        for(初始化表达式;条件表达式;循环后的操作表达式) {
            循环体;
        }
//需求:在控制台输出所有的”水仙花数”。所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
class Test3_Flower {
    public static void main(String[] args) {
        for (int i = 100;i <=999 ;i++ ) {
            int ge = i % 10;             //获取100到999之间的数
            int shi = i / 10 % 10;       //123 % 10
            int bai = i / 10 / 10 % 10;  //1 % 10

            if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
                System.out.println(i);
            }
        }       
    }
}

循环结构while语句的格式和基本使用

循环结构do...while语句的格式和基本使用

        do {
            循环体语句;
        }while(判断条件语句);
        
        完整格式;
        初始化语句;
        do {
            循环体语句;
            控制条件语句;
        }while(判断条件语句);

死循环

//九九乘法表
class Demo3_For99 {
    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' ); //'\t'和"\t"皆可以
            }
            System.out.println();
        }
        System.out.println("\"");   //转义双引号
        System.out.println('\'');    //转义双引号
        System.out.println('"');
        System.out.println("'");
    }
}

注意:
'\x' x表示任意,\是转义符号,这种做法叫转移字符。

    '\t'    tab键的位置
    '\r'    回车
    '\n'    换行
    '\"'
    '\''

控制跳转语句

class Demo3_Mark {
    public static void main(String[] args) {
        a: for (int i = 1;i <= 10 ;i++ ) {
            System.out.println("i = " + i);
            for (int j = 1;j <= 10 ;j++ ) {
                System.out.println("j = " + j);
                break a;
            }
        }
        System.out.println("Hello World!");
        System.out.println("大家好");
        http://www.heima.com
        //上一行表示的是一个叫http的标号和一个注释
        System.out.println("才是真的好");
    }
}
* 
        for(int x=1; x<=10; x++) {
            if(x%3==0) {
                //在此处填写代码
            }
            System.out.println(“Java基础班”);
        }
        
        //我想在控制台输出2次:“Java基础班“      break;
        //我想在控制台输出7次:“Java基础班“      continue;  
        //我想在控制台输出13次:“Java基础班“    System.out.println(“Java基础班”);

方法概述

        修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
            方法体语句;
            return 返回值; 
        } 
//方法的例子
class Demo2_Sum {
    public static void main(String[] args) {
        int sum = add(10,20); //1.调用add方法,将10和20分别传递给a和b
        System.out.println(sum);  //5.将方法的结果返回给sum
    }
    public static int add(int a,int b) {   //2.赋值a = 10,b = 20
        int sum = a +b;                    //3.执行语句把a和b相加赋值给sum
        return sum;                        //4.通过return将sum的结果返回
    }
}

方法的注意事项

import java.util.Scanner;
/*
 A:案例演示
    * 需求:根据键盘录入的行数和列数,在控制台输出星形
* B:方法调用:(无返回值,void)
    * 单独调用
    * 输出调用(错误)
    * 赋值调用(错误)
*/
class Demo3_method {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入行数");
        int row = sc.nextInt();
        System.out.println("请输入列数");
        int column = sc.nextInt();
        print(row, column);    //返回值是void方法只能单独调用
    }
    public static void print(int a, int b) {
        for (int i = 1;i <= a ;i++ ) {
            for (int j = 1;j <= b ;j++ ) {
                System.out.print("*");
            }
            System.out.println();
        }
        return ;                               //如果返回值类型是void,return可以省略,即使省略系统也会默认给加上,形式就是return;
    }
}

方法重载概述

A:方法重载概述
* 求和案例
* 2个整数
* 3个整数
* 4个整数

class Demo4_Overload {
    public static void main(String[] args) {
        double sum1 = add(10, 20);
        System.out.println(sum1);

        int sum2 = add(10, 20,30);
        System.out.println(sum2);

        double sum3 = add(12.3,13.4);
        System.out.println(sum3);

        double sum4 = add(10, 20.1);
        System.out.println(sum1);

        double sum5 = add(12.3,13);
        System.out.println(sum5);
    }
    public static double add(int a,int b) {
        System.out.println(1);
        return a + b;       
    }
    public static int add(int a,int b,int c) {
        System.out.println(2);
        return a + b + c;
    }
    public static double add(double a,double b) {
        System.out.println(3);
        return a + b;
    }
    public static double add(int a,double b) {
        System.out.println(4);
        return a + b;
    }
    public static double add(double a,int b) {
        System.out.println(5);
        return a + b;
    }
    
}

数组概述

为什么要有数组?为了储存同种数据类型的多个值

数组概念

数组定义格式

//数据类型[] 数组名 = new 数据类型[数组的长度];
        int[] arr = new int[5];  //可以存储五个int类型的数据

        /*
        左边:
        int:数据类型
        []:代表数组,几个中括号就代表几维数组
        arr:合法的标识符

        右边:
        new:创建新的实体或对象
        int:数据类型
        []:代表的数组
        5:代表数组的长度
        */

数组的初始化动态初始化

什么是数组的初始化?

如何对数组进行初始化

动态初始化的格式

//数据类型[] 数组名 = new 数据类型[数组的长度];
        int[] arr = new int[5];  //动态初始化,在内存中开辟连续的5块空间

动态初始化的默认初始值
整数类型:byte,short,int,long默认初始化都是0
浮点类型:float,double默认初始化值都是0.0
布尔类型:boolean默认初始化值false
字符类型:char默认初始化值'\u0000'
char在内存中占的两个字节,是16个二进制位
\u0000,每一个0其实代表的是16进制的0,那么四个0就是代表16个二进制位
打印数组输出是[I@19bb25a
[代表是数组,几个是代表几维
I代表是int类型
@是固定的
19bb25a代表的是十六进制的地址值

Java中的内存分配以及栈和堆的区别

栈:储存局部变量
局部变量:定义在方法声明上和方法中的变量
堆:储存new出来的数组或对象
方法区:面向对象部分讲解
本地方法区:和系统相关
寄存器:给CPU使用


栈和堆.jpg
一个数组内存图.png
两个数组内存图.png
三个引用两个数组.png

静态初始化

/*
* 静态初始化的格式:
    * 格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
    * 简化格式:数据类型[] 数组名 = {元素1,元素2,...};
*/
class Demo6_Array {
    public static void main(String[] args) {
        //int[] arr = new int[5]{11,22,33,44,55};  //不允许动静结合
        //int[] arr2 = {11,22,33,44,55};           //静态初始化的简写形式
        
        int[] arr;               //声明数组引用
        arr = new int[]{11,22,33,44,55};

        int[] arr2;
        arr2 = {11,22,33,44,55};  //这样会报错,简写形式声明和赋值在同一行
    }
}
数组的静态初始化.png

越界和空指针

/*
a:ArrayIndexOutOfBoundsException:数组索引越界异常
    原因:你访问了不存在的索引。
b:NullPointerException:空指针异常
    原因:数组已经不在指向堆内存了。而你还用数组名区访问元素
    int[] arr = {1,2,3};
    arr = null;
    System.out.println(arr[0]);
*/
class Demo7_Exception {
    public static void main(String[] args) {
        int[] arr = new int[5];
        System.out.println(arr[-1]);    //当访问数组中不存在的索引,会出现索引越界异常

        arr = null;
        System.out.println(arr[0]);     //当数组引用赋值为null,再去调用数组中的元素就会出现空指针异常
    }
}

数组遍历

/*
数组遍历:就是依次输出数组中的每一个元素。
数组的属性:arr.length数组的长度
数组的最大索引:arr.length - 1
*/
class Demo8_Array {
    public static void main(String[] args) {
        int [] arr = {11,22,33,44,55};

        for (int i = 0;i < arr.length ;i++ ) {
            System.out.println(arr[i]);
        }

        //arr.length 代表的是数组的长度
        System.out.println(arr.length);
        int [] arr2 = {3,4,5};
        print(arr2);        
    }
    /*
        写一个方法,实现数组的遍历
        1,返回值类型void
        2, 参数列表int[] arr
        */  
    public static void print(int[] arr) {
            for (int i = 0;i < arr.length ;i++ ) {
                System.out.print(arr[i] + " ");
            }
        }
}

数组取最大值

/*
数组获取最值(获取数组中的最大值最小值)
*/
class Demo9_Array {
    public static void main(String[] args) {
        int[] arr = {33,11,22,99,44,55};
        int max = getMax(arr);
        System.out.println(max);
    }
    /*
    获取数组中的最大值
    1,返回值类型int
    2,参数列表int[] arr
    */

    public static int getMax(int[] arr) {
        int max = arr[0];
        for (int i = 1;i < arr.length ;i++ ) {
            if(max < arr[i]) {
                max = arr[i];
            }
        }
        return max;
    }
}

数组反转

//数组元素反转
class Demo10_Array {
    public static void main(String[] args) {
        int[] arr = {11,22,33,44,55};
        reverseArray(arr);
        print(arr);
    }

    /*
    数组元素反转
    1,明确返回值类型void
    2,明确参数列表int[] arr
    */

    public static void reverseArray(int[] arr) {
        for (int i = 0;i < arr.length / 2 ; i++) {
            int temp = arr[i];
            arr[i] = arr[arr.length-1-i];
            arr[arr.length-1-i] = temp;
        }
    }
    /*
    数组遍历
    1,明确返回值类型void
    2,明确参数列表int[] arr
    */

    public static void print(int[] arr) {
        for (int i = 0;i < arr.length ;i++ ) {
            System.out.print(arr[i] + " ");
        }
    }
}

数组查表法

/*
数组查表法(根据键盘录入的索引,查找对应星期)
*/
import java.util.Scanner;
class Demo11_Array {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入对应的星期范围在1-7");
        int week = sc.nextInt();
        System.out.println("星期"+getWeek(week));
    }

    /*
    根据索引返回对应的星期
    1,返回值类型char
    2,参数列表int week
    */

    public static char getWeek(int week) {
        char[] arr = {'一','二','三','四','五','六','日'};   //定义了一张星期表
        return arr[week-1];                                  //通过索引获取表中元素
    }   
}

返回索引

//查找指定元素第一次在数组中出现的索引
class Demo12_Array {
    public static void main(String[] args) {
        int[] arr = {11,22,33,44,55,66,77};
        int index = getIndex(arr,66);
        System.out.println(index);
    }
    /*
    查找元素索引
    1,返回值类型int
    2,明确参数列表,int[] arr,int value
    */
    public static int getIndex(int[] arr,int value) {
        for (int i = 0;i < arr.length ;i++ ) {
            if (arr[i] == value) {
                return i;
            }
            //如果将return -1移到这里会报错,因为如果不满足for的条件将没有返回值
        }
        return -1;
    }
}

二维数组概述

/*
二维数组格式1 int[][] arr = new int[3][2];
注意事项
    以下格式也可以表示二维数组
        1:数据类型 数组名[][] = new 数据类型[m][n];
        2:数据类型[] 数组名[] = new 数据类型[m][n];
    注意下面定义的区别
        int x;
        int y;
        int x,y;
        int[] x;
        int[] y[];

        int[] x,y[];    x是一维数组,y是二维数组,这里的int[]是一个整体
        上一行等效于 int[] x; int[]y[];
*/
class test {
    public static void main(String[] args) {
        int[][] arr = new int[3][2];
        /*
        这是一个二维数组
        这个二维数组中有3个一维数组
        每个一维数组中有2个元素
        */
        //也可以这样写
        //int[] arr[] = new int[3][2];
        //int arr[][] = new int[3][2];
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[0][0]);

    }
}
/*输出结果
[[I@1774b9b  
[I@104c575
0
*/
二维数组内存图1.png
二维数组内存图2.png
class test {
    public static void main(String[] args) {
        int[][] arr = new int[3][];  //这是一个二维数组,这个二维数组中有三个一维数组。三个一维数组都没有被赋值
        System.out.println(arr[0]);  //默认初始值为null
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        arr[0] = new int[3];   //第一个一维数组中可以储存三个int值,这时候值由null变成一维数组的地址值
        arr[1] = new int[5];   //第一个一维数组中可以储存五个int值
    }
}
二维数组内存图3.png
class test {
    public static void main(String[] args) {
        int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};  //这是一个二维数组,这个二维数组中每个大括号都代表一个一维数组
        System.out.println(arr);  //[[I@1774b9b,二维数组的地址值
        System.out.println(arr[0]);//[I@104c575,一维数组的地址值
        System.out.println(arr[0][0]);//输出为一维数组的元素值
    }
}

二维数组遍历

class test {
    public static void main(String[] args) {
        int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};

        for (int i = 0;i < arr.length ;i++ ) {
            for (int j = 0;j <arr[i].length ;j++ ) {
                System.out.println(arr[i][j]);
            }
        }
    }
}

基本数据类型的值传递

基本数据类型的值传递.png

基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失。

引用数据类型的值传递

引用数据类型的值传递.png

引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问
Java中到底是传值还是传址?
java中只有传值,因为地址值也是值(java之父)

面向对象思想概述

类与对象概述

学生类的定义

class Demo1_Student {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

class Student {
    String name;
    int age;
    String gender;
    public void study() {
        System.out.println("学生学习");
    }
    public void sleep() {
        System.out.println("学生睡觉");
    }

}

学生类的使用

class Demo1_Student {
    public static void main(String[] args) {
        //对象名:其实就是合法的标识符,如果是一个单词所有字母小写,如果是多个单词,从第二个单词开始首字母大写
        Student s = new Student();
        s.name = "张三";
        s.age = 23;
        System.out.println(s.name + "..." + s.age);
        s.study();
        s.sleep();
    }
}

class Student {
    String name;
    int age;
    String gender;
    public void study() {
        System.out.println("学生学习");
    }
    public void sleep() {
        System.out.println("学生睡觉");
    }

}

一个对象的内存图

class Demo1_Car {
    public static void main(String[] args) {
        Car c1 = new Car();

        c1.color = "red";
        c1.num = 8;
        c1.run();
    }
}
class Car {
    String color;
    int num;

    public void run() {
        System.out.println(color + "..." + num);
    }
}
一个对象的内存图.png

两个对象的内存图

class Demo1_Car {
    public static void main(String[] args) {
        Car c1 = new Car();

        c1.color = "red";
        c1.num = 8;
        c1.run();

        Car c2 = new Car();
        c2.color = "black";
        c2.num = 4;
        c2.run();
        c2 = null;   //用null把原来的地址值覆盖掉了
        c2.run();    //c2里面记录的是null,所以报出空指针异常
    }
}
class Car {
    String color;
    int num;

    public void run() {
        System.out.println(color + "..." + num);
    }
}
两个对象的内存图.png

三个引用两个对象的内存图

class Demo1_Car {
    public static void main(String[] args) {
        Car c1 = new Car();

        c1.color = "red";
        c1.num = 8;
        c1.run();

        Car c2 = new Car();
        c2.color = "black";
        c2.num = 4;
        c2.run();
        Car c3 = c2;
        c3.run();
    }
}
class Car {
    String color;
    int num;

    public void run() {
        System.out.println(color + "..." + num);
    }
}
三个引用两个对象内存图.png

成员变量和局部变量的区别

方法的形式参数是类名的时候如何调用

class Demo1_Student1 {
    public static void main(String[] args) {
        print(10);
                //print(new Student())
        Student s = new Student();    //创建对象,并将对象的地址值赋值给s
        print(s);
    }

    public static void print(int x) {   //基本数据类型当作形式参数
        System.out.println(x);
    }

    public static void print(Student stu) {
        stu.name = "张三";
        stu.age = 23;
        stu.speak();
    }
}

class Student {
    String name;       
    int age;

    public void speak() {
        System.out.println(name + "..." + age);
    }
}

匿名对象的概述和应用

class Demo2_Car {
    public static void main(String[] args) {
        Car c1 = new Car();            //创建有名字的对象
        c1.run();
        c1.run();
        new Car().run();               //匿名对象调用方法
        new Car().run();               //匿名对象只适合对方法的一次调用,因为调用多次就会产生多个对象,不如用有名字的对象

        //匿名对象是否可以调用属性并赋值?有什么意思?
        //匿名对象可以调用属性,但是没有意义,因为调用后就变成垃圾
        //如果需要赋值还是用有名字的对象

        new Car().color = "red";
        new Car().num = 8;
        new Car().run();
    }
}

class Car {
    String color;
    int num;

    public void run() {
        System.out.println(color + "车运行" + num);
    }
}
匿名对象内存图.png
//匿名对象可以作为实际参数传递
class Demo2_Car {
    public static void main(String[] args) {
        method(new Car());
        method(new Car());
    }

    public static void method(Car cc) {
        cc.color = "red";
        cc.num = 8;
        cc.run();
    }
}

class Car {
    String color;
    int num;

    public void run() {
        System.out.println(color + "..." + num);
    }
}

封装的概述

private关键字的概述和特点

class Demo1_Person {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "张三";
        //p1.age = 17;
        //p1.speak();
        p1.setAge(17);
        
        System.out.println(p1.getAge());
    }
}

class Person {
    String name;
    private int age;
    
    public void setAge(int a) {
        if (a > 0 && a < 200) {   //做判断保证数据安全性
            age = a;
        }else {
            System.out.println("请回火星吧,地球不适合你");
        }
    }
    public int getAge() {
        return age;
    }
    public void speak() {
        System.out.println(name + "..." + age);
    }
}

this关键字的概述和应用

class Demo1_Person {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("张三");
        p1.setAge(24);
        System.out.println(p1.getName() + "..." +p1.getAge());

        Person p2 = new Person();
        p1.setName("李四");
        p1.setAge(23);
        System.out.println(p1.getName() + "..." +p1.getAge());
    }
}

class Person {
    private String name;
    private int age;
    
    public void setAge(int age) {
        if (age > 0 && age < 200) {   //做判断保证数据安全性
            this.age = age;
        }else {
            System.out.println("请回火星吧,地球不适合你");
        }
    }
    public int getAge() {
        return age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

手机类代码及其测试

class Demo2_Phone {
    public static void main(String[] args) {
        Phone p1 = new Phone();
        p1.setBrand("苹果");
        p1.setPrice(6000);
        System.out.println(p1.getBrand() + "价格" + p1.getPrice());
        p1.call();
        p1.sendMessage();
        p1.playGame();
    }
}

class Phone {
    private String brand;
    private int price;

    public void setBrand(String brand) {
        this.brand = brand;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public String getBrand() {
        return this.brand; //this.可以省略,你不加系统会默认给你加
    }
    public int getPrice() {
        return price;
    }
    public void call() {
        System.out.println("打电话");  
    }
    public void sendMessage() {
        System.out.println("发短信");  
    }
    public void playGame() {
        System.out.println("玩游戏");  
    }
}

构造方法Constructor概述和格式

class Demo1_Constructor {
    public static void main(String[] args) {
        Person p = new Person();    //在一创建对象的时候,系统就自动调用了构造方法
        //p.Person();               //构造方法不能对对象使用
        p.show();
    }
}

class Person {
    private String name;
    private int age;
    //构造方法
    public Person() {
        //System.out.println("Hello World!");   
        //return;      //构造方法也是有return语句的,格式是return;
        name = "张三";
        age = 23;
    }
    public void show() {
        System.out.println(name + "..." + age);
    }
}

构造方法的重载及注意事项

class Demo1_Constructor {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.show();
        Person p2 = new Person("张三",23);
        p2.show();
    }
}

class Person {
    private String name;
    private int age;
    public Person() {               //空参构造
        System.out.println("空参的构造");
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("有参的构造");
    }
    public void show() {
        System.out.println(name + "..." + age);
    }
}

给成员变量赋值的两种方式的区别

class Demo1_Constructor {
    public static void main(String[] args) {
        Person p1 = new Person("张三",23);
        //p1 = new Person("张天一",23); //这种方法看运行结果像改名了,但其实是一个新对象,原对象变成了垃圾。
        System.out.println(p1.getName() + "..." + p1.getAge());
        Person p2 = new Person();
        p2.setName("李四");
        p2.setAge(24);
        p2.setName("李鬼");   //对原对象改名
        System.out.println(p2.getName() + "..." + p2.getAge());
    }
}

class Person {
    private String name;
    private int age;
    public Person() {               //空参构造
        
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;    
    }
    public void setAge(int age) {
        this.age = age; 
    }
    public int getAge() {
        return age;
    }
}

手机类的代码及测试

class Demo5_Phone {
    public static void main(String[] args) {
        Phone p1 = new Phone("苹果",5000);
        p1.setBrand("三星");
        p1.setPrice(2000);
        p1.show();
    }
}

class Phone {
    private String brand;
    private int price;

    public Phone() {}

    public Phone(String brand,int price) {
        this.brand = brand;
        this.price = price;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getBrand() {
        return brand;
    }

    public int getPrice() {
        return price;
    }

    public void show() {
        System.out.println(brand + "的价格是" + price);
    }
}

创建一个对象的步骤

static关键字及内存图

创建对象内存图.png 静态内存图.png

static关键字的特点

static的注意事项

A:static的注意事项
* a:在静态方法中是没有this关键字的
* 如何理解呢?
* 静态是随着类的加载而加载,this是随着对象的创建而存在。
* 静态比对象先存在。
* b:静态方法只能访问静态的成员变量和静态的成员方法
* 静态方法:
* 成员变量:只能访问静态变量
* 成员方法:只能访问静态成员方法
* 非静态方法:
* 成员变量:可以是静态的,也可以是非静态的
* 成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
* 简单记:
* 静态只能访问静态。

class Demo2_Static {
    public static void main(String[] args) {
        Demo d = new Demo();
        d.print1();
        Demo.print2();
    }
}
class Demo {
    int num1 = 10;            //非静态的成员变量
    static int num2  = 20;    //静态的成员变量

    public void print1() {    //非静态的成员方法,既可以访问静态的成员也可以访问非静态的成员
        System.out.println(num1);
        System.out.println(num2);
    }
    public static void print2() {  //静态的成员方法
        System.out.println(num1);  //静态的成员方法不能访问非静态的,错误: 无法从静态上下文中引用非静态 变量 num1
        System.out.println(num2);
    }
}

静态变量和成员变量的区别

main方法的格式详细解释

工具类中使用静态

class ArrayTool {
    //如果一个类中所有的方法都是静态的,需要再多做一步,私有构造方法,目的是不让其他类创建本类对象
    //直接用类名.调用即可
    private ArrayTool(){}
    // 1,获取最大值
    public static int getMax(int[] arr) {
        int max = arr[0];
        for (int i = 1;i < arr.length ;i++ ) {
            if(max < arr[i]) {
                max = arr[i];
            }
        }
        return max;
    }
    // 2,数组的遍历
    public static void print(int[] arr) {
        for (int i = 0;i < arr.length ;i++ ) {
            System.out.print(arr[i] + " ");
        }
    }
    // 3,数组的反转
    public static void revArray(int[] arr) {
        for (int i =0;i <arr.length / 2 ;i++ ) {
            int temp = arr[i];
            arr[i] = arr[arr.length-i-1];
            arr[arr.length-i-1] = temp;
        }
    }

}
class Demo1_ArrayTool {
    public static void main(String[] args) {
        int [] arr = {33,11,22,66,55,44};
        /*ArrayTool at = new ArrayTool();
        int max = at.getMax(arr);
        System.out.println(max);
        at.print(arr);
        at.revArray(arr);
        at.print(arr);*/
        ArrayTool.print(arr);
    }
}

说明书的制作过程

学习Math类的随机数功能

代码块的概述和分类

class Demo1_Code {
    public static void main(String[] args) {
        {
            int x = 10;                 //限定变量的声明周期
            System.out.println(x);
        }
        Student s1 = new Student();

    }

    static {
        System.out.println("主方法中的静态代码块");  //静态代码块优先于主方法执行
    }
}

class Student {
    private String name;
    private int age;

    public Student() {} //空参构造

    public Student(String name,int age) {  //有参构造
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void study() {
        System.out.println("好好学习");
    }

    {                          //构造代码块:每创建一次对象就会执行一次,优先于构造函数执行
        study();
        System.out.println("构造代码块");    
    }

    static {                  //随着类的加载而加载,且只执行一次。
        System.out.println("我是静态代码块"); //作用:用来给类进行初始化,一般用来加载驱动
    }

}
上一篇下一篇

猜你喜欢

热点阅读