内部类

总:static修饰的都是静态的,都和对象没有关系

一、静态变量

1)使用static关键字可以修饰成员变量,称为静态变量
2)实例变量属于某个具体的对象,静态变量不属于某个变量,整个类所共享
3)通过一个对象修改了静态变量,再通过其他对象访问静态变量时就是修改之后的值
4)静态变量存储在方法区中,所有对象都可以访问到它
5)实例变量是在创建对象时在堆中分配存储空间,对象被垃圾回收器收走,实例变量就释放了
静态变量在类加载内存时就在方法区中分配存储空间,一直到程序的结束
6)建议直接使用类名来访问静态变量
7)静态变量的应用场景:
当某个数据需要对所有对象共享时,就可以把这个数据定义成静态的

二、静态方法

1)使用static修饰的方法为静态方法
2)在静态方法中,可以直接使用静态成员,不能直接使用非静态成员
非静态成员属于某个具体对象,在使用静态方法时,还没有创建对象
在实例方法中,可以直接使用静态成员
3)静态方法不属于某个具体对象,而是属于整个类
4)建议直接使用类名来调用静态方法
5)静态方法的应用场景:
一般情况下,在定义工具类时,可以使用静态方法

三、静态构造代码块

1)使用static可以修饰构造代码块,称为静态构造代码块
2)在使用某个类时,类加载器把字节码文件加载到内存中,在类使用之前需要对类进行初始化
类初始化之前先执行静态构造代码块
3)因为类的初始化只有一次,所以静态构造代码块也只执行一次
4)应用场景:
有的时候,在使用某个类时,这个类可能需要依赖一些外部资源,在使用类之前需要先把这些资源加载到类中
就可以把加载外部资源的操作放在静态代码构造块中

四、静态内部类

1)可以在一个类的内部定义另外一个类,这叫内部类
内部类编译之后生成的字节码文件:外部类名$内部类名.class
2)内部类可以使用static修饰,静态内部类可以有实例方法
3)在静态内部类中不能直接使用外部类的非静态成员,可以使用外部类的静态成员
4)应用场景:
通过有参构造会破会类的封装性
保证类的封装性,不通过构造方法构造对象,代码如下:

public class Student{
    private String name;
    private int age;
    private String address;
    private int tel;

    //通过内部类来创建Student对象
    //1)定义一个静态内部类,类的成员和外部类完全一样
    static class Builder{
        private String name;
        private int age;
        private String address;
        private int tel;

        //2)在内部类提供变种的getter/setter方法
        //修改了内部类对象的字段值,再把内部类对象返回
        public Builder setName(String name){
            this.name = name;
            return this;
        }

        public Builder setAge(int age){
            this.age = age;
            return this;
        }

        public Builder setAddress(String address){
            this.address = address;
            return this;
        }

        public Builder setTel(int tel){
            this.tel = tel;
            return this;
        }

        //3)提供一个公共的方法,可以返回Student对象
        public Student builder(){
            return new Student(this);
        }

    }

    //4)在外部类中提供一个有参构造方法
    private Student(Builder builder){
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
        this.tel = builder.tel;
    }

    public void showInfo(){
        String str = "Student[name="+name+",age="+age+",address="+address+",tel="+tel+"]";
        System.out.println(str);
    }

    public static void main(String args[]){
        //创建Student对象
        Student stu = new Student.Builder().builder();

        stu = new Student.Builder().setName("zhangsan").setAddress("bj").builder();
        stu.showInfo();
    }

}

//创建内部类对象
Outer.Inner innerObj = new Outer.Inner();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值