前言

这算是个人笔记从廖雪峰哪里学来的,因为是初学所以会有很多错的。从2019年毕业以来我就发现在工作中,那些大型企业或政府用的都是java开发的web,php的非常少甚至几乎没有,其中的很多漏洞不明其意,所以我必须要赶紧学习java弥补我的短板,把那些漏洞都研究明白,学习java的第41天。



1、溢出不会报错,会返回一个错误的值,需要注意

int x = 2147483640;
int y = 15;
int sum = x + y;      // -2147483641


2、计算前会强制转换类型,字符少的转字符多,整形转浮点

long x = 2147483640;
int y = 15;
long sum = x + y;            // 2147483655


3、自增和自减,加号减号的位置不同,效果也可能会不同

public class Main {
    public static void main(String[] args) {
        int n = 1;

        n = n++;
        System.out.println(n); // n = 1

        n = ++n;
        System.out.println(n); // n = 2
    }
}


4、数据类型占用的字节和取值范围

// 整型类型:
byte             1个字节
short            2个字节
int              4个字节
long             8个字节  long型数值结尾需要加L如:9000000000000000000L

// 浮点数类型:
float            4个字节  float型数值结尾需要加上f后缀如:3.14f
double           8个字节

// 字符类型:
// 单引号是c字符(char)类型,
// 双引号是字符串
char            2个字节

// 布尔类型:
boolean         1个字节           只有true和false两个值
// 整型取值范围
byte:-128 ~ 127
short: -32768 ~ 32767
int: -2147483648 ~ 2147483647
long: -9223372036854775808 ~ 922337203685477580

// 浮点数类型:
float:2^23 = 8388608
double:2^52 = 4503599627370496

// 布尔取值范围:
boolean: 只有true和false两个值


5、三种注释

// 注释


/*
这是注释
blablabla...
这也是注释
*/


/**
 * 可以用来自动创建文档的注释
 * 
 * @auther liaoxuefeng
 */


6、定义变量

在Java中,变量必须先定义后使用

byte a
short b
int c
long d

int e = 1


7、三元表达式

Java还提供一个三元运算符b ? x : y,它根据第一个布尔表达式的结果,分别返回后续两个表达式之一的计算结果。xy的类型必须相同

public class Main {
    public static void main(String[] args) {
        int n = -100;
        int x = n >= 0 ? n : -n;
        System.out.println(x);
    }
}


8、字符类型

(1、Java在内存中总是使用Unicode表示字符,
一个英文字符和一个中文字符都用一个char类型表示,
它们都占用两个字节。要显示一个字符的Unicode编码,
只需将char类型直接赋值给int类型即可

(2 、用 + 连接字符串和其他数据类型,
会将其他数据类型先自动转型为字符串,再连接


9、Main

java要运行必须要有Main才行,Main的M必须是大写,文件名也是


10、数组

public class Main {
    public static void main(String[] args) {
        // 5位同学的成绩:
        int[] ns;
        ns = new int[] { 68, 79, 91, 85, 62 };
        System.out.println(ns.length); // 5
        ns = new int[] { 1, 2, 3 };
        System.out.println(ns.length); // 3
    }
}


11、输出

https://www.cnblogs.com/fglx/p/9974481.html

# 打印没有换行,只接收一个参数
System.out.print

# 打印并换行,只接收一个参数
System.out.println()

# 格式化输出
System.out.printf()

%d      格式化输出   十进制整数
%x      格式化输出   十六进制整数
%o      格式化输出   八进制整数
%f      格式化输出   浮点数
%e      格式化输出   科学计数法表示的浮点数
%s      格式化输出   字符串
%b      格式化输出   布尔型

# 对其输出
System.out.printf("%-10s","abc");    // 左对齐, %后面的-表示左对齐
System.out.printf("%10s","abc");     // 右对齐, 里面的数字是固定长度

# 整形的对其不够补0
System.out.printf("%08d",23);

# 浮点数的精准度
double d = 3.1415926;
System.out.printf("%.2f\n", d); // 显示两位小数3.14
System.out.printf("%.4f\n", d); // 显示4位小数3.1416


12、输出

https://www.cnblogs.com/kaml8/p/9853595.html

import java.util.Scanner;
public static void main(String [] args) { 
         Scanner sc = new Scanner(System.in); 
         System.out.println("请输入你的姓名:"); 
         String name = sc.nextLine(); 
         System.out.println("请输入你的年龄:"); 
         int age = sc.nextInt(); 
         System.out.println("请输入你的工资:"); 
         float salary = sc.nextFloat(); 
         System.out.println("你的信息如下:"); 
         System.out.println("姓名:"+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary); 
}


13、if判断

if 的代码块只有一行的话可以省略花括号,下面的第六行的 else if 同理。

浮点数不精准所以不要用等于来判断,用大小来判断。

public class Main {
    public static void main(String[] args) {
        int n = 70;
        if (n >= 90) {
            System.out.println("优秀");
        } else if (n >= 60) {
            System.out.println("及格了");
        } else {
            System.out.println("挂科了");
        }
        System.out.println("END");
    }
}

引用类型判断内容相等要使用equals(),equals是Object类里的一个函数,Object是所有类的父类。

public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1.equals(s2)) {
            System.out.println("s1 equals s2");
        } else {
            System.out.println("s1 not equals s2");
        }
    }
}

