关于看了下书随便记下的内容

某种程度上是学过一轮Java了,但是细节点总会有问题,所以打算看着书重新来过,敲一下代码,尽力不让IDEA帮我纠错...然后文档是对于书本的总结以及自己的一些思考吧...但愿有深刻的思考

教材:黑皮第10版

本篇内容为程序设计基础,下一篇是面向对象

第1章 计算机、程序与Java概述

任何一本程序设计的书的头不出意外就会讲讲历史,计算机组成的基础,语言的概念...关于计算机硬件,内存等基础概念就忽略不谈了

关于写Java的一些开发规范:可参考《阿里巴巴Java开发手册》

Java的语言规范和应用程序接口(API)定义了Java的标准

JDK是Java 语言的软件开发工具包,JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库,大多时候采用Java8


紧接着我们看向第一个Java程序Welcome.java

public class Welcome {
	public static void main(String[] args){
        System.out.println("Welcome to Java!");
    }
}

1.class定义了一个类,Java面向对象,至少一个类,类名开头大写,显然这个程序第一个类是Welcome类,这同时也是文件名

2.main定义主方法,程序入口

关于public ,static,println前面为啥是System.out之类的之后会了解,现在知道大概的格式即可

3.Java区分大小写...

4.名词的简单学习:注释,关键字...


关于一个Java文件怎么跑的,这里其实学完基础去看Java虚拟机,这里浅写一下,a.java文件是我们写的,我们用javac编译它生成a.class文件,里面是字节码,给java虚拟机用的,然后可以用java去运行a.class

java字节码可以在不同的操作系统跑

第2章 基本程序设计

首先由于整体看过一遍,所以整本书特别喜欢用圆形这个栗子...

学会操作:基本的格式(public class xxx psvm...),了解+既可以加法,也可以字符串拼接...

从控制台获取输入,这里我们想下我们怎么输出来着,System.out.println("hello");System.out是标准输出折本,而System.in就是输入设备了,我们用Scaaner类创建对象,读取System.in的输入

import java.util.Scanner//不考虑太多可以通配符java.util.*

public class Hello {
    public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
        double radius = input.nextdouble();
    }
}

同理还有nextByte() nextInt() nextFloat() 等读取数值的方法


学会标识符的命名规范(阿里手册里应该更为详细),学会变量声明,赋值...

常量定义:

final double PI = 3.14;
//final datatype NAME = value;

数值类型(存储大小范围不同):byte ,short,int,long,float,double,具体情况使用适合的类型

数学方法的使用类似Math.pow(a,b)求a的b次方,这些方法定义在Java API的Math类里

了解运算顺序问题,各类运算符(时间有多可以理解下位运算)

第3章 选择

boolean数据类型,值为true或者false

if-else if-else以及嵌套...的学习

switch的学习

形如y=(x>0)?1:-1条件表达式的学习(因为三个操作数,所以是三元操作符,Java中唯一的三元)

第4章 数学函数、字符和字符串

数学函数

做做学校题/算法题的话,数学函数确实经常用用,要用了习惯/搜一下就好了(三角函数类,指数函数类,取整,最值,绝对值,随机...)

Math.random()获取随机数


字符

char字符数据类型,单个字符

char letter='A'

字符串直接量在双引号中,字符直接量单引号,“a”是字符串,'a'是字符

字符的学习内容:

Unicode和ASCII码

转义字符

字符转数值型数据(Unicode码)

字符通过Unicode比大小

字符常用方法(判断数字,字母,大小写,返回大/小写)

字符串

String先知道,不是基本类型,是引用类型

String message = "Hello"

简单方法:length()返字符数,charAt(index)返回指定位置的字符,concat(s1)本字符串连接s1,trim()去两边空格...

注意,从控制台获取字符串用Scanner对象的next()方法

字符串的比较不可用> >= < <=,用==是判断是否为同一个对象,比较主要用对应方法

字符串取子串/单个字符有对应方法

数值型字符串可以转化为数字类型...

第5章 循环

几种格式:

//while循环
while(循环条件) {
	语句;
}
//do-while循环
do {
    语句;
} while(循环条件)
//for循环
for (初始; 循环继续条件; 迭代后操作) {
    语句;
}

第6章 方法

方法定义可重用的代码从而简化代码长度

System.out.println(),Math.random都是Java库定义好的,我们现在是要自定义方法,并学习相关知识

定义方法

关于void方法,不需要return,但是可以放return;终止

public static int max(int num1, int num2) {
    int res;
    if (num1 > num2)
    	res = num1;
   	else
        res = num2;
   	return res;
}
/*
修饰符 返回值类型 方法名(参数列表) {
	方法体
}
这里的修饰就是public static,具体的面向对象的时候深入分析修饰
返回int
...
*/

方法头里的是形式参数

方法名和参数列表一起成为方法签名

调用方法

依旧是刚才的max

