Day1 | Java基础 | 2 数据类型
- 基础版
- static
- static的用法
- static修饰内部类
- static修饰方法
- static修饰变量
- static修饰代码块
- 深入分析
- static小结
- 问题回答版
- 参数传递
- 形参和实参的区别是什么?
- Java是值传递还是引用传递?
- 值传递和引用传递的区别是什么?
- final关键词
- final作用是什么?
- final、finally、finalize有什么不同?
- static关键词
- static作用是什么?
- static和final区别是什么?
基础版
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类名访问静态内部类InnerClassInnerClass 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区别是什么?
参考链接
区别 | static | final |
---|---|---|
能否修饰类、方法、成员变量 | 可以 | 可以 |
能否修饰构造器 | 不可以 | 不可以 |
能否修饰代码块 | 可以 | 不可以 |
能否修饰局部变量 | 不可以 | 可以 |
修饰方法时能否被重写 | 不可以 | 不可以 |