包+static成员+代码块+内部类

Posted ohana!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了包+static成员+代码块+内部类相关的知识,希望对你有一定的参考价值。

一,包

1.为了更好的管理类,把多个类收集在一起成为一组,成为软件包

  • 包是对类,接口等的封装机制的体现,是对类或者接口等一种比较好的管理
  • 在同一个包中不允许存在相同名称的类,但在不同包中可以

2.导入包中的类

import java.util.Date;
public class TestDate1 {
    public static void main(String[] args) {
        //导入包中的类
        //方法一(以导入一个时间戳为例子)

        java.util.Date date = new java.util.Date();
        System.out.println(date.getTime());

        //方法二(用import语句导入包)
        Date date1 = new Date();
        System.out.println(date1.getTime());

        Date date2 = new Date();
        System.out.println(date2.getTime());
    }
}

3.自定义包

  • 在文件的最上方加上一个 package 语句指定该代码在哪个包中
  • 包名需要尽量指定成唯一的名字
  • 包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径 com/bit/demo1 来存储代码
  • 如果一个类没有 package 语句, 则该类被放到一个默认包中
  • 导入自定义包的操作可以用import语句来完成,和导入包一样

4.包的访问权限控制

二,static成员

以学生类为例

public class student {
    public String name;
    public String gender;
    public int age;

    public student(String name, String gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    public void print(){
        System.out.println(name + "-" + gender +"-" + age);
    }

    public static void main(String[] args) {
        student a = new student("张三","男",20);
        student b = new student("李四","女",21);
        student c = new student("王五","男",22);
        a.print();
        b.print();
        c.print();
    }
}

student类中定义的成员变量,每个对象都会包含一份(实例变量)

1.在Java中被static修饰的成员,称为静态成员变量,也称为类成员变量,它不属于任何对象私有是所有对象共享的

静态成员变量的特性:

  • 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  • 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  •  JDK7及以前,HotSpot(Java虚拟机)中存储在方法区,JDK8及之后,类变量存储在Java堆
  • 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
  • 可以直接通过类名访问,也可以通过对象访问 

2.static修饰成员方法

  • 不属于某个具体的对象,是类方法
  •  可以通过对象调用,也可以通过类名.静态方法名(...)方式调用
  • 静态方法没有隐藏的this引用参数,因此不能在静态方法中访问任何非静态成员变量
  • 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

3.static成员变量初始化

  • 就地初始化

    就是在定义时直接给出初始值

  • 静态代码块初始化

 三,代码块

使用{}定义的一段代码称为代码块

  • 普通代码块

    定义在方法中的代码块

    public static void main(String[] args) {
            student s1 = new student("张三","男",20);
            student s2 = new student("李四","女",21);
            student s3 = new student("王五","男",22);
            System.out.println(student.classroom);
            System.out.println(s1.classroom);
            System.out.println(s2.classroom);
            System.out.println(s3.classroom);
        }

    定义在{}中的

  • 构造代码块(实例代码块,构造代码块一般用于初始化示例成员变量)
    public class student1 {
            public String name;
            public String gender;
            public int age;
            public static String classroom = "101";
            public student1() {
                System.out.println("我是无参构造方法");
            }
       //构造代码块(实例代码块)
        {
            this.name = "张三";
            this.gender = "男";
            this.age = 20;
        }
            public void print(){
                System.out.println(name + "-" + gender +"-" + age);
            }
    
            public static void main(String[] args) {
                student1 s1 = new student1();
                s1.print();
            }
    }

    注意:实例代码块会优于构造方法执行 

  • 静态代码块

    使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量

    静态代码块不管生成多少个对象,并且只会生成一次 

    1.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的

    2.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依  次合并,最终放在生成的<>方法中,该方法在类加载时调用,并且只调用一次

    3.实例代码块只有在创建对象时才会执行

  • 同步代码块

四,内部类

outclass称为外部类,Innerclass称为内部类 

被static修饰的称为静态内部类,未被修饰的称为普通内部类 

以上是关于包+static成员+代码块+内部类的主要内容,如果未能解决你的问题,请参考以下文章

static关键字,代码块,abstract关键字,interface,内部类,异常处理

内部类包修饰符代码块

面向对象--01--类属性方法static代码块抽象类接口内部类

Java面向对象--代码块(初始化块)和内部类

java学习之内部类包与代码块

《Java架构筑基》从Java基础讲起——深入理解Static