Java学习笔记1

注释

注释概述:用于解释说明程序的文字
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类型
==号不能写成=号,一个是比较,一个是赋值。

逻辑运算符

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

  • &逻辑与:有false则false。
  • |逻辑或:有true则true。
  • ^逻辑异或:相同为false,不同为true。
  • !逻辑非:非false则true,非true则false。

&&和&的区别?

  • a:最终结果一样。
  • b:&&具有短路效果。左边是false,右边不执行。
  • c:&是无论左边是false还是true,右边都会执行。

||和|的区别?

  • a:最终结果一样。
  • b:||具有短路效果。左边是true,右边不执行。
  • c:|是无论左边是false还是true,右边都会执行。

位运算符

  • A:位运算符有哪些
    • &,|,^,~ ,>>,>>>,<<
  • &,|,^,~ 的用法
    • &:有0则0
    • |:有1则1
    • ^:相同则0,不同则1
    • ~:按位取反
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);
    }
}

顺序结构语句

  • A:什么是流程控制语句
    • 流程控制语句:可以控制程序的执行流程。
  • B:流程控制语句的分类
    • 顺序结构
    • 选择结构
    • 循环结构
  • C:顺序结构语句执行流程:
    • 从上往下,依次执行。

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

  • A:选择结构的分类
    • if语句
    • switch语句
  • B:if语句有几种格式
    • 格式1
    • 格式2
    • 格式3
  • C:if语句的格式1
        if(比较表达式) {
            语句体;
        }
  • D:执行流程:
    • 先计算比较表达式的值,看其返回值是true还是false。
    • 如果是true,就执行语句体;
    • 如果是false,就不执行语句体;

选择结构if语句注意事项

  • a:比较表达式无论简单还是复杂,结果必须是boolean类型
  • b:if语句控制的语句体如果是一条语句,大括号可以省略;
    * 如果是多条语句,就不能省略。建议永远不要省略。
  • c:一般来说:有左大括号就没有分号,有分号就没有左大括号

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

  • A:if语句的格式2
        if(比较表达式) {
            语句体1;
        }else {
            语句体2;
        }
  • B:执行流程:
    • 首先计算比较表达式的值,看其返回值是true还是false。
    • 如果是true,就执行语句体1;
    • 如果是false,就执行语句体2;
  • 注意事项:else后面是没有比较表达式的,只有if后面有。

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

  • A:案例演示
    • if语句和三元运算符完成同一个效果
  • B:案例演示
    • if语句和三元运算符的区别

    • 三元运算符实现的,都可以采用if语句实现。反之不成立。

    • 什么时候if语句实现不能用三元改进呢?

      • 当if语句控制的操作是一个输出语句的时候就不能。
      • 为什么呢?因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。

选择结构if语句格式3

  • A:if语句的格式3:
        if(比较表达式1) {
            语句体1;
        }else if(比较表达式2) {
            语句体2;
        }else if(比较表达式3) {
            语句体3;
        }
        ...
        else {
            语句体n+1;
        }
  • B:执行流程:
    • 首先计算比较表达式1看其返回值是true还是false,

    • 如果是true,就执行语句体1,if语句结束。

    • 如果是false,接着计算比较表达式2看其返回值是true还是false,

    • 如果是true,就执行语句体2,if语句结束。

    • 如果是false,接着计算比较表达式3看其返回值是true还是false,

    • 如果都是false,就执行语句体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语句的格式

  • A:switch语句的格式
        switch(表达式) {       //基本数据类型可以接收byte,short,char,int
              case 值1:        //引用数据类型可以接收枚举(JDK1.5)和String字符串(JDK1.7)
                语句体1;
                break;
                case 值2:
                语句体2;
                break;
                …
                default:    
                语句体n+1;
                break;
        }
  • B:switch语句的格式解释
  • C:面试题
    • byte可以作为switch的表达式吗?
    • long可以作为switch的表达式吗?
    • String可以作为switch的表达式吗?
  • C:执行流程
    • 先计算表达式的值
    • 然后和case后面的匹配,如果有就执行对应的语句,否则执行default控制的语句
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语句的注意事项

  • a:case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
  • b:default可以省略吗?
    • 可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
    • 特殊情况:
      • case就可以把值固定。
      • A,B,C,D
  • c:break可以省略吗?
    • 最后一个可以省略,其他最好不要省略
    • 会出现一个现象:case穿透。
    • 最终我们建议不要省略
  • d:default一定要在最后吗?
    • 不是,可以在任意位置。但是建议在最后。
  • e:switch语句的结束条件
    • a:遇到break就结束了
    • b:执行到switch的右大括号就结束了

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

  • A:循环结构的分类
    • for,while,do...while
  • B:循环结构for语句的格式:
        for(初始化表达式;条件表达式;循环后的操作表达式) {
            循环体;
        }
  • C执行流程:
    • a:执行初始化语句
    • b:执行判断条件语句,看其返回值是true还是false
      • 如果是true,就继续执行
      • 如果是false,就结束循环
    • c:执行循环体语句;
    • d:执行循环后的操作表达式
    • e:回到b继续。
  • 注意事项
    • a:判断条件语句无论简单还是复杂结果是boolean类型。
    • b:循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。
    • c:一般来说:有左大括号就没有分号,有分号就没有左大括号
