Java的笔记

一、基础

1、JDK(Java Development Kit,java开发工具包)

JDK = JRE + java的开发工具[java, javac, javadoc, javap等]

2、JRE(Java Runtime Environment,java运行环境)

JRE = JVM + java的核心类库

3、JVM(Java Virtual Machine,java虚拟机)

有windows、linux、mac的JVM

4、一个源文件中最多只能有一个public类,其他类个数不限,也可以将main方法写在非public类中,然后指定运行非public类,这样入口方法就是非public的main方法。如果源文件包含一个public类,则文件名必须按该类名命名。

//public class hello  表示hello是一个public共有的类
public class hello {
	//这是一个主方法,程序的入口
	public static void main(String[] args) {
		System.out.println("hello,world");
	}
}

//下面两个类中都有主方法,写在非public类中,编译javac hello.java时,会生成hello.class、Dog.class、Tiger.class三个字节码文件
//运行hello.class时,输出hello,world  
//运行Dog.class时,输出 小狗~

class Dog{
	public static void main(String[] args) {
		System.out.println("小狗~");
	}
}

class Tiger{
	public static void main(String[] args) {
		System.out.println("老虎~");
	}
}

5、tab往右缩进,shift+tab往左缩进

二、Java知识

+号运算:①当左右两边都是数值类型时,则做加法运算;②当有一边为字符串,则做拼接运算。

System.out.println(100+78);  //输出178
System.out.println("100"+78);   //输出10078
System.out.println(100+3+"hello");  //输出103hello
System.out.println("hello"+100+3);  //输出hello1003

1、数据类型

 

 注意:①string属于类,不属于数据类型

②声明long类型常量必须后加'l'或'L',如果不加,运行不会报错

int n1 = 1;
long n2 = 1L;

③浮点数 = 符号位 + 指数位 + 尾数位

④声明float类型必须后加'f'或'F',如果不加,运行会报错

⑤浮点数使用陷阱

double n1 =2.7;
double n2 = 8.1 / 3;
		
System.out.println(n1);  //输出2.7
System.out.println(n2);  //输出接近2.7的一个小数2.6999999999999997,而不是2.7
//当我们对运算结果时小数的进行判断相等时,可能会出错
if (n1 == n2) {
    System.out.println("相等1111");
}
//正确的写法:判断两个数的差值的绝对值,在某个精度范围内
if (Math.abs(n1 - n2) < 0.000001) {
    System.out.println("相等2222");
}

⑥字符类型可以直接存放一个数字, char c1 = 'b'; char c2 = 97; 97是a对应的ASCII,会输出a 

char c1 = '施';
char c2 = '\t';
char c4 = 56673;
System.out.println((int)c1);  //输出对应的unicode码 26045
System.out.println((int)c2);  //输出对应的unicode码 9
System.out.println(c4);  //输出?
		
//char类型是可以运算的
System.out.println('a' + 10);  //输出 107
System.out.println((int)c1 + '\t');  //输出26054

⑦布尔类型:不可以使用0或非0的整数代替false和true

2、字符编码表

①ASCII:用一个字节表示,有128个字符

②unicode:固定大小的编码,用两个字节表示,字母和汉字都是占用两个字节

③utf-8:大小可变的编码,字母使用1个字节,汉字使用3个字节

④gbk:可以表示汉字,范围广,字母使用1个字节,汉字2个字节

3、数据类型转换

3.1、自动类型转换

当java程序在进行赋值或运算时,精度小的类型自动转换位精度大的数据类型

数据类型按精度从小到大排序:

char -> int -> long -> float -> double

byte -> short -> int -> long -> float -> double

int a = 'c'; //char转换为Int
double b = 80; //int转为double

自动类型转换注意事项

①有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,再进行计算

int d0 = 2;
float d1 = d0 + 1.1;  //这种是错的,1.1是double类型,运算的结果不能赋给float
double d2 = d0 + 1.1; //这样写是对的
float d1 = d0 + 1.1F; //这样也可以

② byte / short与char不能相互自动转换,但三者之间可以计算,要先转换为int类型

char a = 'a';
byte b1 = 1;
int i1 = a + b1;
System.out.println(i1);  //输出98
		
short s = 1;
int i2 = b1 + s;
		
byte b2 = 1;
byte b3 = b1 + b2; //错误
int b3 = b1 + b2;

3.2、强制类型转换

将容量大的数据类型转换为容量小的数据类型

int i = (int)1.9;
System.out.println(i); //输出1

int j = 100;
byte b1 = (byte)j;
System.out.println(b1); //输出100

3.3、基本数据类型  转  String

int n1 = 100;
float f1 = 1.1f;
double d1 = 1.2;
boolean b1 = true;
String s1 = n1 + "";
String s2 = f1 + "";
String s3 = d1 + "";
String s4 = b1 + "";
System.out.println(s1 + " " + s2 + " " + s3 + " " + s4);  //输出100 1.1 1.2 true

