1、作用域不同:
成员变量的作用域在整个类内部都是可见的;
局部变量的作用域仅限于定义它的方法。
2、初始值不同:
Java会给成员变量一个初始值;
Java不会给局部变量赋予初始值。
二、 Java中的static使用之静态变量
Java中被static修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名进行访问,也可以使用方法名进行访问。鉴于它们的特殊性,更推荐使用类名访问。
Java中的static使用静态方法
1、静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。
2、在普通成员方法中,可以直接访问同类的非静态变量和静态变量。
3、静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。
Java中的static使用之静态初始化块
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
package com.dong;
public class Telephone {
int num1;
int num2;
static int num3;
public Telephone(){
num1 = 91;
System.out.println("通过构造方法为变量num1赋值.");
}
{//初始化块
num2 = 72;
System.out.println("通过初始化块为变量num2赋值.");
}
static{//静态初始化块
num3 = 33;
System.out.println("通过静态初始化块为静态变量num3赋值.");
}
public static void main(String[] args){
Telephone phone = new Telephone();
System.out.println("num1:"+phone.num1);
System.out.println("num2:"+phone.num2);
System.out.println("num3:"+num3);
Telephone phone2 = new Telephone();
}
}
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。结果为:
通过静态初始化块为静态变量num3赋值.
通过初始化块为变量num2赋值.
通过构造方法为变量num1赋值.
num1:91
num2:72
num3:33
通过初始化块为变量num2赋值.
通过构造方法为变量num1赋值.
package com.dong;
public class Outer {
private String name = "dong";
public class Inner{
private String name = "dong2";
public void show(){
System.out.println("访问内部类中的name:"+name);
System.out.println("访问外部类中的name:"+Outer.this.name);
}
}
public static void main(String[] args){
Outer out = new Outer();
Inner in = out.new Inner();
in.show();
}
}
定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即: 内部类 对象名 = 外部类对象.new 内部类( );结果为:
访问内部类中的name:dong2
访问外部类中的name:dong
package com.dong;
public class Outer {
private static String name = "dong";
private int id = 12;
public static class Inner{
private String name = "dong2";
public void show(){
System.out.println("访问外部类中的id:"+new Outer().id);
System.out.println("访问内部类中的name:"+name);
System.out.println("访问外部类中的name:"+Outer.name);
}
}
public static void main(String[] args){
Inner in = new Inner();
in.show();
}
}
创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();结果为:
访问外部类中的id:12
访问内部类中的name:dong2
访问外部类中的name:dong
尽管对象的内容相同,对象的应用却不同,==和!=比较的就是对象的引用。
equals()方法比较对象的实际内容。