//需求:在控制台输出所有的”水仙花数”。所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
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语句的格式和基本使用

  • A:循环结构while语句的格式:
  •   while循环的基本格式:
      while(判断条件语句) {
          循环体语句;
      }
      
      完整格式:
      
      初始化语句;
      while(判断条件语句) {
           循环体语句;
           控制条件语句;
      }
    
  • B:执行流程:
    • a:执行初始化语句
    • b:执行判断条件语句,看其返回值是true还是false
      • 如果是true,就继续执行
      • 如果是false,就结束循环
    • c:执行循环体语句;
    • d:执行控制条件语句
    • e:回到b继续。

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

  • A:循环结构do...while语句的格式:
        do {
            循环体语句;
        }while(判断条件语句);
        
        完整格式;
        初始化语句;
        do {
            循环体语句;
            控制条件语句;
        }while(判断条件语句);
  • B:执行流程:
    • a:执行初始化语句
    • b:执行循环体语句;
    • c:执行控制条件语句
    • d:执行判断条件语句,看其返回值是true还是false
      • 如果是true,就继续执行
      • 如果是false,就结束循环
    • e:回到b继续。

  • A:案例演示
    • 三种循环语句的区别:
    • do...while循环至少执行一次循环体。
    • 而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句。
  • B:案例演示
    • for循环和while循环的区别:
      • A:如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。不知道用谁就用for循环。因为变量及早的从内存中消失,可以提高内存的使用效率。(for语句执行后变量会被释放,不能再使用)(while语句执行后,初始化变量还可以继续使用)

死循环

  • A:一定要注意控制条件语句控制的那个变量的问题,不要弄丢了,否则就容易死循环。
  • B:两种最简单的死循环格式
    • while(true){...}
    • for(;;){...}
//九九乘法表
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'    换行
    '\"'
    '\''

控制跳转语句

  • break的使用场景
    • 只能在switch和循环中 (跳出循环)
  • continue的使用场景
    • 只能在循环中(终止本次循环,继续下次循环)
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基础班”);
  • A:return的作用
    • 返回
    • 其实它的作用不是结束循环的,而是结束方法的。
  • B:案例演示
    • return和break以及continue的区别?
    • return是结束方法
    • break是跳出循环
    • continue是终止本次循环继续下次循环

方法概述

  • A:为什么要有方法
    • 提高代码的复用性
  • B:什么是方法
    • 完成特定功能的代码块。
  • C:方法的格式
        修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
            方法体语句;
            return 返回值; 
        } 
  • D:方法的格式说明
    • 修饰符:目前就用 public static。后面我们再详细的讲解其他的修饰符。
    • 返回值类型:就是功能结果的数据类型。
    • 方法名:符合命名规则即可,方便我们的调用。
    • 参数:
      • 实际参数:就是实际参与运算的。
      • 形式参数;就是方法定义上的,用于接收实际参数的。
    • 参数类型:就是参数的数据类型
    • 参数名:就是变量名
    • 方法体语句:就是完成功能的代码。
    • return:结束方法的。
    • 返回值:就是功能的结果,由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的结果返回
    }
}

方法的注意事项

  • A:方法调用(有具体返回值)
    • a:单独调用,一般来说没有意义,所以不推荐。
    • b:输出调用,但是不够好。因为我们可能需要针对结果进行进一步的操作。
    • c:赋值调用,推荐方案。
  • B:案例演示
    • a:方法不调用不执行
    • b:方法与方法是平级关系,不能嵌套定义
    • c:方法定义的时候参数之间用逗号隔开
    • d:方法调用的时候不用传递数据类型
    • e:如果方法有明确的返回值,一定要有return带回一个值
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个整数

  • B:方法重载:
    • 在同一个类中,方法名相同,参数列表不同。与返回值类型无关。

    • 参数列表不同:

      • A:参数个数不同
      • B:参数类型不同
      • C:参数的顺序不同(算重载,但是在开发中不用)
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:代表数组的长度
        */