3.4、String  转  基本数据类型

String s5 = "123";
int n1 = Integer.parseInt(s5);
double n2 = Double.parseDouble(s5);
boolean b = Boolean.parseBoolean("true");
System.out.println(n1 + " " + n2 + " " + b);  //输出123 123.0 true

 注意:判断两个字符串str1和str2是否相等,用str1.equals(str2); 返回布尔值.

4、运算符

4.1、算数运算符

①除号

System.out.println(10 / 4); 输出的是2,因为除号两边都是int类型,所有结果也是int,不可能是double

System.out.println(10.0 / 4); 输出是2.5,因为10.0是double类型

double d = 10 / 4;  d的值为2.0

②取模

公式 a % b = a -(int) a / b * b

-10 % 3 = -10 - (-10) / 3 * 3 = -10 - (-3) * 3 = -1

System.out.println(10 % 3);  输出1

System.out.println(-10 % 3); 输出-1

System.out.println(10 % -3);  输出1

System.out.println(-10 % -3);  输出-1

所以取模结果的正负与a的正负有关

System.out.println(-10.5 % 3);  -10.5 - (-10) / 3 * 3 = -10.5 + 3 * 3 = -1.5

③自增++

独立使用时:++i; i++;这两个语句都等价于 i = i + 1;

作为表达式使用时:int j = 8; k = ++j; 等价于j = j + 1; k = j; 结果是 k = 9, j = 9;

                                k = j++; 等价于k = j; j = j + 1; 结果是k = 8, j = 9

//作为表达式使用
int i =  1;
i = i++;   //系统会使用临时变量:(1)temp=i; (2) i=i+1; (3) i=temp;
System.out.println(i); //输出1
		
//独立使用
int j = 1;
j++;
System.out.println(j);  //输出2

4.2、关系运算符

4.3、逻辑运算符

 ①短路与、逻辑与的区别

短路与&&:如果第一个条件为false,后面的条件不再判断

逻辑与&:如果第一个条件为false,后面的条件还会判断

int a = 4;
int b = 9;
if (a < 1 && ++b < 50) {   //++b不执行
    System.out.println("执行11");
}
System.out.println(a + " " + b); //输出a=4, b=9

if (a < 1 & ++b < 50) {    //++b执行
    System.out.println("执行22");
}
System.out.println(a + " " + b); //输出a=4, b=10

②短路或 || :如果第一个条件为true,后面的条件不再判断

逻辑或 | :如果第一个条件为true,后面的条件还会判断

boolean x = true;
boolean y = false;
short z = 46;
if ((z++ == 46) && (y = true)) z++;   // z=46 -> 47 -> 48
if ((x = false) || (++z == 49)) z++;  // z=48 -> 49 -> 50
System.out.println("z=" + z);  //输出z=50

4.4、赋值运算符

 a += b;  等价于  a = a + b;

注意:复合赋值运算符会进行类型转换

byte g = 3; 
g = g + 2;  //错误,g是byte类型,1是int类型
g += 2;     //正确,等价于 g = (byte)(g + 2)
g++;   //正确,等价于 g = (byte)(g + 1)

4.5、三元运算符

int a = 10;
int b = 99;
int result = a > b ? a++ : b--;  //result = 99, a = 10, b = 98

4.6、运算符优先级

 单目运算符 > 算数运算符 > 位移运算符 > 比较 > 逻辑 > 三元 > 赋值

5、标识符命名

5.1、规则:(不遵守,会报错)

5.2、规范: (不遵守,不会报错)

5.3、关键字

5.4、保留字

 6、输入

import java.util.Scanner;  //引入包
Scanner scanner = new Scanner(System.in);  //创建Scanner对象
System.out.println("输入名字");
String name = scanner.next();  //接收用户输入
System.out.println("输入年龄");
int age = scanner.nextInt();

 注意:没有scanner.nextChar();方法,所以通过这个方法接收char字符:

char c = scanner.next().CharAt(0); //取字符串的第一个字符

7、进制

int n1 = 0b1010;  //二进制,以0b或0B开头
int n2 = 01010;   //八进制,以0开头
int n3 = 1010;    //十进制
int n4 = 0x1010;  //十六进制,以0x或0X开头
System.out.println("n1=" + n1 + "\tn2=" + n2 + "\tn3=" + n3 + "\tn4=" + n4);
//输出 n1=10	n2=520	n3=1010	n4=4112

7.1、其他进制  转 十进制

①二进制 -> 十进制

0b10101*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 8 + 0 + 2 + 0 = 10

②八进制 -> 十进制

02342*8^2 + 3*8^1 + 4*8^0 = 128 + 24 + 4 = 156

③十六进制 -> 十进制

