Day2 | Java基础 | 2 数据类型

基础版

static

参考链接

static的用法

static修饰内部类

静态内部类的使用示例:

public class StaticTest {
    //static关键字修饰内部类
    public static class InnerClass{
        InnerClass(){
            System.out.println("============= 静态内部类=============");
        }
        public void InnerMethod() {
            System.out.println("============= 静态内部方法=============");
        }
    }
    public static void main(String[] args) {
        //直接通过StaticTest类名访问静态内部类InnerClass
        InnerClass inner=new StaticTest.InnerClass();
        //静态内部类可以和普通类一样使用
        inner.InnerMethod();
    }
}
/*  输出是
 * ============= 静态内部类=============
 * ============= 静态内部方法=============
 */

如果没有用static修饰InterClass,则只能new 一个外部类实例。再通过外部实例创建内部类

static修饰方法

同上,可以直接通过类名调用:

public class StaticMethod {
    public static void test() {
        System.out.println("============= 静态方法=============");
    };
    public static void main(String[] args) {
        //方式一:直接通过类名
        StaticMethod.test();
        //方式二:
        StaticMethod fdd=new StaticMethod();
        fdd.test();
    }
}
static修饰变量
  • 静态变量:被static修饰的成员变量叫做,也叫类变量,说明这个变量是属于类的,而不是属于对象。
  • 实例变量:没有被static修饰的成员变量,说明这个变量是属于某个具体的对象。

同样可以直接通过类名调用静态变量:

public class StaticVar {
    private static String name="java的架构师技术栈"public static void main(String[] args) {
        //直接通过类名
        StaticVar.name;
    }
}
static修饰代码块

静态代码块在类第一次被载入时执行。类初始化的顺序:

  • 父类静态变量
  • 父类静态代码块 static{}
  • 子类静态变量
  • 子类静态代码块
  • 父类普通变量
  • 父类普通代码块
  • 父类构造函数
  • 子类普通变量
  • 子类普通代码块
  • 子类构造函数

深入分析

在这里插入图片描述
堆区

  • 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
  • 不存放基本类型和对象引用,只存放对象本身。
  • JVM只有一个堆区heap被所有线程共享。

方法区

  • 也叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
  • 方法区中包含的都是在整个程序中永远唯一的元素,如class、static变量。

栈区

  • 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都放在堆区中。
  • 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  • 栈分为三个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

一个例子:

public class Person {
    //静态变量
    static String firstName;
    String lastName;
    public void showName(){
        System.out.println(firstName+lastName);
    }
    //静态方法
    public static void viewName(){
      System.out.println(firstName);
    }
    
    public static void main(String[] args) {
        Person p =new Person();
        Person.firstName = "张";
        p.lastName="三";
        p.showName();
        
        Person p2 =new Person();
        Person.firstName="李";
        p2.lastName="四";
        p2.showName();
    }
}
//输出。张三、李四

在这里插入图片描述

  • 从方法区调用方法。
  • 堆内存中的成员变量lastname随着对象的产生而产生,随对象的消失而消失。
  • 静态变量是所有线程共享的,所以不会消失。因此,静态变量可以直接根据类名去访问。

static小结

特点

  • static修饰的成员被所有的对象共享。
  • static由于对象存在,因为static的成员随着类的加载就已经存在。
  • static修饰的成员多了一种调用方式,可以直接被类名调用。
  • static修饰的数据是共享数据,对象中存储的是特有数据

成员变量与静态变量的区别

区别成员变量静态变量
生命周期随着对象的创建而存在,随着对象的回收而释放随着的加载而存在,随着类的消失而消失
调用方式只能被对象调用可以被对象调用,也可以用类名调用(推荐)
别名实例变量类变量
存储位置堆内存的对象中,所以也叫对象的特有数据方法区(共享数据区)的静态区,所以也叫对象的共享数据

使用的注意事项

  • 静态方法只能访问静态成员。(非静态可以访问静态,也可以访问非静态)
  • 静态方法中不能使用this或super关键字。
  • 主函数是静态的。

问题回答版


参数传递

形参和实参的区别是什么?

  • 形参:形式参数,Parameters,定义方法时使用的参数。用来接受调用者传递的参数。作用域在方法内部。
  • 实参:实际参数,Arguments,调用时传递给方法的参数。实参在传递给别的方法前需要被预先赋值(必须有确定的值)。

Java是值传递还是引用传递?

值传递。

  • 当参数是基本数据类型,传递的就是基本类型的字面量值的拷贝,会创建副本。比如原始类型(int、long、char等)、包装类型(Integer、Long、String等),实参和形参都是存储在不同的栈帧内,修改形参的栈帧数据,不会影响实参的数据。
  • 当参数是引用类型数据,传递的就是实参所引用的对象在堆中地址值的拷贝,同样也会创建副本。形参和实参指向同一个地址的时候,修改形参地址的内容,会影响到实参。当形参和实参指向不同的地址的时候,修改形参地址的内容,并不会影响到实参。

值传递和引用传递的区别是什么?

  • 值传递:调用方法时,将实际参数拷贝一份传递给方法。在方法中修改形式参数时,不会影响到实际参数。
  • 引用传递:也称地址传递。调用方法时,将实际参数的地址传递给方法。在方法中对形式参数的修改,会影响到实际参数。

final关键词

final作用是什么?

用于修饰类、方法、变量。

final 修饰意义
不能继承扩展
变量不能修改(避免意外赋值导致的编程错误)
方法不能重写

final、finally、finalize有什么不同?

  • finally:Java保证重点代码一定要被执行的一种机制。可以使用 try-finally 或try-catch-finally进行类似关闭JDBC连接、保证unlock锁等动作。

需要关闭的连接等资源,更推荐使用 Java 7 中添加的 try-with-resources 语句,因为通常 Java 平台能够更好地处理异常情况,编码量也要少很多。

  • finalize:是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize机制现在已经不推荐使用,并且在JDK9开始被标记为deprecated。因为无法保证finalize什么时候执行,执行的是否符合预期。使用不当会影响性能,导致程序死锁、挂起等。

下面代码会输出什么?
try {
// do something
System.exit(1);
} finally{
System.out.println(“Print from finally”);
}
上面 finally 里面的代码可不会被执行,这是一个特例。

static关键词

static作用是什么?

方便在没有创建对象的情况下进行调用。直接根据类名就可以去访问。

Java中static一般用来修饰成员变量、函数或内部类。普通类不允许声明为静态类。

static和final区别是什么?

参考链接

区别staticfinal
能否修饰类、方法、成员变量可以可以
能否修饰构造器不可以不可以
能否修饰代码块可以不可以
能否修饰局部变量不可以可以
修饰方法时能否被重写不可以不可以
  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值