JavaSE基础学习

自己总结的一些常用的IDEA快捷键,有需要的拿走:
ctrl+shift+alt:多行操作
psvm:生成main()方法;
fori:生成for循环;
Ctrl+Alt+v:自动补齐返回值类型
ctrl+o:覆写方法
ctrl+i:实现接口中的方法
ctrl+shift+u:大小写转换
CTRL+SHIFT+Z:取消撤销
Alt+Insert:生成构造方法、getter、setter
ctrl+y:删除当前行
Ctrl+Shift+J:将选中的行合并成一行
ctrl+g:定位到某一行
Ctrl+Shitft+向下箭头:将光标所在的代码块向下整体移动
Ctrl+Shift+向上箭头:将光标所在的代码块向上整体移动
Alt+Shift+向下箭头:将行向下移动
Alt+Shift+向上箭头:将行向上移动
Ctrl+F:在当前文件中查找
Ctrl+R:替换字符串
Ctrl+Shift+F:在全局文件中查找字符串
Ctrl+Shift+R:在全局中替换字符串
Ctrl+Shift+Enter:自动补齐{}或者分号;
Shift+Enter:在当前行的下方开始新行
Ctrl+Alt+Enter:在当前行的上方插入新行
Ctrl+Delete:删除光标所在至单词结尾处的所有字符

注释

单行注释 //

多行注释/**/

文本注释/***/

标识符

*标识符是大小写敏感的

*标识符开头只能是大小写字母a-z A-Z、下划线_、美元$

*不能使用关键字作为变量名或方法名

*可以使用中文名和拼音,但是最好不要用

*String不是关键字,是类!!!

数据类型

java是强类型语言,所有变量必须先定义后才能使用

java数据类型分为两大类

八大基本数据类型 (很重要!!!)

*整数类型

byte 1字节 1B=8bit

short 2

int 4

long 8

*浮点类型

float 4字节

double 8字节

*字符类型

char 2字节

*boolean类型

true和false只占1个位 1 bit

引用数据类型

*类

*接口

*数组

拓展

*整数拓展:

进制: 二进制0b 十进制 八进制0 十六进制0x

//===================================================

*浮点数拓展:

float 有限 离散 舍入误差 大约 接近但并不等于

double

!最好避免完全使用浮点数进行比较!

银行业务表示? 钱 要使用BigDecimal 数学工具类 表示

//===================================================

*字符拓展:

所有的字符本质还是数字

编码 Unicode 表(97=a 65=A)

char c2='\u0061';
System.out.println(c2);
//输出的就是a

char c1='a';
System.out.println((int)c1);// 强制转化
//输出的就是 97

转义字符

\t 制表符

\n 换行

//===================================================

*布尔值扩展

  boolean flag =true;
    if (flag=true){}//新手
    if (flag){}//老手

类型转换

!运算中不同类型的数据先转换为同一类型,然后进行运算!

//强制类型转换 (类型)变量名 高–低

int b=128;
byte i=(byte) b;//内存溢出
System.out.println(b);
System.out.println(i);

/**输出 128
-128**/

//自动转换 低–高

int b=128;
double i= b;
System.out.println(b);
System.out.println(i);

/**输出
128
128.0**/

*注意点:

1.不能对布尔值进行转换

2.不能把对象类型转换为不相干的类型

3.把高容量转换为低容量用强制转换,反之可自动转换

4.转换的时候可能窜在内存溢出。或者精度问题!!!!!!!

int money = 10_0000_0000;
int year = 20;
int total = year*money;
System.out.println(total);
//输出-1474836480  内存溢出!!!!!!!

int money = 10_0000_0000;
long year = 20L;
long total = year*money;
System.out.println(total);
//输出20000000000

变量

*java变量是程序中最基本的存储单位,其元素包括变量名、变量类型和作用域。

  public class demo04 {
        //类变量 static
        static double salary =2500;
        // 属性:变量
        //实例变量: 从属于对象; 如果不自行初始化,这个类型的默认值 0 0.0
        //布尔值 :默认为false
        //除了基本类型,其余的默认值都为null;
        String name;
        int age;
        //main方法
        public static void main(String[] args) {
            //局部变量;
            int i=10;
            System.out.println(i);
            //变量类型 变量名字 == new Demo04();
            demo04 demo04=new demo04();
            System.out.println(demo04.age);
            System.out.println(demo04.name);
            //类变量 static
            System.out.println(salary);
    
        }
        //其他方法
        public void add(){
        }
    }