数组的初始化动态初始化

什么是数组的初始化?

  • 就是为数组开辟连续的内存空间,并为每个数组元素赋予值。

如何对数组进行初始化

  • 动态初始化: 只指定长度,由系统给出初始化值
    • 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之父)

面向对象思想概述

  • A:面向过程思想概述
    • 第一步
    • 第二步
  • B:面向对象思想概述
    • 找对象(第一步,第二步)
  • C:举例
    • 买煎饼果子
    • 洗衣服
  • D:面向对象思想特点
    • a:是一种更符合我们思想习惯的思想
    • b:可以将复杂的事情简单化
    • c:将我们从执行者变成了指挥者
      • 角色发生了转换
  • E:面向对象开发
    • 就是不断的创建对象,使用对象,指挥对象做事情。
  • F:面向对象设计
    • 其实就是在管理和维护对象之间的关系。
  • G:面向对象特征
    • 封装(encapsulation)
    • 继承(inheritance)
    • 多态(polymorphism)

类与对象概述

  • A:我们学习编程是为了什么
    • 为了把我们日常生活中实物用学习语言描述出来
  • B:我们如何描述现实世界事物
    • 属性 就是该事物的描述信息(事物身上的名词)
    • 行为 就是该事物能够做什么(事物身上的动词)
  • C:Java中最基本的单位是类,Java中用class描述事物也是如此
    • 成员变量 就是事物的属性
    • 成员方法 就是事物的行为
  • D:定义类其实就是定义类的成员(成员变量和成员方法)
    • a:成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
    • b:成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
  • E:类和对象的概念
    • a:类:是一组相关的属性和行为的集合
    • b:对象:是该类事物的具体体现
    • c:举例:
      • 类 学生
      • 对象 具体的某个学生就是一个对象

学生类的定义

  • A:学生事物
  • B:学生类
  • C:案例演示
    • 属性:姓名,年龄,性别
    • 行为:学习,睡觉
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("学生睡觉");
    }

}

学生类的使用

  • A:文件名问题
    • 在一个java文件中写两个类:一个基本的类,一个测试类。
    • 建议:文件名称和测试类名称一致。
  • B:如何使用对象?
    • 创建对象并使用
    • 格式:类名 对象名 = new 类名();
  • D:如何使用成员变量呢?
    • 对象名.变量名
  • E:如何使用成员方法呢?
    • 对象名.方法名(...)
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

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

  • A:在类中的位置不同

    • 成员变量:在类中方法外
    • 局部变量:在方法定义中或者方法声明上
  • B:在内存中的位置不同

    • 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
    • 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
  • C:生命周期不同

    • 成员变量:随着对象的创建而存在,随着对象的消失而消失
    • 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
  • D:初始化值不同

    • 成员变量:有默认初始化值
    • 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
  • 注意事项:

    • 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
    • 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
    • 引用数据类型变量包括哪些:数组,类,接口,枚举

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

  • A:方法的参数是类名public void print(Student s){};
    • 如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象,即传递的是地址值
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);
    }
}

匿名对象的概述和应用

  • A:什么是匿名对象
    • 没有名字的对象
  • B:匿名对象应用场景
    • a:调用方法,仅仅只调用一次的时候。
      • 那么,这种匿名调用有什么好处吗?
        • 节省代码
      • 注意:调用多次的时候,不适合。匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。
    • b:匿名对象可以作为实际参数传递
  • C:案例演示
    • 匿名对象应用场景
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);
    }
}

封装的概述

  • A:封装概述

    • 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
  • B:封装好处

    • 隐藏实现细节,提供公共的访问方式
    • 提高了代码的复用性
    • 提高安全性。
  • C:封装原则

    • 将不需要对外提供的内容都隐藏起来。
    • 把属性隐藏,提供公共方法对其访问。

private关键字的概述和特点

  • A:人类赋值年龄的问题
  • B:private关键字特点
    • a:是一个权限修饰符
    • b:可以修饰成员变量和成员方法
    • c:被其修饰的成员只能在本类中被访问
  • C:案例演示
    • 封装和private的应用:
    • A:把成员变量用private修饰
    • B:提供对应的getXxx()和setXxx()方法
    • 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关键字的概述和应用

  • A:this关键字特点
    • 代表当前对象的引用
  • B:案例演示
    • 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概述和格式

  • A:构造方法概述和作用
    • 给对象的数据(属性)进行初始化
  • B:构造方法格式特点
    • a:方法名与类名相同(大小也要与类名一致)
    • b:没有返回值类型,连void都没有,加上void会变成普通方法。
    • c:没有具体的返回值return;
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);
    }
}

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

  • A:案例演示
    • 构造方法的重载
    • 重载:方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表
  • B:构造方法注意事项
    • a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
    • b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
      • 注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
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);
    }
}

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

  • A:setXxx()方法
    • 修改属性值
  • B:构造方法
    • 给对象中属性进行初始化
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);
    }
}

