关于看了下书随便记下的内容
某种程度上是学过一轮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]=陈海清
*/