static成员,代码块,内部类

目录

1.static成员

1.1static修饰的成员变量:

1.2用类名访问静态成员变量

1.3静态成员变量特性:

1.4Static修饰的成员方法:

1.5通过静态方法访问静态成员

1.6静态方法特性

2.代码块

2.1普通代码块:

2.2构造块

2.3静态代码块

2.4静态代码块不管生成多少个对象,其只会执行一次 

2.5注意事项:

3内部类

3.1实例内部类

 3.2实例内部类注意事项

3.3静态内部类

3.4在静态内部类中只能访问外部类中的静态成员

 3.5创建静态内部类对象时,不需要先创建外部类对象

3.6局部内部类


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. 实例内部类所处的位置与外部类成员位置相同,因此也受publicprivate 等访问限定符的约束
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);// 报错:局部变量的成员和方法只能在该方法体内部使用,其他位置都不能用
    }
}

猜你喜欢

转载自blog.csdn.net/qq_62712350/article/details/126247818