类成员变量:首字母小写和驼峰原则:mouthSalary

局部变量:首字母小写和驼峰原则

常量

final 常量名 = 值;

   //修饰符,不存在先后顺序
    static final double PI = 3.14;
    
    public static void main(String[] args) {
        System.out.println(PI);
    }
    //输出 3.14

常量名:一般使用大写字符和下划线。

类名:首字母大写和驼峰原则:Man, GoodMan

方法名:首字母小写和驼峰原则:run(), runRun()

运算符

优先级()

*算术运算符:+ - * / % ++ –

*赋值运算符: =

*关系运算符:> ,<, >=,<=,==,!=,instanceof

*逻辑运算符:&&,||,!

//以下了解

位运算符:&,|,^,~,>>,<<,>>>

条件运算符: ? ,:

扩展赋值运算符:+=,-=,*=,/=

关于++,-- :

   public class Demo04 {
        public static void main(String[] args) {
            //++ -- 自增,自减  一元运算符
            int a = 3;
            int b=a++;//a++ 输出 b=3 ,先给b赋值,后自增
            System.out.println(a);
            System.out.println(b);
            int c=++a;//++a 输出 c=5,a先自增,后给c赋值
            System.out.println(a);
            System.out.println(c);
        }
    }

    //Math类 求幂函数3^2:
    double pow = Math.pow(3,2);
    System.out.println(pow);

*逻辑运算

  //逻辑运算符
    public class Demo05 {
        public static void main(String[] args) {
            // 与and   或or   非 取反
            boolean a = true;
            boolean b = false;
    
            System.out.println("a && b: "+(a&&b));
            System.out.println("a || b: "+(a||b));
            System.out.println("! (a && b): "+!(a&&b));
            // 输出 false true true
    
            //短路运算
            int c = 4;
            boolean d = (c<3&&c++<4);
            System.out.println(d);
            System.out.println(c);
            //输出 false 4  说明与运算执行一次错误就停止
    
        }

*位运算

 public class Demo06 {
        public static void main(String[] args) {
            /*
            * A = 0011 1100
            * B = 0000 1101
            *
            * A&B = 0000 1100
            * A|B = 0011 1101
            * A^B = 0011 0001  相同为0,反之为1
            * ~B  = 1111 0010  取反
            *
            * 面试题: 2*8 = 16 2*2*2*2
            * << *2
            * >> /2
            * 效率极高
            *
            * 0000 0000 0
            * 0000 0001 1
            * 0000 1000 8
            * 0001 0000 16
            * */
            System.out.println(2<<3);
        }
    }
 public static void main(String[] args) {
        //扩展运算符
        int a = 10;
        int b = 20;
        a+=b;
        System.out.println(a);//输出30
    	int c = 10;
        int d = 20;
        //字符串连接符 +, String
        System.out.println(""+c+d);//输出 1020
    
        System.out.println(c+d+"");//输出30
    
    }

*三元运算符

  public static void main(String[] args) {
        // x ? y:z
        //如果x为true,则结果为y,否则结果为z
    
        int score = 80;
        String a = score<60?"不及格":"及格";//   必须掌握
        System.out.println(a);
        //输出 及格
    }

包机制

一般用公司域名倒置作为包名; com.baidu.www

JavaDoc

javadoc命令是用来生成自己API文档的。

参数信息

*author作者名

*version版本号

*since指明需要最早使用的jdk版本

*param参数名

*return返回值情况

*throws异常抛出情况

  package com.ml.base;
    /**
     * @author miaolin
     * @version 1.0
     * since 1.8
     */
    public class Doc {
        String name;
    
        /**
         * @author miaolin
         * @param name
         * @return
         * @throws Exception
         */
        public String test(String name) throws Exception{
            return name;
        }
    }

Scanner对象

*通过Scanner类获取用户的输入

next():

不能得到带有空格的字符串

public class Demo01 {
    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
       Scanner scanner = new Scanner(System.in);
        System.out.println("使用next方式接收:");
        //判断用户有没有输入字符串
        if (scanner.hasNext()){
            //使用next方式接收
            String str = scanner.next();
            System.out.println("输出的内容为:"+str);
        }
        //凡是属于IOl流的类如果不关闭会一直占用资源,要养成好习惯关闭
        scanner.close();
    }
}

