flyEn'blog

Java学习笔记之基础篇

查看JDK版本:java -version
查看java执行路径:which java
查看JAVA_HOME路径:echo $JAVA_HOME
插卡PATH内容:echo $PATH

(Ubuntu)
1.使用源安装

1
2
3
4
5
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default # 设java8为默认
如果你想安装Java 7(i.e Java 1.7),在上面的命令中用java7代替java8

如果是使用源方法安装的, 则默认的安装路径是在/usr/lib/jvm/java-8-oracle中, 则配置对应的JAVA_HOME即可

2.
jdk下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

https://www.w3cschool.cn/java/java-basic-syntax.html

  • 大小写敏感: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

Java修饰符

Java中主要有如下几种类型的变量

  • 局部变量
  • 类变量(静态变量)
  • 成员变量(非静态变量)

成员变量:以一个类class来描述事物,属性即对应类的成员变量,行为即类中的成员函数。
静态变量:static修饰的变量称为静态变量,其实质上就是全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象的特殊描述。

静态方法和实例方法的区别,例:
1.调用静态方法的示例

1
2
3
4
5
6
7
//-----------hasStaticMethod.java-----------------
public class hasStaticMethod{
//定义一个静态方法
public static void callMe(){
  System.out.println("This is a static method.");
}
}

调用:

1
2
3
4
5
6
7
8
//-----------invokeStaticMethod.java-----------------
public class invokeStaticMethod{
public static void main(String args[]){
hasStaticMethod.callMe(); //不创建对象,直接调用静态方法
hasStaticMethod oa = new hasStaticMethod(); //创建一个对象
oa.callMe(); //利用对象来调用静态方法
}
}

两次调用都可以,输出结果是:

1
This is a static method.This is a static method.

静态方法直接利用类调用,或者用对象调用都可以。

2.静态方法访问成员变量示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class accessMember{  
private static int sa; //定义一个静态成员变量
private int ia; //定义一个实例成员变量
//下面定义一个静态方法
static void statMethod(){
  int i = 0; //正确,可以有自己的局部变量
  sa = 10; //正确,静态方法可以使用静态变量
  otherStat(); //正确,可以调用静态方法
  ia = 20; //错误,不能使用实例变量
  insMethod(); //错误,不能调用实例方法
}
static void otherStat(){
...
}
//下面定义一个实例方法
void insMethod(){
  int i = 0; //正确,可以有自己的局部变量
  sa = 15; //正确,可以使用静态变量
  ia = 30; //正确,可以使用实例变量
  statMethod(); //正确,可以调用静态方法
}
}

结论:静态方法只能访问静态成员,实例方法可以访问静态和实例成员。

之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。main()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,所以它可以由系统在创建对象之前就调用。

Java数组

数组是储存在堆上的对象,可以保存多个同类型变量。在后面的章节中,我们将会学到如何声明、构造以及初始化一个数组。

Java枚举

Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。

不能继承,基本上可以讲enum看做一个常规的类。

  • 枚举值默认为从0开始的有序数值
  • 枚举可以添加方法(普通方法、静态方法、抽象方法、构造方法)
  • Java不允许使用=为枚举常量赋值(与C/C++语言中的enum不同)
  • 枚举可以实现接口

例:一个错误码枚举类型的定义
转自http://www.jianshu.com/p/6f2f5627c27d(作者:静默虚空)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public enum ErrorCodeEn {
OK(0, "成功"),
ERROR_A(100, "错误A"),
ERROR_B(200, "错误B");

// 构造方法:enum的构造方法只能被声明为private权限或不声明权限
ErrorCodeEn(int number, String description) {
this.code = number;
this.description = description;
}
private int code;
private String description;
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
public static void main(String args[]) { // 静态方法
for (ErrorCodeEn s : ErrorCodeEn.values()) {
System.out.println("code: " + s.getCode() + ", description: " + s.getDescription());
}
}
}

接口实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public interface INumberEnum {
int getCode();
String getDescription();
}

public enum ErrorCodeEn2 implements INumberEnum {
OK(0, "成功"),
ERROR_A(100, "错误A"),
ERROR_B(200, "错误B");

ErrorCodeEn2(int number, String description) {
this.code = number;
this.description = description;
}

private int code;
private String description;

@Override
public int getCode() {
return code;
}

@Override
public String getDescription() {
return description;
}
}

枚举声明的格式:如果枚举中没有定义方法,也可以在最后一个实例后面加逗号、分号或什么都不加。以下同等:

1
2
3
enum Color { RED, GREEN, BLUE }
enum Color { RED, GREEN, BLUE, }
enum Color { RED, GREEN, BLUE; }

关键字

abstract:抽象方法,抽象类的修饰符
assert:断言条件是否满足
boolean:布尔数据类型
break:跳出循环或者label代码段
byte:8-bit有符号数据类型
case:switch语句的一个条件
catch:和try搭配捕捉异常信息
char:16-bit Unicode字符数据类型
class:定义类
const:未使用
continue:不执行循环体剩余部分
default :switch语句中的默认分支
do:循环语句,循环体至少会执行一次
double:64-bit双精度浮点数
else:if条件不成立时执行的分支
enum:枚举类型
extends:表示一个类是另一个类的子类
final:表示一个值在初始化之后就不能再改变了,表示方法不能被重写,或者一个类不能有子类
finally:为了完成执行的代码而设计的,主要是为了程序的健壮性和完整性,无论有没有异常发生都执行代码。
float:32-bit单精度浮点数
for:for循环语句
goto:未使用
if:条件语句
implements:表示一个类实现了接口
import:导入类
instanceof:测试一个对象是否是某个类的实例
int:32位整型数
interface:接口,一种抽象的类型,仅有方法和常量的定义
long:64位整型数
native:表示方法用非java代码实现
new:分配新的类实例
package:一系列相关类组成一个包
private:表示私有字段,或者方法等,只能从类内部访问
protected:表示字段只能通过类或者其子类访问,子类或者在同一个包内的其他类
public:表示共有属性或者方法
return:方法返回值
short:16位数字
static:表示在类级别定义,所有实例共享的
strictfp:浮点数比较使用严格的规则
super:表示基类
switch:选择语句
synchronized:表示同一时间只能由一个线程访问的代码块
this:表示调用当前实例,或者调用另一个构造函数
throw:抛出异常
throws:定义方法可能抛出的异常
transient:修饰不要序列化的字段
try:表示代码块要做异常处理或者和finally配合表示是否抛出异常都执行finally中的代码
void:标记方法不返回任何值
volatile:标记字段可能会被多个线程同时访问,而不做同步
while:while循环

Java注释

1
2
3
4
5
6
7
8
9
10
11
public class MyFirstJavaProgram{
/* 这是第一个Java程序
*它将打印Hello World
* 这是一个多行注释的示例
*/
public static void main(String []args){
// 这是单行注释的示例
/* 这个也是单行注释的示例 */
System.out.println("Hello World");
}
}

继承

在Java中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。
利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(subclass)。

接口

在Java中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。
接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。

Fork me on GitHub