1 基础语法
// 说明:学习java笔记。根据学习资源(用到的学习资源在下面分享了)整理,有纰漏欢迎指正讨论。
// 此篇为基础语法。目录如下:
1.0 学习资源
Java基础知识学习网站:github
java基础知识项目网站:github项目网站
wc3school:wc3school java
Java知识字典(总结的很好的一文档,可当作字典查阅): 百度网盘链接,提取码:65nd
Java8实战书籍(基础知识只看前三章):百度网盘链接,提取码:dfuv
java帮助文档1.6:百度网盘链接 ,提取码:wwmi
(官方翻译,阅读通畅)
java帮助文档1.8:百度网盘链接,提取码:6dsj (jdk8 机翻)
视频(黑马):黑马全套java教程bilibili
1.1 基本规则
1.1.1 命名规则
-
大小写敏感
Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。
-
类名
对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
-
方法名
所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
-
源文件名
源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。
-
主方法入口
所有的Java 程序由**public static void main(String*[]* args)**方法开始执行。
-
标识符
Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。注意:
- 所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始
- 首字符之后可以是任何字符的组合
- 关键字不能用作标识符
- 标识符是大小写敏感的
- 合法标识符举例:age、$salary、_value、__1_value
- 非法标识符举例:123abc、-salary
1.1.2 源文件声明规则
-
源文件与类:
- 一个源文件只能有一个public类,且源文件名与该public类同名。(也可以没有)
- 一个源文件中可以有多个非public类。
- 原理:源文件中可以有多个类,每个类在编译的时候产生一个.class文件,它们是程序运行时候的数据来源,一个源文件为一个编译单元,java将public类作为每个编译单元的数据接口。只能有一个,且该public类名与源文件名称相同,不然不能处理存在多个类的java文件。也可以没有public类。
-
.java文件中的声明顺序
- 首行:如果类定义在某个包中,那么package语句应该在源文件的首行
- 引包:import语句在package语句和类定义之间
- 类定义
1.2 类、对象
一个java程序可以认为是一系列对象的集合,而这些对象通过彼此调用彼此的方法协同工作。本章讲述基础概念,其他类和对象相关知识在面向对象部分会有更深入的介绍。
1.2.1 概念:
**类:**类可以看作一个模板,描述一类对象的状态和行为
**对象:**对象是类的一个实例,有具体的状态和行为
1.2.2 对象的创建:
**构造方法:**构造方法是通过类在创建对象的时候,调用的方法。
- 构造方法与类同名。
- 每个类都有构造方法,如果没有显示地为类定义构造方法,java编译器会自动为该类提供默认构造方法
- 构造方法除了可以创建对象,还会对其进行初始化
- 构造方法其他细则:csdn Java中的构造方法
对象创建过程:
- 声明:声明一个对象,包括兑现名称和类型
- 实例化:使用关键字new创建一个对象
- 初始化:调用构造方法初始化对象
1.3 方法、变量、常量
**方法:**方法就是行为,一个类可以有很多的方法,逻辑运算、数据修改以及所有的动作都是在方法中完成的。
变量:
- 局部变量:方法、构造方法、语句块中定义的变量。(属于某方法)
- 成员变量:类中,方法体外的变量。(属于某对象)
- 静态变量:类中,方法体外中定义,static类型,为全局变量,所有对象所共享。(属于某类多有对象)
成员变量(实例变量) | 局部变量 | 静态变量(类变量 | |
---|---|---|---|
类中的位置 | 类中方法外 | 类中方法或代码块内 | 类中方法外,用static修饰 |
在内存中的位置 | 在对象被建立时,被实例化,在内存堆中 | 随着方法进入栈中 | 方法区 |
生命周期 | 与对象共存亡 | 随着方法调用而存在 | 与类共存亡 |
初始化 | 有默认初始值 | 无默认初始值,需要先定义,赋值后再使用 | 有默认初始值 |
常量:
常量是一个固定值。用final标志。为了便于识别,通常用大写字母表示常量。
1.4 修饰符
定义类、方法或者变量,通常放在语句最前端。主要分为以下两类:
1.4.1 访问修饰符
default
default即默认无修饰符。在同一个包内可见。
private
同一类内可见。功能是隐藏类的实现细节,保护类的数据。可通过类中的public方法访问。
public
对所有类可见。
protected
对同一包内的类∪所有的子类可见(包括不同包中的子孙类)
控制访问与继承:(此处详见面对对象编程中的继承小节)
- 父类中声明为public的方法在子类中也必须为public
- 父类中声明为protected的方法在子类中可为protected、public
1.4.2 非访问修饰符
static
- 静态变量:也称类变量。声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。静态变量也被称为类变量。局部变量不能被声明为static变量。
- 静态方法:独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
final
-
final类:不能陪继承,没有类能继承final类的任何特性。
-
final方法:不能被继承类重新定义
-
final变量:常量,不可修改。为了与变量进行区分,通常大写。
final double PI = 3.1415927;
·深入理解:csdn:java中的final与效率
abstract
-
抽象类:
-
抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
-
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
-
抽象类可以包含抽象方法和非抽象方法。
-
例子:
abstract class Caravan{ private double price; private String model; private String year; public abstract void goFast(); //抽象方法 public abstract void changeColor(); }
-
-
抽象方法:
-
抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。抽象方法不能被声明成 final 和 static。
-
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
-
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
-
抽象方法的声明以分号结尾,例如:public abstract sample();
-
例子:
public abstract class SuperClass{ abstract void m(); //抽象方法 } class SubClass extends SuperClass{ //实现抽象方法 void m(){ ......... } }
-
其他
synchronized 和 volatile 修饰符,主要用于线程的编程。
1.5 运算符
该小节对略去浅显易懂的知识,细则可查看:w3school/java
1.5.1 算数运算符
略
1.5.2 关系运算符
1.5.3 位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。假设a = 60,和b = 13;它们的二进制格式表示将如下:
/*
& 与
| 或
^ 异或
~ 补(反转)
<< 左移运算符
>> 右移运算符
>>> 右移补零运算符
*/
public class Test {
public static void main(String args[]) {
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
System.out.println("a & b = " + c );
c = a | b; /* 61 = 0011 1101 */
System.out.println("a | b = " + c );
c = a ^ b; /* 49 = 0011 0001 */
System.out.println("a ^ b = " + c );
c = ~a; /*-61 = 1100 0011 */
System.out.println("~a = " + c );
c = a << 2; /* 240 = 1111 0000 */ System.out.println("a << 2 = " + c ); c = a >> 2; /* 215 = 1111 */
System.out.println("a >> 2 = " + c );
c = a >>> 2; /* 215 = 0000 1111 */
System.out.println("a >>> 2 = " + c );
}
}
1.5.4 逻辑运算符
略
1.5.5 赋值运算符
左操作右的得数,赋给左
1.5.6 条件运算符(?:)
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
variable x = (expression) ? value if true : value if false
实例:
public class Test {
public static void main(String args[]){
int a , b;
a = 10;
// a的值是1吗? 如果是,b=20 如果不是,b=30
b = (a == 1) ? 20: 30;
System.out.println( "Value of b is : " + b );
// a的值是10吗? 如果是,b=20 如果不是,b=30
b = (a == 10) ? 20: 30;
System.out.println( "Value of b is : " + b );
}
}
1.5.7 instanceof 运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
使用格式如下:
( Object reference variable ) instanceof (class/interface type)
实例:
String name = 'James';
boolean result = name instanceof String; // 由于name是String类型,所以返回真
1.6 数据类型
java有两大数据类型:内置数据类型和引用数据类型。
- 内置数据类型即八种基本类型。
- 引用数据类型变量由类的构造函数创建。对象、数组、包装类型都属于引用数据类型。
本小节讲解八种基本数据类型和其对应的包装类型。对象和数组分别在别的小节讲述。
1.6.1 基本数据类型
八种基本数据类型如下:(其他详情查看网站:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
数据类型 | 所占字节 | bit | 取值范围 | 描述 | 默认值 | 例子 | 包装类 |
---|---|---|---|---|---|---|---|
byte | 1 | 8 | -128~127 | 0 | byte b = -50 | Byte | |
short | 2 | 16 | -32,768~32,767 | 0 | short s = 1000 | Short | |
int | 4 | 32 | -231~231-1 | 整型 | 0 | int a = 100000, | Integer |
long | 8 | 64 | -263~263-1 | 长整型 | 0L | long a = 100000L | Long |
float | 4 | 32 | 单精度32位浮点 | 0.0f | float f1 = 234.5f | Float | |
double | 8 | 64 | 双精度64位浮点 | 0.0d | double d1 = 123.4 | Double | |
char | 2 | 16 | 最小‘ \u0000’(即为0); 最大值是’\uffff’(即为65,535) | 字符 | char letter = ‘A’ | Character | |
boolean | ~ | ~ | ture or false | 布尔,大小不精确定义 | false | boolean one = true | Boolean |
1.6.2 包装类型
深入理解:csdn:java的基本类型和包装类型(写的很好)
将基本类型封装成对象的好处:可以在对象中定义更多的功能方法操作该数据
常用的操作:用于基本数据类型与字符串之间的转换。
对于包装类型的相关知识主要包括:获得该包装类型对象、装箱拆箱、类型转换方法、包装类型提供的常用方法、常用api。以上信息均可以通过java api帮助文档查看。此处以Integer包装类型为例,其他类型大同小异。
Integer
获得Integer对象
public class IntegerDome {
public static void main(String[] args) {
// public static Integer valueOf(int i); 返回表示指定的int值的Integer实例
Integer i1 = Integer.valueOf(100);
System.out.println(i1);
// public static Integer valueOf(String s); 返回一个保存指定值的Integer对象String
Integer i2= Integer.valueOf("100");
System.out.println(i2);
}
}
装箱和拆箱
- 装箱:把基本数据类型转化为对应的包装类类型
- 拆箱:把包装类类型转化为对应的基本数据类型
public class IntegerDome {
public static void main(String[] args) {
// 装箱 int变成Integer对象
int i5 = 500;
Integer i5integer = Integer.valueOf(i5);// 调用静态方法装箱
Integer i5integer2 = i5; // 自动装箱
System.out.println(i5integer2);
// 拆箱 Integer对象变成int
int i6 = i5integer.intValue(); //调用静态方法拆箱
if(i5integer != null){
int i7 = i5integer + 200; // 直接当成int来使用:自动拆箱
}
System.out.println(i7);
// 注:如果是Integer对象是null 不能自动拆箱。
}
}
常用方法
方法 | 说明 |
---|---|
Integer.compara(a,b) | 用来比较两个Integer对象或int类型数据。如果a>b,返回值为1,如果a<b,返回值为-1,如果a==b,返回值为0。 |
Integer.toBinaryString() | 将一个Integer对象或一个整型数据转换成二进制 |
… | … |
int 和 String 转换
public class IntegerDome {
public static void main(String[] args) {
// int 类型转换成 String 类型
int number = 100;
String s2 = String.valueOf(number);
System.out.println(s2);
// String类型转换成 int类型
String s = "520";
Integer i4 = Integer.paseint(s);
System.out.println(i4);
}
}
常用api:Math
Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
Math类的常用方法:
方法名 | 说明 |
---|---|
public static int abs(int a) | 返回int参数的绝对值 |
public static double ceil(double a) | 向上取整(返回大于等于参数的最小整数) |
public static double floor(double a) | 向下取整 |
public static int max(int a, int b) | 返回两个参数中大的整数 |
public static int round(float a) | 返回浮点数四舍五入后的整数结果 |
public static double pow(double a, double b) | 返回a 的b次幂 |
public static double random() | 返回double正值随机数,范围[0.0,1.0] |
调用方法举例:
int a = -4;
sout(math.abs(a)); //输出a的绝对值
1.7 数据结构和集合
Java中的数据结构有栈、队列、数组、链表等。这些底层数据结构由集合框架来实现。这两部分内容比较多,详见java中的数据结构与集合。
1.8 语句结构
语句结构一共有三种:
- 顺序语句
- 循环语句
- 分支语句
1.8.1 循环语句
while
int i = 0;
while(i<=19){
//代码语句
i++;
}
do…while
int i = 0;
do{
//代码语句
i++;
}while(i<=19)
for
for(int i = 0; i <= 19; i++){
//代码语句
}
增强型for循环
int [] a = {10, 20, 30, 40, 50};
for(int i : a){
// 代码语句
// i取遍数组中的每一个
}
break
break用在循环中,基于条件控制,终止循环体内容的执行,也就是说结束当前的整个循环
continue
continue用在循环中,基于条件控制,跳过某次循环体内容的执行,继续下一次执行
1.8.2 分支语句
if
略
switch
switch(grade)
{
case 'A' :
System.out.println("优秀");
break;
case 'B' :
//可以空
case 'C' :
System.out.println("良好");
break;
case 'D' :
System.out.println("及格");
//可以没有break
case 'F' :
System.out.println("你需要继续努力");
break;
default :
// default分支不需要有break
System.out.println("无效等级");
}
- 遇到break:退出switch,执行switch后面的语句。不是一定要有break
问号语句
表达式:
boolen-exp ? value1 : value2;【(条件表达式)?表达式1:表达式2;】
运算规则:
a:判断条件表达式(boolean-exp),返回的结果是一个布尔值; 、
b:如果“布尔表达式”的结果为true,那么运算结果为表达式1;
c:如果“布尔表达式”的结果为false,那么运算结果为表达式2;