nextLine():

可以获得空白

public class Demo02 {
    public static void main(String[] args) {
        // 从键盘接收数据
        Scanner scanner = new Scanner(System.in);

        System.out.println("使用nextline方式接收:");
        // 判断是否还有输入 *不判断也可以输出
        if(scanner.hasNextLine()){
            String str = scanner.nextLine();
            System.out.println("输出的内容为:"+str);
        }

        scanner.close();
    }
}

例题:

  package com.ml.scanner;
    
    import java.util.Scanner;
    
    public class Demo05 {
        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();
                sum = sum + x;
                m++;
            }
            System.out.println(m + "个数的和为" + sum);
            System.out.println(m + "个数的平均值为" + (sum/m));
    
        }
    }

自动补全左边语句 ctrl alt v

顺序结构

选择结构

if选择结构

*单选择:

public class ifDemo01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s =scanner.nextLine();
        //equals:判断字符串是否相等
        if(s.equals("Hello")){
            System.out.println(s);
        }
        System.out.println("End");

        scanner.close();
    }
}

*双选择:

public class IfDemo02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int s = scanner.nextInt();
        if(s>60){
            System.out.println("yes");
        }else {
            System.out.println("no");
        }

        scanner.close();
    }
}

*多选择:

public class IfDemo03 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int s = scanner.nextInt();

        if(s==100){
            System.out.println("best");
        }else if (s>=60 && s<100){
            System.out.println("a");
        }else if (s<60){
            System.out.println("b");
        }

        scanner.close();

switch多选择结构

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值被称为一个分支

  public class SwitchDemo01 {
        public static void main(String[] args) {
            char grade = 'C';
            switch (grade){
                case 'A':
                    System.out.println("优秀");
                    break;
                case 'B':
                    System.out.println("良好");
                    break;
                case 'C':
                    System.out.println("不及格");
                    break;
                default:
                    System.out.println("未知等级");
                    break;
            }
        }
    }

java7之后switch支持字符串比较

while循环

两个例子:

 public class WhileDemo01 {
        public static void main(String[] args) {
            //输出1-100
    
            int i = 0;
            while (i<100){
                i++;
                System.out.println(i);
            }
        }
    }

    public class WhileDemo02 {
        public static void main(String[] args) {
            int i = 0;
            int sum = 0;
            while (i<=100){
                sum = sum + i;
                i++;
            }
            System.out.println(sum);
        }
    }

DoWhile

在这里插入图片描述

public static void main(String[] args) {
        int i = 0;
        int sum = 0;
        do{
            sum = sum + i;
            i++;
        }while(i<=100);
        System.out.println(sum);
    }

For循环(重要)

在这里插入图片描述


