1. Java语言的跨平台性与字节码概述
- 计算机中操作内存最小的单位是一个字节,1 byte = 8 bit
- Java 通过 Java virtual machine 实现跨平台桥梁
- Java --compile--> bytecode ----> JVM ----> Linux/Win/Mac
2. Java语言的基本单元-类与包
类和文件名是相同的。一个Java的类文件只能包含一个和它同名的public 成员(类、抽象类、接口),非 public 成员可以包含多个。
默认包default package,即 src/main/java,每个 class 都处在一个 package 中,包名取决于 class 所在的目录结构。
- 包的第一个用处是区分不同的类
- 包的第二个用处是访问控制(见下文)
全限定类名(FQCN-Full Qualified Class Name),由包目录名决定,在 jvm 眼中所有的类名都是 fqcn。只要是不在一个包,如果用到需要用的类,就需要import
语句引进来。有时候为了防止类名冲突,需要写全(InteliJ 中使用 alt+enter 开启智能提示):
package com.github.hcsp;
import com.github.hcsp.pet1.Cat;
public class Home {
Cat cat1;
com.github.hcsp.pet2.Cat cat2; // 如果这里也使用 import 功能,就会类名冲突
}
maven 项目结构约定:
src ---> mian/java
---------- test/java
String
类和 System
是 jvm 内置的类,不需要 import java.lang.String
显示引入。
3. 方法、静态方法和静态变量
public class Main {
public static int i; // 静态成员变量
public static void main(String[] args) { // main 方法,也是程序入口
add();
}
public static void add() { // 静态方法
int j = 3; // 局部变量
i = i + j;
}
}
4. 对象、构造器和实例变量
创建的 class 假如没有声明任何构造器,编译器会自动帮助生成一个:
public class Cat {
// 实例变量
public String name;
// 编译器自动生成
public Cat() {
}
// 自定义
public Cat(String name) {
this.name = name; // 对象的实例属性和实例方法在不引起歧义的情况下,可以不用 this
// 因为这里形参也叫 name,所以才加以区分
}
// 实例方法
public void meow() {
System.out.println("喵~我是" + name);
}
}
在 null 上调用方法,会报错空指针异常 java.lang.NullPointerException
。
5. 包、类、静态成员、静态方法、实例成员、实例方法
区分标识是有
There are four levels of access in Java:
private - only that class has access
no descriptor - that class and everything in the same package
protected - that class, same package, descendants of that class
public - everything
6. 对象和引用详解
Java 中所有对象都只是引用(地址),赋值时只是复制地址,但指向的还是同一块内存空间。所以存在 shallowCopy 和 deepCopy 的问题。
7. 方法的传值 vs 传引用(地址)
main 是 java 执行的入口,在每次调用方法时,java 都会创建全新的执行环境。
java 中的数据类型分为两类:
- 原生数据类型: int、float、double
声明的变量就是数据本身。 - 引用数据类型(对象):各种 class、String 等。
声明的变量只是存了地址,而地址指 向数据本身。
方法调用时无论是传值还是传引用,本质上都是一样的,都是复制,只不过一个传的就是原始数据本身,而另一个传的是对象地址。
所以严格来说,其实方法的调用都是在传值(复制变量中存的原始类型的数据,或对象地址)。
网友评论