引用类型变量
(1)把类名当作是一种类型来声明变量,这种变量叫引用类型变量。如:People people;
(2)引用类型变量保存对象的“引用”,即对象的地址。
(3)对象的创建 new 类名() 如:new People();
(4)new创建对象后返回对象的引用,对象没有名字,只能使用对象的引用间接使用对象,引用类型变量就是专门用来保存对象引用的。
如:People people = new People();
(5)成员变量的默认值:数据型成员变量默认值为0,boolean型成员变量默认值为false,引用类型成员变量默认值为null。
(6)对象内存分配,对象是被保存在堆中的,对象没有名字。
final
一.final关键字的基本用法
1.修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。
final类中的 成员变量 可以根据需要设为final, 但是要注意final类中的所有 成员方法 都会被隐式地指定为final方法。
☆在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
2.修饰方法
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。
因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。
注:类的private方法会隐式地被指定为final方法。
3.修饰变量
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));//true
System.out.println((a == e));//false
由于String是在常量池中创建,不可有相同的内容指向不同的String类型,相同内容c只能出现一个地址存储,而e内容是2和指向d的地址组成的新地址;
final变量b:在使用的时候是直接被替换成它的值;
String类型d:在使用时候是链接对象地址使用;
栈 基本类型的变量和对象的引用变量
堆 由new等指令创建的对象和数组
Case cc; //在栈内存里面开辟了空间给引用变量cc,这时cc=null
cc=new Case();
1. new Case()在堆内存里面开辟了空间给Case类的对象,这个对象没有名字
2. Case()随即调用了Case类的构造函数
3. 把对象的地址在堆内存的地址给引用变量cc
二.深入理解final关键字
1、初始化问题:
—-final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值。
如果不在定义的时候或者构造函数中对final变量进行赋值的话,则生成的对象中final变量的值是未知的(编译器也会直接报错),因此必须进行初始化。
—-如果用static final同时修饰变量的话,则变量必须在定义的时候进行初始化。因为static变量属于类,在调用构造函数之前就已经被系统赋予默认值了。
final class stu{
private final int a;
public stu(int b) {
this.a = b;
}
public int getA() {
return a;
}
}
public static void main(String[] args) {
stu s = new stu(12);
System.out.println(s.getA());
stu ss = new stu(11);
System.out.println(ss.getA());
}
要想改变a值,只能在构造函数中改变;
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类。
2、继承问题
Final类 :当关键字fina用来修饰类时,其含义是该类不能在派生子类。只有当需要确保类中的所有方法都不被重写时才应该建立最终(final)类,final关键字将为这些方法提供安全,没有任何人能够重写final类中方法,因为不能继承。
Final方法、成员变量:当用final关键字修饰方法后,该方法在子类中将无法重写,只能继承。
3.Final和Static
Static作用于成员变量用来表示只保存一份副本,而Final的作用是用来保证变量不可变。
Static修饰的属性强调它们只有一个,Final修饰的属性表明是一个常数(创建后不能被修改)。
public class Demo1 {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println("i:"+myClass1.i);
System.out.println("i:"+myClass2.i);//i可变
System.out.println("j:"+myClass1.j);
System.out.println("j:"+myClass2.j);//staic不变
}
}
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
static在类加载时候加载,之后初始化对象就不变了。
final在每次新建对象时候都