目录
1.static成员
现在有一个学生类,里面的成员变量分别有姓名,年龄,班级等。现在想要创建三个对象,它们的姓名年龄不一样,但都属于同一个班级。例如:张三 18 高三一班,李四 19 高三一班,王五 18 高三一班。我们如何来写这个学生类呢?
1.1static修饰的成员变量:
我们可以把班级设置为static修饰的静态成员。这样就默认创建的对象是高三一班的了。
把classes设置为静态成员变量。
1.2用类名访问静态成员变量
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共 享的。静态成员变量不依赖于对象,可以直接用类名去访问它:
比如这里我不设置classes的初始值,直接用类名去修改它。
1.3静态成员变量特性:
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问3. 类变量存储在方法区当中4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
1.4Static修饰的成员方法:
一般类中的数据成员设置为private,而成员方法设置为public。那么设置后,Student类中的classes如何在类外访问呢?
1.5通过静态方法访问静态成员
被
static
修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的
。静态成员一般是通过 静态方法来访问的。
此时classes被private修饰,我们通过setClasses这个方法来设置classes。
1.6静态方法特性
1. 不属于某个具体的对象,是类方法2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者3. 不能在静态方法中访问任何非静态成员变量4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this 引用
2.代码块
使用
{}
定义的一段代码称为代码块
。
根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块
构造块
静态块
同步代码块(本篇博客不讲)
2.1普通代码块:
定义在方法中的代码块
普通代码块就是大家最常见的代码块,例如:
这就是一个普通代码块
2.2构造块
定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
2.3静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
2.4静态代码块不管生成多少个对象,其只会执行一次
创建了3个对象,实例代码块里面的内容执行了3次 ,而静态代码块里面的内容只执行了一次,且在实例代码块之前执行。
2.5注意事项:
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)实例代码块只有在创建对象时才会执行
3内部类
在
Java
中,
可以将一个类定义在另一个类或者一个方法的内部,
前者称为内部类,后者称为外部类。
class OutClass{//外部类
class InnerClass{//内部类
}
}
3.1实例内部类
未被static修饰的成员内部类。
在实例内部类中可以直接访问外部类中:任意访问限定符修饰的成员
如果外部类和实例内部类中具有相同名称成员时,优先访问的是内部类自己的
如果要访问外部类同名成员时候,必须:外部类名称.this.同名成员名字
外部内:创建对象和成员访问
public static void main(String[] args) {
//创建实例内部类对象
OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();
//先创建外部类对象,在创建实例内部类对象
OutClass outClass2 = new OutClass();
OutClass.InnerClass innerClass2 = outClass2.new InnerClass();
}
3.2实例内部类注意事项
1. 外部类中的任何成员都可以在实例内部类方法中直接访问2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private 等访问限定符的约束3. 实例内部类对象必须在先有外部类对象前提下才能创建4. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
3.3静态内部类
被
static
修饰的内部成员类称为静态内部类。
3.4在静态内部类中只能访问外部类中的静态成员
外部类:
静态内部类
3.5创建静态内部类对象时,不需要先创建外部类对象
public static void main(String[] args) {
OutClass.InnerClass innerClass3 = new OutClass.InnerClass();
}
3.6局部内部类
定义在外部类的方法体或者
{}
中,该种内部类只能在其定义的位置使用,一般使用的非常少
public class OutClass {
private int a;
static int b;
int c;
public void method(){
int a = 10;
// 局部内部类:定义在方法体内部
// 不能被public、static等访问限定符修饰
class InnerClass{
public int d = 20;
public void print(){
System.out.println(d);
}
}
}
public void method1(){
System.out.println(d);// 报错:局部变量的成员和方法只能在该方法体内部使用,其他位置都不能用
}
}