# 避免值为空时报错
public class Main {
    public static void main(String[] args) {
        String s1 = null;
        if (s1 != null && s1.equals("hello")) {
            System.out.println("hello");
        }
    }
}


14、for 循环

for (初始条件; 循环检测条件; 循环后更新计数器) {
    // 执行语句
}


15、switch、case 、default

case语句具有“穿透性”,不要漏写break

public class Main {
    public static void main(String[] args) {
        int option = 2;
        switch (option) {
        case 1:
            System.out.println("Selected 1");
            break;
        case 2:
        case 3:
            System.out.println("Selected 2, 3");
            break;
        default:
            System.out.println("Not selected");
            break;
        }
    }
}

switch语句还可以匹配字符串。字符串匹配时,是比较“内容相等”

public class Main {
    public static void main(String[] args) {
        String fruit = "apple";
        switch (fruit) {
        case "apple":
            System.out.println("Selected apple");
            break;
        case "pear":
            System.out.println("Selected pear");
            break;
        case "mango":
            System.out.println("Selected mango");
            break;
        default:
            System.out.println("No fruit selected");
            break;
        }
    }
}

Java 12有一种新的语法,不需要写break,还可以直接返回值

public class Main {
    public static void main(String[] args) {
        String fruit = "apple";
        int opt = switch (fruit) {
            case "apple" -> 1;
            case "pear", "mango" -> 2;
            default -> 0;
        }; // 注意赋值语句要以;结束
        System.out.println("opt = " + opt);
    }
}

如果需要复杂的语句,我们也可以写很多语句,放到{…}里,然后,用yield返回一个值作为switch语句的返回值

public class Main {
    public static void main(String[] args) {
        String fruit = "orange";
        int opt = switch (fruit) {
            case "apple" -> 1;
            case "pear", "mango" -> 2;
            default -> {
                int code = fruit.hashCode();
                yield code; // switch语句返回值
            }
        };
        System.out.println("opt = " + opt);
    }
}


16、数组

遍历数组,for each循环,直接迭代数组的每个元素,但是这种不一定是按顺序的

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 4, 9, 16, 25 };
        for (int n : ns) {
            System.out.println(n);
        }
    }
}

顺序遍历数组

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 4, 9, 16, 25 };
        for (int i=0; i<ns.length; i++) {
            int n = ns[i];
            System.out.println(n);
        }
    }
}

打印数组内容 Arrays.toString()

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 1, 2, 3, 5, 8 };
        System.out.println(Arrays.toString(ns));
    }
}


17、方法-可变参数

可变参数用 类型… 定义,可变参数相当于数组类型

public class kebiancanshu {

    public static void main(String[] args){
        Group g = new Group();
        g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
        g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
        g.setNames("Xiao Ming"); // 传入1个String
        g.setNames(); // 传入0个String
    }

}


class Group {
    private String[] names;

    public void setNames(String... names) {
        this.names = names;
    }
}


18、参数传递基础类型和引用类型

// 基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响。
// 引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。
// 双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。

https://baijiahao.baidu.com/s?id=1663876570082573222&wfr=spider&for=pc


19、构造函数

  • 构造函数名就是类名
  • 没有定义构造方法时,编译器会自动创建一个默认的无参数构造方法
  • 同时想带参数和不带参数的构造函数
class Person {

    public Person() {
    }

    public Person(String name, int age) {
    }

}
  • 可以在一个构造方法内部调用另一个构造方法,便于代码复用。
  • 定义多个构造方法,在通过new操作符调用的时候,编译器通过构造方法的参数数量、位置和类型自动区分
  • 构造函数引用同类中的其他构造函数
class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name) {
        this(name, 18); // 调用另一个构造方法Person(String, int)
    }

    public Person() {
        this("Unnamed"); // 调用另一个构造方法Person(String)
    }
}


20、方法重载

  • 方法名相同,但各自的参数不同,称为方法重载
class Hello {
    public void hello() {
        System.out.println("Hello, world!");
    }

    public void hello(String name) {
        System.out.println("Hello, " + name + "!");
    }

    public void hello(String name, int age) {
        if (age < 18) {
            System.out.println("Hi, " + name + "!");
        } else {
            System.out.println("Hello, " + name + "!");
        }
    }
}




0
最后修改日期:2020年8月29日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。