基础知识
JVM
在⼀个Java平台下,在底层运⾏的是Java Hotspot虚拟机,即JVM。JVM(Java Virtual Machine)是 Java 程序执⾏基础环境。JVM 针对不同的软硬件应⽤平台进 ⾏设计,同⼀个 Java 程序通常不依赖操作系统,可以在不同的 JVM 中执⾏。JVM是JRE的⼀部分。
JDK
Java 开发⼯具 SDK(Software Development Kit)是 Java 开发应⽤的核⼼。
JRE
JRE(Java Runtime Environment)是Java运⾏环境。
API
Java应⽤程序编程口,即Java官⽅或者是第三⽅⼚商提供的代码。Java API通常需要使⽤import关键
字进⾏导⼊,并且还需要保证这些API存在于⾃定义代码可访问的地⽅。
Java源代码.java⽂件都需要编译成.class⽂件,然后在对应版本的JVM中执⾏
完整步骤包括:
- 通过⽂本编辑⼯具创建扩展名为.java 的源代码⽂件。
- 使⽤编译⼯具(如 JDK 中的 javac)将.java ⽂件编译成.class 字节码⽂件。
- 使⽤装载⼯具(如 JDK 中的 java)装载.class ⽂件⾄ Java 运⾏环境 JRE 中运⾏。
- 注意:控制台程序通常不知道javac和java所在的位置,由此带来⼀个潜在的问题,在不同操作系统OS之下(主要是MS Windows)设置环境变量的问题。
//1
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 2
String name = new Scanner(System.in).nextLine();
int age = new Scanner(System.in).nextInt();
// 3
System.out.println("My name is " + name + ". I'm " + age + " years old.");
}
}
注意
类结构是Java语法中⽤于描述特定对象类型的语法结构。对于java程序来说,所有的代码必
须放置在类结构中,不论类结构是否真的发挥了作⽤。
输入语句
new java.util.Scanner(System.in).nextInt(10); //获取一个整型10
new java.util.Scanner(System.in).nextLine(); //获取⼀⾏字符串
java语言基础
数据类型
- 原始数据类型(常规数据类型)包括int、char、float、double、boolean
- 引用数据类型 数组、集合、对象、类等这些概念都和参考数据有关
基本语言单位
标识符:标识符是源代码中的基本字符串表⽰。
Keyword
关键字是具有特殊功能的标识符
常量
final关键字可以⽤于定义不可变常数,final表⽰不可改变
变量
变量是有名字的存储空间,可以存储⼀些计算⽤的中间值。变量可以参与具体运
算,但必须先声明后使⽤。
尽管Java编译器在某些时候类似C会给a⼀个默认值0,但并不保证总是这样
表达式
表达式是数据与运算符的结合体。
语句
表达式加上 ; 可以成为语句。
方法
public class TheMethod {
// 1
public static void m1() {
System.out.println("a");
System.out.println("b");
}
// 2
public static void m2(int p) {
int tmp = 3 + p;
System.out.println(tmp);
}
// 3
public static int m3() {
int a = 2;
return a + 3;
}
// 4
public static int m4(int p) {
return p + 3;
}
// 5
public static int m5(int p, int k) {
return p + k;
}
public static void main(String[] args) {
// 6
TheMethod.m1();
TheMethod.m2(1);
// 7
int x = TheMethod.m3();
int y = TheMethod.m4(4);
// 8
int z = TheMethod.m5(x, y);
// 9
int mm = TheMethod.m5(TheMethod.m3(), z);
}
}
代码说明:
1. 声明⼀个⽆参数⽆返回值类⽅法m1
2. 声明⼀个有参数⽆返回值类⽅法m2
3. 声明⼀个⽆参数有返回值类⽅法m3
4. 声明⼀个有参数有返回值类⽅法m4
5. 声明⼀个带有多参数的类⽅法m5
6. 通过类名调⽤类⽅法m1和m2,将直接执⾏m1和m2⽅法体部分的内容
7. 通过类名调⽤类⽅法m3和m4。因为m3和m4都是有返回值的,所以这两者计算结束后,
在其调⽤处,将会留下计算结果。可以将计算结果5和7分别存⼊x和y。
8. 利⽤前⼀步获得的变量x和y,调⽤m5,计算结果为12,被存⼊到z。
9. 嵌套使⽤类⽅法。⾸先计算TheMethod.m3()得到5,所以
TheMethod.m5(TheMethod.m3(), z)
等价于
TheMethod.m5(5, 12)
最后求得17,存⼊mm。
if-else if-else
判断语句
while do-while
while是⼀种循环结构,即其包含的执⾏内容将依据while关键字之后的布尔值条件反
复执⾏。
for 循环
与for关键字有关的循环结构在Java中有2种,常被分别叫做for和for…each(或称
for…in)结构。⾸先在循环开始之前,声明了⼀个int类型变量x并初始化为0。
for-each
for…each(或称for…in结构)主要⽤于遍历某种集合性数据。例如,同样遍历数组
anArray,可以表达为:
for (int tmp : anArray) {
System.out.println(tmp);
}
break
break关键字可以放置在switch、while、do…while、for、for…each中,终⽌整个结构
的执⾏。break的作⽤范围在⼀个包含它的switch、while、for等结构的⼤括号
之内,同时不受if结构的⼤括号影响。
continue
continue关键字的作⽤是在while等循环结构中跳出当前这⼀轮循环,直接进⼊下⼀
轮。continue的作⽤可以被视为是忽略循环结构的部分代码。
数组
数组适合存放和处理存在内在的逻辑关系的数据,特别是有序数据。
定义方式
int [] z = new int[3];
排序算法(冒泡)
public static void main(String[] args) {
double[] scores = { 61.0, 68.6, 78.1, 94.2, 58.5,87.8, 67.5, 91.2, 95.1, 70.0 };
// 1
for (int i = 0; i < scores.length - 1; i++) {
// 2
for (int k = i + 1; k < scores.length; k++) {
// 3
if (scores[i] > scores[k]) {
double tmp = scores[i];
scores[i] = scores[k];
scores[k] = tmp;
}
}
}
// 4
for (double tmp : scores) {
System.out.print(tmp + " ");
}
}
结果:58.5 61.0 67.5 68.6 70.0 78.1 87.8 91.2 94.2 95.1
对象数组
Student[] students = new Student[50];
题目(九九乘法表)
public class MultiplicationTable {
public static void main(String[] args) {
for (int m = 1; m <= 9; m++) {
for (int n = m; n <= 9; n++) {
System.out.print(m + "*" + n + "=" + m * n + "\t");
}
System.out.print("\n");
}
}
}
结果
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*6=36 6*7=42 6*8=48 6*9=54
7*7=49 7*8=56 7*9=63
8*8=64 8*9=72
9*9=81
面向对象编程
对象
Java对象Object,是软件数据集合,也称软件簇。它通常包含⼀个数据对象的属性field和⽅法method。对于属性field,在代码中表⽰为类中的变量,其作⽤是表⽰⼀个对象的状态。
类
是对Object的基本分组
接口
接口interface是⼀个标准或者协议,如果⼀类对象实现⼀个interface,即表⽰该类对象具有这⼀interface所声明的所有能⼒。接口也可以被理解为多个类之间的沟通协议。
包
其作⽤是组织和封装Java代码。package通常包含多类、接口、其它资源⽂件等内容。
类的声明
它通常包含关键字class,⾃定义类的名字MyClassName,以及类的边界“{”和“}”。类⼀般组成部分包括属性(field)、⽅法(method)和构造⽅法(constructor)。field通过定义变量来表⽰,method通过函数表⽰。constructor是⼀类特殊的函数,在通过创建对象时使⽤
主⽅法不属于类的描述。
方法
⽅法是类中声明的函数。
重载
Java语⾔⽀持⽅法重载overloading,即⼀个类中的⼀组⽅法有相同的名字和⼀组不同的参数列表,重载⽅法的区别通过“⽅法签名”来区别。
构造方法
构造⽅法Constructor,是⼀个类的成员,是⼀类特殊的⽅法,其⾸要作⽤是对新实例化对象的属性进⾏初始化。
特点
- 它属于类的范围。
- ⽅法名必须和所属类的名字相同。
- ⽆返回值类型声明。
- 其它部分和普通⽅法相同。
class Student {
Student() {
}
}
使用
··· java
Student tom = new Student();
···
当⼀个Java类没有任何⾃定义构造⽅法时,Java编译系统将⾃动添加⼀个⽆参数、⽆执⾏内容的构造⽅法,
类变量和类⽅法的声明
带有static关键字
访问控制
public、private
继承(带有extends)
super引用父类,this引用子类
重写问题
Override是在继承关系中,出于⼦类⾃定义需要,⼦类可以重写在⽗类中已经声明的⽅法,⽅法签名必须相同,但⽅法内容可以根据需要进⾏改变。
class Animal {
public void move() {
System.out.println("Animal move");
}
}
class Human extends Animal {
public void move() {
System.out.println("Human walk");
// do walk action
}
}
class Bird extends Animal {
public void move() {
System.out.println("Bird fly");
// do fly action
}
}
final
final关键字可将类定义为不可继承的,也叫做最终类,防⽌代码在分发之后被变更功能。
接口不可以被实例化,但是可以继承
类可以嵌套 ,enum 为枚举类型
异常处理
Java语⾔将⽆法通过代码控制,程序出错后⽆法恢复的错误统称为Error,将可控的⼀些问题归为Exception(异常)。
Exception(异常)
所有的异常类都是Exception类的直接或间接继承者。
** 通过try…catch语句块可以在局部范围直接处理基本异常。通过throws关键字可以传递异常对象⾄App的其它部分,由其它代码实现集中的异常管理。**
try…catch…finally
try…catch…finally由1个try⼦句、1个或多个catch⼦句以及0个或1个finally⼦句组成。
**finally内的结果不管程序运行结果都会最后被执行。 **
例子
import java.io.*;
public class ExceptionTest {
public static void main(String[] args) {
// 1
FileReader in = null;
try {
// 2
in = new FileReader("in.txt");
// 3
int c = in.read();
System.out.println(c);
} catch (FileNotFoundException e) { // 4
System.out.println("Exception: File Not Found");
} catch (IOException e) { // 5
System.out.println("Exception: IO Exception");
} catch (Exception e) { // 6
System.out.println("Exception: Just An Exception");
} finally { // 7
System.out.println("Start closing sequences.");
// do close operation
}
}
}
星星图形排序的代码
//左正三角形
public class sanjiaoxing1{
public static void main(String[] args){
String s = "*"; //输出为三角形的字符串为*
for(int j=0;j<5;j++){ //输出第一行
for(int i=0;i<j+1;i++){ //不换行,输出一行 i<j+1 等价于 i<=j
System.out.print(s);
}
System.out.println(); //换一个新行
}
}
}
//左倒三角形
public class sanjiaoxing2{
public static void main(String[] args){
String s = "*";
for(int j=5;j>0;j--){
for(int i=0;i<j;i++){
System.out.print(s);
}
System.out.println();
}
}
}
}
//右正三角形
public class sanjiaoxing3{
public static void main(String[] args){
String s = "*";
for(int j=0;j<5;j++){
for(int i=0;i<4-j;i++){
System.out.print(" "); //输出形状为左倒三角形的空格,此三角形共四行,第一行为四个空格
}
for(int i=0;i<j+1;i++){
System.out.print(s);
}
System.out.println();
}
}
}
//右倒三角形
public class sanjiaoxing4{
public static void main(String[] args){
String s ="*";
for(int j=0;j<5;j++){
for(int i=0;i<j;i++){
System.out.print(" "); //输出形状为左正三角形的空格,第一行位于星号三角形的第二行之前
}
for(int i=0;i<5-j;i++){
System.out.print(s);
}
System.out.println();
}
}
}
//正中三角形
public class sanjiaoxing5{
public static void main(String[] args){
String s ="*";
for(int j =0;j<5;j++){
for(int i=0;i<4-j;i++){
System.out.print(" ");
}
for(int i=0;i<2*j+1;i++){ //2*j+1:将0,1,2,3,4分别转换为1,3,5,7,9
System.out.print(s);
}
System.out.println();
}
}
}
//倒中三角形
public class sanjiaoxing6{
public static void main(String[] args){
String s ="*";
for(int j=0;j<5;j++){
for(int i=0;i<j;i++){
System.out.print(" ");
}
for(int i=0;i<9-2*j;i++){ //9-2*j:将0,1,2,3,4分别转换为9,7,5,3,1
System.out.print(s);
}
System.out.println();
}
}
}
//菱形
public class lingxing{
public static void main(String[] args){
String s = "*";
for(int j=0;j<5;j++){
for(int i=0;i<4-j;i++){
System.out.print(" ");
}
for(int i=0;i<2*j+1;i++){
System.out.print(s);
}
System.out.println(); //输出行数为5的正中三角形
}
for(int j=0;j<4;j++){
for(int i=0;i<j+1;i++){
System.out.print(" ");
}
for(int i=0;i<7-2*j;i++){
System.out.print(s);
}
System.out.println(); //输出行数为4的倒中三角形
}
}
}