文章目录
- java学习笔记之(基础知识)
- java程序基本结构
- 变量和数据类型
- 变量
- 数据类型
- 数据类型转换
- 数据运算
- 整数运算
- 浮点运算
- 布尔运算
- 字符和字符串
- 数组类型
- 数组
- 遍历数组
- 数组排序
- 二维数组
- 命令行参数
java学习笔记之(基础知识)
java程序基本结构
程序的基本结构简单来说,我们要想运行起来一个程序,至少包含那几部分。以下面的向屏幕输出hello程序为例:
public class Hello {//主类:类的访问权限+类+类名
public static void main(String[] args) {//main方法(程序的固定执行入口):方法的访问权限+静态方法+返回类型+主方法名
// 向屏幕输出文本:
System.out.println("Hello, world!");
}
} // class定义结束
1)由于java是面向对象的语言,所以程序的基本单位是class(类),class是关键字,hello是class的名字(类名),public是访问修饰符,表示class是公开的。
不写public,也能正确编译,但是这个类将无法从命令行执行。
在class内部,可以定义若干方法(method):
2)一个Java源码只能定义一个public类型的class,并且class名称和文件名要完全一致;
3)方法是可执行的代码块,main方法()里有一个参数,参数类型是String[],参数名是args
变量和数据类型
变量
1)什么是变量?
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过 门牌号我们可以找到房间,而通过变量名可以访问到变量(值)。不同的变量,类型不同,占用的空间大小不同。
2)变量的类型
基本类型变量 和 引用类型变量
2)变量的使用:
变量=数据类型+变量名+值;
该区域的数据在同 一类型范围内不断变化。
数据类型
基本数据类型 和 引用数据类型
1)基本数据类型:CPU可以直接进行运算的类型。包括:整数、浮点、字符、布尔。
数据类型区别:所占用的存储空间大小不同。
计算机存储结构:计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit。它的二进制表示范围从00000000-11111111,换算成十进制是0-255。
浮点型(说明):
float f1 = 3.14f;//float型,需要加上f后缀。
float f2 = 3.14e38f; // 科学计数法表示的3.14x10^38
double d = 1.79e308;//直接写小数默认double型
double d2 = -1.79e308;
double d3 = 4.9e-324; // 科学计数法表示的4.9x10^-324
字符型(char说明):
字符类型char表示一个字符。Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符,都占两字节;
注意char类型使用单引号’,且仅有一个字符,要和双引号"的字符串类型区分开。
2)引用数据类型
类、接口、 数组 (除了基本数据类型,剩下的都是引用类型);
引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置;
引用类型的变量可以是空值null;
引用类型最常用的就是String字符串:String s = “hello”;
3)下图总结必背
数据类型转换
自动类型转换
强制类型转换
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符 ( ),但可能造成
精度降低或溢出。
数据运算
整数运算
自增/自减
int n = 3300;
n++; // 3301, 相当于 n = n + 1;
n--; // 3300, 相当于 n = n - 1;
int y = 100 + (++n); // 不要这么写
System.out.println(y);
注意++写在前面和后面计算结果是不同的,++n表示先加1再引用n,n++表示先引用n再加1。不建议把++运算混入到常规运算中,容易自己把自己搞懵了。
浮点运算
浮点数常常无法精确表示,并且浮点数的运算结果可能有误差;
double x = 1.0 / 10;
double y = 1 - 9.0 / 10;
// 观察x和y是否相等:
System.out.println(x);
System.out.println(y);
比较两个浮点数通常比较它们的差的绝对值是否小于一个特定值;
// 比较x和y是否相等,先计算其差的绝对值:
double r = Math.abs(x - y);
// 再判断绝对值是否足够小:
if (r < 0.00001) {
// 可以认为相等
} else {
// 不相等
}
整型和浮点型运算时,整型会自动提升为浮点型;
int n = 5;
double d = 1.2 + 24.0 / n; // 6.0
System.out.println(d);
可以将浮点型强制转为整型,但超出范围后将始终返回整型的最大值。
布尔运算
三元运算符
Java还提供一个三元运算符b ? x : y,它根据第一个布尔表达式的结果,分别返回后续两个表达式之一的计算结果。
(注意到三元运算b ? x : y会首先计算b,如果b为true,则只计算x,否则,只计算y。此外,x和y的类型必须相同,因为返回值不是boolean,而是x和y之一。)
字符和字符串
字符char:基本数据类型、 保存一个Unicode字符(2字节)、 单引号表示char c1 = ‘A’;
字符串String:引用类型 、 存储0个到任意个字符、 双引号"…“表示String s2 = “ABC”; // 包含3个字符
常见的转义字符
" 表示字符”
’ 表示字符’
\ 表示字符
\n 表示换行符
\r 表示回车符
\t 表示Tab
\u#### 表示一个Unicode编码的字符
例如:
String s = “ABC\n\u4e2d\u6587”; // 包含6个字符: A, B, C, 换行符, 中, 文
**字符串连接 **
1)字符串+字符串
String s1 = "Hello";
String s2 = "world";
String s = s1 + " " + s2 + "!";
System.out.println(s);
2)字符串+其他数据类型
将其他数据类型先自动转型为字符串,再连接。
int age = 25;
String s = "age is " + age;
System.out.println(s);
3)多行字符串拼接
String s = "first line \n"
+ "second line \n"
+ "end";
**字符串不可变性 **
String s = "hello";
System.out.println(s); // 显示 hello
s = "world";
System.out.println(s); // 显示 world
字符串s变了吗?其实变的不是字符串,而是变量s的“指向”。
执行String s = “hello”;时,JVM虚拟机先创建字符串"hello",然后,把字符串变量s指向它;
紧接着,执行s = “world”;时,JVM虚拟机先创建字符串"world",然后,把字符串变量s指向它;
引用类型的变量可以指向一个空值null
引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。例如:
String s1 = null; // s1是null
String s2; // 没有赋初值值,s2也是null
String s3 = s1; // s3也是null
String s4 = ""; // s4指向空字符串,不是null
注意要区分空值null和空字符串"",空字符串是一个有效的字符串对象,它不等于null。
数组类型
数组是同一数据类型的集合,数组一旦创建后,大小就不可变;
数组创建:
1.静态初始化(定义数组时直接指定初始化的元素): 数据类型[ ] 数组名 ={初始元素}
int[] ns = { 68, 79, 91, 85, 62 };
System.out.println(ns.length); // 编译器自动推算数组大小为5
2.动态初始化(创建一个容量确定的数组): 数组名=new 数据类型[大小];
// 5位同学的成绩:
int[] ns = new int[5];
int n = 5;
System.out.println(ns[n]); // 索引n不能超出范围
可以通过索引访问数组元素,但索引超出范围将报错;
数组元素可以是值类型(如int)或引用类型(如String),但数组本身是引用类型。
字符串数组:
如果数组元素不是基本类型,而是一个引用类型,那么,修改数组元素会有哪些不同;
字符串是引用类型,因此我们先定义一个字符串数组:
String[] names = {
"ABC", "XYZ", "zoo"
};
对names[1]进行赋值,例如names[1] = “cat”;,效果如下:
这里注意到原来names[1]指向的字符串"XYZ"并没有改变,仅仅是将names[1]的引用从指向"XYZ"改成了指向"cat",其结果是字符串"XYZ"再也无法通过names[1]访问到了。
数组
遍历数组
1.for循环遍历
int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i++) {
int n = ns[i];
System.out.println(n);
}
2.for each遍历
(数据类型 变量:数组名){
}
变量 n 直接拿到 ns数组 的元素,而不是索引。
输出变量n 即可输出数组的元素。
变量n的数据类型与数组的数据类型一致
public class Main {
public static void main(String[] args) {
String[] ns = { "banana", "apple", "pear" };//String ns
for(String n : ns){//String n
System.out.println(n);//输出n 代表输出每个元素
}
}
}
3.Java标准库提供了Arrays.toString(),快速打印
注意添加操作数组的工具类
函数参数为Arrays.toString(数组名ns)
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));
}
}
2.直接打印数组变量,得到的是数组在JVM中的引用地址:
int[] ns = { 1, 1, 2, 3, 5, 8 };
System.out.println(ns); // 类似 [I@7852e922
数组排序
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
Arrays.sort(ns);
System.out.println(Arrays.toString(ns));
}
}
二维数组
1.动态初始化
语法:类型[][] 数组名=new 类型[大小][大小];
int a[][]=new int[2][3]
2.静态初始化
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] ns = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
int[] arr0 = ns[0];
System.out.println(arr0.length); // 4
System.out.println(Arrays.toString( ns[0]));//[1, 2, 3, 4]
System.out.println(ns[0]);//一维数组 arr0 首地址:[I@d716361
}
}
命令行参数
Java程序的入口是main方法,而main方法可以接受一个命令行参数,它是一个String[]数组。
这个命令行参数由JVM接收用户输入并传给main方法:
public class Main {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}
更多推荐
【java学习笔记之(基础知识)】
发布评论