写在前面:
该学习笔记基于《Head First Java》一书,仅供个人参考备忘使用,可能会存在诸多问题,也会随着学习的推进不断修改,因此请酌情将其当作参考。
包含显式编写的java源代码
经过编译之后,产生的由字节码组成的文件,可以直接运行
源文件>类>方法>语句
代码形式:
public class learning {
public static void main(String[] args) {
System.out.println("Hello!");
}
}
这是一个最基本的java程序,需要至少含有一个class、一个main()方法。
Java程序会默认从调用的类中的main()方法开始运行,若调用的类中没有main()方法,则会在运行时出错。
类,是编译生成的文件单位,也是运行java程序时所需要调用的东西。
通常一个.java源文件中会含有若干个class,其中只能有一个是public class,且这个class的类名必须要与源文件的名字保持一致;其余的类名可以在命名允许的范围内随意命名。
通过命令行编译的指令:
javac filename.java
当代码无误时,会基于filename.java源文件中编写的所有class,生成若干个.class文件。
编译器并不会要求在一个.java文件中必须要有一个main()方法,但想要得到可运行的程序,必须在某个类中包含一个main()方法作为入口点。
通过命令行运行java程序(实际上是某个class文件)的指令:
java classname
注意在运行时类文件是不需要加.class后缀的。
有时也被称为函数(在面向过程的语言中较多),在面向对象的Java语言中,作为类的一种附属物而存在。换言之,方法不可能单独存在于类之外。
Java语言中的花括号是界定类、方法的标识符,一个类中的所有成分全都在同一个花括号下,而一个方法中的所有语句,也同样在一个花括号中。
Java语言承袭了C语言用分号分隔语句的习惯。
不同于面向过程的编程思想,面向对象(OOP)中,一切都是对象。
类是对象的模板,创建一个对象,即是对类的实例化。
下面这张表简要地描述了类和变量中的成分之间的对应关系:
类 | 对象 | |
---|---|---|
变量 | 实例变量(instance variable) | 状态 |
方法 | 方法 | 行为 |
结合具体代码来简要说明:
class People {
private String name;
public void setName(String theName) {
name = theName;
}
public void getName() {
return name;
}
}
public class test {
public static void main(String[] args) {
People me = new People();
me.setName("Ordinary");
String myName = me.name;
System.out.println(myName);
}
}
体现对象的状态。
如上面的private String name,即表征了生成的people对象的名字这一特性。
方法表征了对象能够做出的行为。
面向对象的语言,在创建类时,一般会基于所有的实例变量设置getter和setter方法,隐式地对实例变量进行存取。上面的setName和getName即是用于设置和读取实例变量name的方法。
(Java使用private标识符标记变量、方法的私有性质,使得其仅可在类的内部被使用,后续在封装中会更加详细地介绍)
new className()
Java中对象的创建使用的是new关键字,new className()整体返回所创建对象的引用,可以将其赋值给同类型的对象引用类型变量(关于变量类型,下面会详细介绍)。
所有编程语言都绕不开基础语法。
Java中的关键字,我个人感觉相比C语言要复杂一些,毕竟C还是面向过程的。先介绍一些初学者比较常用的吧:
关键字 | 用途 |
---|---|
public | 声明公有,即可在程序内部任意位置进行使用 |
private | 声明私有,指某些变量、方法仅可用于类中 |
class | 定义类 |
interface | 定义接口 |
abstract | 用于修饰类,表明类是抽象类 |
extends | 用于修饰类,表示类的继承关系 |
implements | 实现接口 |
new | 用于创建新的对象 |
static | 表明变量或方法是静态的 |
try/catch | 尝试执行某个代码段,并伺机捕捉异常 |
throw | 抛出异常 |
另外一些诸如if、else、while等表达基本逻辑的关键字,与C语言基本一致,故在此不过多赘述。
定义在方法中,仅可在此方法内部被使用。
定义在类中、方法外(一般来说,只有创建了相应类的对象,才会有实例变量这一概念,但静态变量属于特例,静态变量会在一切对象创建之前先被实例化。实例变量在一些其他语言中常被称为类的属性),根据其公有、私有性质,有不同的使用标准。
也就是Java中最基础的一些类型,包含以下几类:
类型 | 位数 | 值域 |
---|---|---|
boolean | 由Java虚拟机决定 | true/false |
char | 2 bytes(16 bits) | 0~65535 |
byte | 1 bytes(8 bits) | -128~127 |
short | 2 bytes(16bits) | -32768~32767 |
int | 4 bytes(32 bits) | -2147483648~2147483647 |
long | 8 bytes(64 bits) | 太大了…… |
float | 4 bytes(32 bits) | 规模可变 |
double | 8 bytes(64 bits) | 规模可变 |
“对象引用类型”这一概念是面向对象的语言与面向过程的语言的一大区别。
面向过程的语言中,变量通常是如此定义的:
type variable = value;
但创建新的对象,却与这种方式有一些不同:
calssType object = new classtype();
二者最大的区别,在于新的关键字new。
new这个关键字,代表在堆区(heap)上创建一个对象,并返回对该对象的“引用”。
由于类大多是程序编写者自己创建的,因此其占用空间是不确定的,也就是说,不能再像之前对于primitive主数据类型的那样,为以类为模板创建的对象分配一个固定的存储空间(通常这种固定式的存储空间存在于栈(stack)中)。故面向对象的语言采取了一种全新的模式,使用“堆”上的内存空间来存储对象本身,而使用“栈”中的对象引用类型变量来取用对象的属性和方法。尽管各种对象的大小可能各有不同,但所有“引用”的大小都是相同的。
对象引用类型变量采用句点运算符来对所引用对象的属性及方法进行调用:
object.variable;
object.method();
用书上的话来说,变量object实际上就是个“遥控器”,而对象是电视机本身。
Java的堆区存在垃圾收集机制。当某些对象不再被任何变量所引用时,Java虚拟机就会将其标记为“可回收”的,并在适当的时机将其清理。
Java中并没有严格的全局变量概念,但是有一类变量可以看作是全局性质的变量。
public static final type variable = xxx;
使用public修饰,代表该变量可被任意调用;
使用static修饰,代表该变量在对象被创建之前就会被加载,且对所有对象保持一致(即“静态”的概念,之后会详细介绍);
使用final修饰,代表变量在子类或者其他位置不可被覆写或修改。
“我々は背負った罪によって道を選ぶではなく、選んだ道で罪を背負うべきだからだ。”
——蒼崎橙子