方法
参数传递
值类型是值传递,对象是引用传递,传递的是地址
方法签名
方法签名由方法名和参数类型组成, 不包括返回值
同一个类中,不能定义两个方法签名一样的方法
方法的重载(Overload)
Java的方法支持方法重载:方法名相同,方法签名不同。
也就是方法名相同,参数类型/个数不同
继承
子类的构造函数必须先调用父类的构造函数,如果没有调用,编译器会帮着自动调用父类的无参数的构造函数(如果父类没有无参数的构造函数,则会报错)
Static
static常用来修饰类的成员:成员变量、方法、嵌套类
-
成员变量
- 被static修饰:叫做类变量,静态变量
- 在程序运行过程中只占用一份固定的内存(存储在方法区)
- 可以通过实例、类访问(一般是通过类来访问)
-
方法
- 被static修饰的话一般叫做类方法/静态方法
- 类方法里不能使用this
- 可以直接访问类变量、类方法
成员变量的初始化
编译器会自动为未初始化的成员变量设置初始值
-
手动给实例变量提供初始值
- 跟其他语言类似
- 通过初始化块来初始化
public Person(){ } public Person(int age) { this.age = age; } // 初始化块 // 通过初始化块来初始化变量 { // 初始化块中的代码会在复制到构造函数的头部先执行(编译器帮我们做的) // 也就是构造函数会先执行初始化块中的代码 再执行之后的代码 age = 10; }
-
给类变量设置初始值
- 声明中
- 在静态初始化块中
- 当一个类初始化时会执行静态初始化块
- 当一个类第一个被主动使用时,JVM会对类进行初始化
public static int count; // 通过静态初始化块给类变量设置初始值 static { count = 10; }
-
可以用多个(静态)初始化块,按照在源码中出现的顺序执行
public class Person {
public Person(){
System.out.println("Person - constructor");
}
// 初始化块
{
System.out.println("Person - block");
}
// 通过静态初始化块给类变量设置初始值
static {
System.out.println("Person - static block");
}
}
public class Student extends Person {
public Student(){
System.out.println("Student - Constructor");
}
{
System.out.println("Student - block");
}
static {
System.out.println("Student - static block");
}
}
Student stud = new Student();
// 打印顺序
Person - static block
Student - static block
Person - block
Person - constructor
Student - block
Student - Constructor
单例
方式一
// 1. 饿汉式 线程安全
public class Singleton {
// 声明的时候就初始化
public static Singleton instance = new Singleton();
// 构造方法私有化
private Singleton(){
// 私有化构造函数 这样外面就不能调用构造方法
}
// 构造一个静态方法 返回唯一的静态变量
public static Singleton getInstance(){
return instance;
}
}
方式二
// 懒汉式 线程不安全的
public class Singleton {
// 静态变量在程序运行中只有一份内存
public static Singleton instance = null;
// 构造方法私有化
private Singleton(){
// 私有化构造函数 这样外面就不能调用构造方法
}
// 线程不安全的
public static Singleton getInstance(){
if(instance == null) {
// 当有多个线程同时访问时 可能会多个线程都会走到这里
// 会创建多个实例
// 但是在后续使用的时候 instance指向的实例对象还是同一个
instance = new Singleton();
}
return instance;
}
}
网友评论