int z = max(5,3);//这里5和3是实际参数

我们注意到,一个Java程序会有一个main方法,main方法是由Java虚拟机调用的

main的方法头恒定的

public static void main(String[] args)

关于调用深入理解就是去理解调用堆栈,下次一定

参数传递

学习时常见的是参数顺序匹配

调用带参数的方法时,实参的值传给形参整个过程是按值传递,如果实参是变量而不是直接量,则传值,变量不受影响

重载方法

同名不同方法,签名不同

上面讲过,方法名和参数列表一起成为方法签名

经典栗子就是刚才那个max(int num1, int num2),我们可以做一个也是max,然后里面是double的重载方法

不同的参数列表而不能基于不同修饰符或者返回类型

局部变量作用域

局部作用域:声明之始,知道包含该变量的块结束为止

第7章 一维数组

首先,Java数组和C、C++的数组有所区别(工作原理)

初始化

这里的数组一旦建立,大小固定,然后区分下声明,创建等的差别还有一些会报错的点

double[] mylist;//声明
double[] mylist2 = new double[10];//声明且创建
mylist2[0] = 5.6;//赋值
double[] mylist3 = {1,2,3.475,5};//初始化一个4大小的double数组,且赋初值,注意没有new

foreach

for (double e:mylist3) {
	System.out.println(e);
}//遍历整个数组,大概翻译为对mylist3的每个元素e进行{}内的操作

数组复制

int[] list1 = {1,2,3};
int[] list2 = {4,5,6};
list1 = list2;

以上代码是把list2的引用值给了list1,即list1和list2都指向了{4,5,6},然后list1原来的{1,2,3}就成为垃圾给回收了

正确的“复制”:

循环语句逐个复制元素

System类中的arraycopy方法

clone方法

数组传递给方法

我们知道,基本数据类型参数传递实参的值

而作为引用类型,会像一种“共享”,改变方法内的数组,方法外的数组也变化了

public class Test {
	public static void main(String[] args) {
		int x = 1;
		int[] y = new int[10];
		m(x, y);
		System.out.println(x);
		System.out.println(y[0]);
	}
	public static void m(int num, int[] nums) {
		num = 100;
		nums[0] = 22;
	}
}
//输出1和22,即数组内容改变了

方法返回数组

栗子:数组反转(效率另说)

public static int[] reverse(int[] list) {
	int[] res = new int[list.length];
	
	for(int i = 0, j = res.length - 1; i < list.length; ++i, --j) {
		res[j] = list[i];
	}
	return res;
}
/*
使用如下:
int[] list1 = {1,2,3};
int[] list2 = reverse(list1);
*/

可变长参数列表

public static void printMax(double... numbers){
}

Java会创建一个数组然后把参数传给他

查找与排序

左转算法(其实就是懒

Arrays类

java.util.Arrays里面包含常用的数组操作

java.util.Arrays.sort(array);//排序
java.util.Arrays.binarySearch(array, number);//二分查找
java.util.Arrays.equals(list1, list2);//内容等
java.util.Arrays.toString(array);//返回字符串,字符串代表数组所有元素

关于main(String[] args)

命令行参数

第8章 多维数组

想要提高数组的维数,只要在声明数组时将索引与中括号再加一组即可,所以三维数组的声明为int name[][][],而四维数组为 int name[][][][],以此类推...

通常也将二维数组看作是多维数组

以三维为例,三维数组有三个层次,可以将三维数组理解为一个一维数组,其内容的每个元素都是二维数组。依此类推,可以获取任意维数的数组

多维数组的声明、初始化和使用都与二维数组相似,因此这里不再进行具体说明

举个栗子

public static void main(String[] args) {
    String[][][] namelist = { { { "张阳", "李风", "陈飞" }, { "乐乐", "飞飞", "小曼" } },
            { { "Jack", "Kimi" }, { "Lucy", "Lily", "Rose" } }, { { "徐璐璐", "陈海" }, { "李丽丽", "陈海清" } } };
    for (int i = 0; i < namelist.length; i++) {
        for (int j = 0; j < namelist[i].length; j++) {
            for (int k = 0; k < namelist[i][j].length; k++) {
                System.out.println("namelist[" + i + "][" + j + "][" + k + "]=" + namelist[i][j][k]);
            }
        }
    }
}
/*
namelist[0][0][0]=张阳
namelist[0][0][1]=李风
namelist[0][0][2]=陈飞
namelist[0][1][0]=乐乐
namelist[0][1][1]=飞飞
namelist[0][1][2]=小曼
namelist[1][0][0]=Jack
namelist[1][0][1]=Kimi
namelist[1][1][0]=Lucy
namelist[1][1][1]=Lily
namelist[1][1][2]=Rose
namelist[2][0][0]=徐璐璐
namelist[2][0][1]=陈海
namelist[2][1][0]=李丽丽
namelist[2][1][1]=陈海清
*/