```java
   public class ForDemo01 {
        public static void main(String[] args) {
            int a = 1;
            while (a<=100){
                System.out.println(a);
                a+=2;
            }
            System.out.println("while循环结束");
            for(int i=1;i<=100;i++)
            {
                System.out.println(i);
            }
            System.out.println("for循环结束");
        }
    }

增强for循环

在这里插入图片描述

public static void main(String[] args) {
        int[] numbers = {10,20,30,40};//定义一个数组

        //遍历数组的元素
        for(int x:numbers){
            System.out.println(x);
        }
    }

方法

在这里插入图片描述

   public class Demo01 {
        //main 方法
        public static void main(String[] args) {
    //        int sum = add(1,2);
    //        System.out.println(sum);
            test();
        }
        //加法
        public static int add(int a,int b){
            return a+b;
        }
        //定义一个打印三角形方法
        public static void test(){
            //打印三角形
            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();
            }
        }
       
    }

定义

在这里插入图片描述

调用

在这里插入图片描述

java都是值传递

值传递(pass by value):在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数;

引用传递(pass by reference):在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;

重载

在这里插入图片描述

命令行传参

 public class Demo03 {
        public static void main(String[] args) {
            //args.length 数组长度
            for (int i = 0; i < args.length; i++) {
                System.out.println("args["+i+"]:"+args[i]);
            }
        }
    }

可变参数

在这里插入图片描述

   public class Demo04 {
        public static void main(String[] args) {
    
            Demo04 demo04 = new Demo04();
            demo04.test(1);
    
        }
        public void test(int... i){
            System.out.println(i[0]);
        }
    }

递归⭐

在这里插入图片描述

计算器

   import java.util.Scanner;
    
    //计算器
    public class Demo07 {
        static Scanner scanner = new Scanner(System.in);
        public static void main(String[] args) {
            boolean flag = true;
            int i= 1;//判断次数
            while (flag){
                if (i==1){//第一次使用计算器
                    System.out.println("第一次使用计算器");
                    calculator();
                    System.out.println("=============我是一个分隔符===============");
                    i++;//次数+1
                }else {//非第一次使用计算器
                    System.out.print("继续使用计算机?(x:继续,y:停止)");
                    String next = scanner.next();
                    if (next.equals("x")) {//判断是否继续使用计算器
                        calculator();
                        System.out.println("=============我是一个分隔符===============");
                    } else if (next.equals("y")) {
                        flag = false;
                        System.out.println("停止使用计算器");
                    }
                }        }
            scanner.close();
        }
        public static void calculator(){
    
            System.out.print("请输入第一个数字:");
            double num1 = scanner.nextDouble();
    
            System.out.print("请输入运算符:");
            String ope = scanner.next();
    
            System.out.print("请输入第二个数字:");
            double num2 = scanner.nextDouble();
    
            switch (ope){
                case "+":
                    add(num1,num2);
                    break;
                case "-":
                    minus(num1,num2);
                    break;
                case "/":
                    division(num1,num2);
                    break;
                case "*":
                    mul(num1,num2);
                    break;
                default:
                    System.out.println("请输入合法的运算符 + ,- ,* ,/");
                    break;
    
            }
        }
        public static void add(double num1,double num2){
            double result = num1 + num2;
            System.out.println(num1 + "+" + num2 + "=" + result);
        }
        public static void minus(double num1,double num2){
            double result = num1 - num2;
            System.out.println(num1+"-"+num2+"="+result);
        }
        public static void division(double num1,double num2){
    
            if (num2==0){//判断分母num2为0
                System.out.println("分母num2不能为0");
                return;
            }else {
                double result = num1 / num2;
                System.out.println(num1 + "/" + num2 + "=" + result);
            }
        }
        public static void mul(double num1,double num2){
            double result = num1 * num2;
            System.out.println(num1+"*"+num2+"="+result);
        }
    
    }

数组

定义

在这里插入图片描述

声明创建

在这里插入图片描述

内存分析

在这里插入图片描述

三种初始化

在这里插入图片描述

四个基本特点

在这里插入图片描述

数组边界

在这里插入图片描述

多维数组

在这里插入图片描述

Arrays类

在这里插入图片描述

冒泡排序

在这里插入图片描述

稀疏数组(拓展)

在这里插入图片描述

 public class ArrayDemo08 {
        public static void main(String[] args) {
            //1.创建一个二维数组 11*11 0:没有棋子 1:黑棋 2:白棋
            int[][] array1 = new int[11][11];
            array1[1][2] = 1;
            array1[2][3] = 2;
            //输出原始的数组
            System.out.println("输出原始的数组");
            for (int[] ints : array1) {
                for (int anInt : ints) {
                    System.out.print(anInt+"\t");
                }
                System.out.println();
            }
            //转换为稀疏数组保存
            //获取有效值的个数
            int sum =0;
            for (int i = 0; i < 11; i++) {
                for (int j = 0; j < 11; j++) {
                    if(array1[i][j]!=0){
                        sum++;
                    }
                }
            }
            System.out.println("有效值的个数:"+sum);
            //2.创建一个稀疏数组的数组
            int[][] array2 = new int[sum+1][3];
            array2[0][0] = 11;
            array2[0][1] = 11;
            array2[0][2] = sum;
    
            //遍历二维数组,将非零的值,存放在稀疏数组
            int count = 0;
            for (int i = 0; i < array1.length; i++) {
                for (int j = 0; j < array1[i].length; j++) {
                    if(array1[i][j]!=0){
                        count++;
                        array2[count][0] = i;
                        array2[count][1] = j;
                        array2[count][2] = array1[i][j];
                    }
                }
            }
            //输出稀疏数组
            System.out.println("稀疏数组");
            for (int i = 0; i < array2.length; i++) {
                System.out.println(array2[i][0]+"\t"
                        +array2[i][1]+"\t"
                        +array2[i][2]+"\t");
            }
        }
    }

面向对象

面向过程&面向对象

在这里插入图片描述

在这里插入图片描述

回顾方法及加深

在这里插入图片描述

值传递和引用传递

值传递

  //值传递
    public class Demo04 {
        public static void main(String[] args) {
            int a =1;
            System.out.println(a);//1
            Demo04.change(a);
            System.out.println(a);//1
        }
    
        //返回值为空
        public static void change(int a){
            a = 10;
        }
    
    }

引用传递

  //引用传递:对象,本质还是值传递
    public class Demo05 {
        public static void main(String[] args) {
            Person person = new Person();
            System.out.println(person.name);//null
            Demo05.change(person);
            System.out.println(person.name);//ml
    
        }
        public static void change(Person person){
            person.name = "ml";
        }
    
    
    }
    class Person{
        String name;
    }

类与对象的关系

在这里插入图片描述

创建与初始化对象

在这里插入图片描述

Student b = new Student();// 类型 对象名 = new 类;

构造器

  public class Person {
    
        //一个类即使什么也不写,他也会存在一个方法。
        //现实的定义构造器
    
        String name;
    
        //构造器
        //1.使用new关键字,本质是在调用构造器
        //2.用来初始化值
        public Person(){
            this.name = "ml";
        }
    
        //有参构造:一旦定义了有参构造,无参就必须显示定义
        public Person(String name){
            this.name = name;
        }
    
    }

    public class Application {
    
        public static void main(String[] args) {
    
            //new 实例化了一个对象
            Person person = new Person();
    
            System.out.println(person.name);//输出结果是 ml
        }
    }

alt + insert 自动生成构造器

构造器:
1.和类名相同
2.没有返回值
作用:
1.new 本质在调用构造方法
2.初始化对象的值
注意点:
定义有参构造后,必须使用无参构造,显示定义的一个无参构造
快捷键:
Alt + Insert

创建对象内存分析

public class Pet {
    public String name;
    public int age;

    public void shout(){
        System.out.println("叫了一声");
    }
}
  public class Application {
        public static void main(String[] args) {
            Pet dog = new Pet();
            dog.name = "zsz";
            dog.age = 5;
            dog.shout();
            System.out.println(dog.name);
            System.out.println(dog.age);
    
            Pet cat = new Pet();
        }
    
    }

#

小结

在这里插入图片描述
在这里插入图片描述

java三大特征

封装

在这里插入图片描述

 //类  private:私有
    public class Student {
        private String name;//名字
        private int id;//学号
        private char sex;//性别
        private int age;
        //提供一些可以操作这个属性的方法
        //提供一些public的get、set方法
    
        //get 获得这个数据
        public String getName(){
            return this.name;
        }
        ///set 这个个数据设置值
        public void setName(String name){
            this.name = name;
        }
    
    
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            if (age>120 || age<0){
                this.age = 3;//不合法
            }else {
                this.age = age;
    
            }
        }
    }
/**
    1.提高程序的安全性,保护数据
    2.隐藏代码的细节
    3.统一接口
    4.系统可维护性增加了
  **/
public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();

        s1.setName("ml");
        System.out.println(s1.getName());
        s1.setAge(90);
        System.out.println(s1.getAge());
    }

}
Alt + Insert 自获生成get/set方法

继承

在这里插入图片描述

Super详解

代码见opp.demo05

super注意点:

1.super调用父类的构造方法,必须在构造方法的第一个!
2.super必须只能出现在子类的方法或者构造方法中!
3.super 和 this 不能同时调用构造方法!

VS this:

代表的对象不同:
    this:本身调用者这个对象
    super:代表父类对象的引用

前提:
    this:没有继承也可以使用
    super:只能在继承条件才可以使用

构造方法:
    this()::本类的构造
    suepr():父类的构造

方法重写

代码见opp.demo06

重写:需要有继承关系,子类重写父类的方法!
1、方法名必须相同
2、参数列表必须相同
3、修饰符:范围可以扩大但不能缩小 Public>Protected>Default>Private
4、抛出的异常范围可以被缩小,但不能扩大  ClassNotFoundException --> Exception(大)

重写:子类的方法必须和父类一直,方法体不同!

为什么要重写:
    父类的功能,子类不一定需要,或者不一定满足!
    Alt + Insert:override

多态

在这里插入图片描述

代码见opp.demo07

多态注意事项:
1.多态是方法的多态,属性没有多态
2.父类和子类,有联系,类型转换异常
3.存在条件:继承关系,方法需要重写,弗父类引用指向子类对象! Faher a = new Son();
    不能重写的方法:
    1.static 方法,属于类,不属于实例
    2.final 常量;
    3.private方法;

System.out.println(X instanceof Y);//可以用来检查是否是父子类型

类型转换

//类型之间的转换: 父  子
//子类转换为父类,可能丢失自己的本来的一些方法!
Person a = new Student();
((Student) a).go();//父转子,高转低

Student b = new Student();
Person person = b;//低转高

static关键字详解

代码见opp.demo08

执行速度:静态代码块>匿名代码块>构造方法
静态代码块只能执行一次

抽象类

代码见opp.demo09

在这里插入图片描述

//abstract 抽象类
public abstract class Action {

    //abstract 抽象方法,只有方法名字没有方法的实现!
    public abstract void doSomething();

    /**
     1.不能new一个抽象类,只能靠子类去实现它
     2.抽象类可以写普通方法
     3.抽象方法必须写在抽象类中
     **/
}
如果父类是抽象类,子类必须实现父类的所有方法! 除非子类也是抽象类new存在构造器吗?

接口

代码见opp.demo10

接口的本质是契约

在这里插入图片描述

作用:

1.约束
2.定义一些方法,让不同的人实现
3.接口不能被实例化,接口中没有构造方法
4.implements可以实现多个接口
5.必须重写接口中的方法

内部类

在这里插入图片描述

异常机制

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Error和Exception

在这里插入图片描述
在这里插入图片描述

异常处理机制

在这里插入图片描述

int a = 1;
int b = 0;

try {//try监控区域
    System.out.println(a/b);
}catch (ArithmeticException e){//catch(想要捕获的异常类型!) 捕获异常
    System.out.println("程序出现异常");
}finally {//finally 处理善后工作
    System.out.println("finally");
}
//finally 可以不要。 假设IO、资源需要关闭,用到finally

Ctrl + Alt +T //自动生成捕获异常代码

public static void main(String[] args) {
        new Test().test(1,0);

    }
    //假设方法中处理不了某个异常,可以再方法中主动抛出异常
    public void test(int a,int b) throws ArithmeticException{
        if(b==0){
            throw new ArithmeticException();//主动抛出异常,一般在方法中使用
        }
        System.out.println(a/b);
    }
}

自定义异常

代码见exception.demo02
在这里插入图片描述

在这里插入图片描述

多线程

在这里插入图片描述

Thread类

在这里插入图片描述

package com.lesson.demo01;

import javax.swing.*;

//创建县城方式一:继承Thread类,重写run()方法,调用start开启线程

//总结:注意线程开启不一定立即执行,由CPU调度执行
public class TestThread1 extends Thread{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("jjjjjjjjjjjjjjjjjjjj"+i);
        }
    }

    public static void main(String[] args) {
        //main线程,主线程

        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();
        //调用start()开启线程
        testThread1.start();

        for (int i = 0; i < 2000; i++) {
            System.out.println("mm"+i);
        }
    }
}

注解

com.annotation
在这里插入图片描述

package com.annotation;

//什么是注解
public class Test01 extends Object{
    //@Override 重写注解
    @Override
    public String toString(){
        return super.toString();
    }
}

在这里插入图片描述
在这里插入图片描述

//测试元注解
@MyAnnotation
public class Test02 {

}
//定义一个注解
//Target 表示我们的注解可以用在哪些地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})
//Retention 表示我们的注解在什么地方还有效
@Retention(value = RetentionPolicy.RUNTIME)    
//Documented 表示是否将我们的注解生成在JAVAdoc中
@Documented
//Inherited 子类可以继承父类的注解
@Inherited

@interface MyAnnotation{

在这里插入图片描述

 package com.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    //自定义注解
    public class Test03 {
        //注解可以显示赋值,如果没有默认值,我们必须给注解赋值
        @MyAnnotation2(name = "ml",age = 18)
        public void test(){
    
        }
        @MyAnnotation3("miaolin")
        public void test2(){
    
        }
    }
    
    @Target({ElementType.TYPE,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    
    @interface MyAnnotation2{
        //注解的参数:参数类型 + 参数名()
        String name() default "";
        int age() default 0;
        int id() default -1; //-1代表不存在
        String[] schools() default "山理工";
    }
    
    @Target({ElementType.TYPE,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    
    @interface MyAnnotation3{
       String value();
    }

反射

com.reflection 代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

   System.out.println(person.name);
    //方法1:通过对象获得
    Class c1 = person.getClass();
    System.out.println(c1.hashCode());
    //方法2: forname获得
    Class c2 = Class.forName("com.reflection.Student");
    System.out.println(c2.hashCode());
    //方式3:类名.class
    Class c3 = Student.class;
    System.out.println(c3.hashCode());

在这里插入图片描述

  package com.reflection;
    
    import java.lang.annotation.ElementType;
    
    //所有类型的Class
    public class Test04 {
        public static void main(String[] args) {
            Class c1 = Object.class;//类
            Class c2 = Comparable.class;//接口
            Class c3 = String[].class;//一维数组
            Class c4 = int[][].class;//二维数组
            Class c5 = Override.class;//注解
            Class c6 = ElementType.class;//枚举
            Class c7 = Integer.class;//基本数据类型
            Class c8 = void.class;//void
            Class c9 = Class.class;//Class
    
            System.out.println(c1);
            System.out.println(c2);
            System.out.println(c3);
            System.out.println(c4);
            System.out.println(c5);
            System.out.println(c6);
            System.out.println(c7);
            System.out.println(c8);
            System.out.println(c9);
    
            //只要元素类型和维度一样,就是同一个Class
            int[][] a = new int[10][10];
            int[][] b = new int[101][101];
            System.out.println(a.getClass().hashCode());
            System.out.println(b.getClass().hashCode());
    
        }
    }

1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  package com.reflection;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class Test08 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
            Class c1 = Class.forName("com.reflection.User");
    
            //获得类的名字
            System.out.println(c1.getName());//获取包名+类名
            System.out.println(c1.getSimpleName());//获取类名
    
            //获得类的属性
            System.out.println("=====================");
            Field[] fields = c1.getFields();//只能找到public属性
            fields = c1.getDeclaredFields();//找到全部属性
            for (Field field : fields) {
                System.out.println(field);
            }
            //获得指定属性的值
            Field name = c1.getDeclaredField("name");
            System.out.println(name);
    
            //获得类的方法
            System.out.println("========================");
            Method[] methods = c1.getMethods(); //获得本类及其父类的所有public方法
            for (Method method : methods) {
                System.out.println("正常的:"+method);
            }
            methods = c1.getDeclaredMethods();//获得本类的所有方法
    
            for (Method method : methods) {
                System.out.println("getDeclaredMethods"+method);
            }
    
    
        }
    
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值