深入了解static关键字(面试)

概念

static是Java中的关键字-修饰符,用于修饰变量、方法、代码块、内部类

静态变量

被static修饰的成员变量
静态变量会随着类的加载而加载到静态区,与类同级,也叫类变量。
可以直接通过类名+. 的方法来直接调用,也可以通过对象来调用
静态区会对存储的静态变量赋予初始值。类创建的所有对象的属性都要共享同一个静态变量,所有对象的操作的是同一个静态变量
如果属性需要被所有对象共享,就加上static修饰

静态变量可以定义在方法中吗?

不能,静态变量与类同级,需要最先加载,但是方法中的内容只有等到方法被调用执行的时候才可以出现,因此不可以定义在方法中。

被static修饰的内存管理

在这里插入图片描述

public class StaticDemo {
    public static void main(String[] args) {
        Person person = new Person();
        //默认为初始值
        System.out.println(person.toString());
        person.name="lili";
        person.age=10;
        person.gender='女';
        //将person对象进行赋值
        System.out.println(person.toString());
        Person person1 = new Person();
        System.out.println(person1.toString());
        person1.name="wangwu";
        person1.age=20;
        person1.gender='男';
        System.out.println(person1.toString());
        System.out.println(person.toString());
    }
}

class Person{
    String name;
    int age;
    static char gender;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}
静态方法

随着类的加载(静态常量池)而加载到静态区,与类同级,也叫类方法,通过类型.的形式来调用,也可以通过对象来调用。静态区不会堆静态方法赋予初始值,但是静态方法被调用时会被加载到栈中执行。

静态方法(main方法)里面可以使用this吗?

静态方法与类同级,this与对象同级,因此不可以

main方法中可以直接调用非静态属性和方法吗?

不可以,级别不一致,静态信息不能直接调用非静态信息,但是可以直接调用静态信息
非静态信息可以直接调用静态和非静态信息

静态方法中有重载吗?

有重载

静态方法中有重写吗?

没有,静态方法与类同级,重写与对象是一个级别的,因此没有重写。
静态方法是类在加载的时候就被加载到了内存中的方法,整个过程保持不变。
注意:
如果子类中定义的静态方法(类方法)与父类中的静态方法(类方法)具有相同的返回值类型、方法名、方法参数的类型和个数完全相同,则称子类的该方法隐藏了父类的方法。当子类创建的对象调用该隐藏方法的时候,默认调用的是子类中的方法

静态代码块

static修饰构造代码块

static{

    }

优先于构造方法和构造代码块先执行
用域提前加载某些信息和资源
类只能加载一次,静态信息也就只能加载一次
父子类执行顺序(父类静态信息,子类静态信息,父类对象级别信息,子类对象级别信息)
对象级别包含:属性、构造代码块、构造方法

public class Demo04 {
    public static void main(String[] args) {
        Dog dog = new Dog();
    }
}
class Animal{
    static int num;
    static{
        System.out.println("父类静态代码块"+num);
        num = 10;
    }
    public Animal(){
        num=20;
        System.out.println("父类构造方法查看修改结果"+num);
    }
}

class Dog extends Animal{
    static int j = 10;
    static {
        j=20;
        System.out.println("子类静态构造代码块执行"+j);
    }

    public Dog(){
        j=50;
        System.out.println("子类构造方法执行"+j);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值