创建一个对象的步骤

  • A:画图演示
    • 画图说明一个对象的创建过程做了哪些事情?
    • Student s = new Student();
    • 1,Student.class加载进内存
    • 2,声明一个Student类型引用s
    • 3,在堆内存创建对象,
    • 4,给对象中属性默认初始化值
    • 5,属性进行显示初始化
    • 6,构造方法进栈,对对象中的属性赋值,构造方法弹栈
    • 7,将对象的地址值赋值给s


      创建对象的步骤.png

static关键字及内存图

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

static关键字的特点

  • A:static关键字的特点
    • a:随着类的加载而加载
    • b:优先于对象存在
    • c:被类的所有对象共享
      • 举例:咱们班级的学生应该共用同一个班级编号。
      • 其实这个特点也是在告诉我们什么时候使用静态?
        • 如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
      • 举例:
        • 饮水机(用静态修饰)
        • 水杯(不能用静态修饰)
        • 共性用静态,特性用非静态
    • d:可以通过类名调用
      • 其实它本身也可以通过对象名调用。
      • 推荐使用类名调用。
      • 静态修饰的内容一般我们称其为:与类相关的,类成员

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);
    }
}

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

  • 静态变量也叫类变量 成员变量也叫对象变量
  • A:所属不同
    • 静态变量属于类,所以也称为为类变量
    • 成员变量属于对象,所以也称为实例变量(对象变量)
  • B:内存中位置不同
    • 静态变量存储于方法区的静态区
    • 成员变量存储于堆内存
  • C:内存出现时间不同
    • 静态变量随着类的加载而加载,随着类的消失而消失
    • 成员变量随着对象的创建而存在,随着对象的消失而消失
  • D:调用不同
    • 静态变量可以通过类名调用,也可以通过对象调用
    • 成员变量只能通过对 象名调用

main方法的格式详细解释

  • A:格式
    • public static void main(String[] args) {}
  • B:针对格式的解释
    • public 被jvm调用,访问权限足够大。
    • static 被jvm调用,不用创建对象,直接类名访问
    • void被jvm调用,不需要给jvm返回值
    • main 一个通用的名称,虽然不是关键字,但是被jvm识别
    • String[] args 以前用于接收键盘录入的,args是唯一可以改的东西,通过命令行键盘录入
  • C:演示案例
    • 通过args接收键盘例如数据

工具类中使用静态

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);
    }
}

说明书的制作过程

  • A:对工具类加入文档注释
  • B:通过javadoc命令生成说明书
    • @author(提取作者内容)
    • @version(提取版本内容)
    • javadoc -d 指定的文件目录 -author -version ArrayTool.java
    • @param 参数名称//形式参数的变量名称@return 函数运行完返回的数据

学习Math类的随机数功能

  • A:Math类概述
    • 类包含用于执行基本数学运算的方法
  • B:Math类特点
    • 由于Math类在java.lang包下,所以不需要导包。
    • 因为它的成员全部是静态的,所以私有了构造方法
  • D:我要获取一个1-100之间的随机数,肿么办?
    • int number = (int)(Math.random()*100)+1;


      Math.jpg

      猜数字游戏.jpg

代码块的概述和分类

  • A:代码块概述
    • 在Java中,使用{}括起来的代码被称为代码块。
  • B:代码块分类
    • 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。
  • C:常见代码块的应用
    • a:局部代码块
      • 在方法中出现;限定变量生命周期,及早释放,提高内存利用率
    • b:构造代码块 (初始化块)
      • 在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
    • c:静态代码块
      • 在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。
      • 一般用于加载驱动
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("我是静态代码块"); //作用:用来给类进行初始化,一般用来加载驱动
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,145评论 0 13
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,183评论 1 44
  • 我唯一知道的是,当时的自己很无助,无助得像一只被逼到墙角的麻雀,在潮湿而阴暗的角落,反刍过去几年的自己,倍感厌恶。...
    紫狸阅读 460评论 0 1
  • 命令设计以及格式 | comType | id (用来标记命令) | 表示命令类型, 剩下的不同命令格式不同 CR...
    lingnanlu阅读 636评论 0 0
  • 从网上找来一张黑白照片。试着用Snapseed进行上色处理。先看看最终效果,只是为了验证Snapseed软件的功能...
    我叫飞雪阅读 470评论 2 2