0x23A2*16^2 + 3*16^1 + 10*16^0 = 512 + 48 + 10 = 570

System.out.println(0b110001100);  //2转10  输出396
System.out.println(02456);   //8转10  输出1326
System.out.println(0xa45);   //16转10  输出2629

7.2、十进制  转  其他进制

 ①十进制 —> 二进制

② 十进制 —> 八进制

 ③十进制—>十六进制

7.3、二进制  转  八进制

将二进制数每三位一组,转成对应的十进制数,按顺序拼接起来即可

0b11 010 101 = 03 2 5

7.4、二进制  转  十六进制

将二进制数每四位一组,转成对应的十进制数,按顺序拼接起来即可

0b11010101 = 0xD 5

7.5、八进制  转  二进制

将八进制每一位数,转成对应的一个3位的二进制数

0237 = 0b 010 011 111

7.6、十六进制  转  二进制

将十六进制每一位数,转成对应的一个4位的二进制数

0x23B = 0b 0010 0011 1011

8、原码、反码、补码

例子在位运算符里

9、位运算符

 注意:反码是符号位不变,其余取反;在两个数按位取反~操作中,符号位也要取反。

System.out.println(2&3);
//先求2和3的补码,正数的原码 = 反码 = 补码
//2的补码:  00000000 00000000 00000000 00000010 
//3的补码:  00000000 00000000 00000000 00000011
//补码按位&: 00000000 00000000 00000000 00000010 =>转换成原码并算出结果 为2

System.out.println(~-2);
// -2的原码: 10000000 00000000 00000000 00000010 
// -2的反码: 11111111 11111111 11111111 11111101
// -2的补码: 11111111 11111111 11111111 11111110
// 按位取反: 00000000 00000000 00000000 00000001 得到补码,然后转成原码,算出结果为1 

System.out.println(~2);
//2的补码: 00000000 00000000 00000000 00000010 
//按位取反:11111111 11111111 11111111 11111101  得到补码,这是负数,所以补码=>反码=>原码
//   反码: 11111111 11111111 11111111 11111100
//   原码: 10000000 00000000 00000000 00000011  结果为 -3

 注意:>>表示将数字除2;<<表示将数字乘2

System.out.println(1 >> 2); //0000 0001 => 0000 0000 本质上是 1 / 2 / 2 = 0
System.out.println(1 << 2); //0000 0001 => 0000 0100 本质上是 1 * 2 * 2 = 4
System.out.println(15 >> 3); // 15 / 2 / 2 / 2 = 1

三、程序控制结构

主要有三大流程控制语句:顺序控制、分支控制、循环控制

1、顺序控制

 2、分支控制

2.1、单分支

 2.2、双分支

 2.3、多分支

2.4、switch分支

细节:

 3、循环控制

3.1、for循环

细节:

 3.2、while循环

 3.3、do..while循环

//打印空心三角形
int floor =7;
for (int i = 0; i < floor; i++) {
    int n = 0, j = 0;
    for (; j < floor - 1 - i; j++) {
	    System.out.print(" ");
	}
	for (; n < 2 * i + 1; n ++) {
		if (n == 0 || n == 2*i || i == floor-1) {
			System.out.print("*");
		}
		else {
			System.out.print(" ");
		}
	}
	System.out.println();
}

4、break语句

出现在多层嵌套的语句中,break可以通过标签指明要终止的是哪一层语句

 

label1:
for (int i = 0; i < 4; i ++){
    label2:
    for (int j = 0; j < 5; j++){
        if (j == 2)
            break label1;
    System.out.println("j = " + j);
    }
}
//输出j = 0
//    j = 1

5、continue语句

也可以结合标签使用

6、return语句

使用在方法里,表示退出所在的方法;写在main方法里,退出程序

四、面向对象

1、类与对象

要创建一个People类,把猫所有的特性/属性(如:姓名,年龄,性别)提取出来,还有一些行为/方法(如:吃,跑),类是一种我们自定义的数据类型。对象是一个具体的实例(如:刘亦菲、汪苏泷等)。

// 1.先定义类
// 2.再创建对象,也可以说实例化一个对象或把类实例化

public class object1 {
	public static void main(String[] args) {
		//创建对象people1
        People people1 = new People();
        people1.name = "刘亦菲";
        people1.age = 30;
        people1.gender = '女';

        //创建第二个人people2
        People people2 = new People();
        people2.name = "汪苏泷";
        people2.age = 30;
        people2.gender = '男';

        //访问对象的属性
        System.out.println("第一个人的信息:" + people1.name + " " + people1.age + " " + people1.gender);
        //输出   第一个人的信息:刘亦菲 30 女
	}
}

//定义一个人类
class People{
    //属性 或成员变量 或字段
    String name;  //姓名
    int age;  //年龄
    char gender;  //性别    
}

对象内存布局:

2、方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值