java变量分两种:局部变量(在方法里的变量);成员变量(属于类的)
局部变量
用法:写在类方法中的变量;不能用修饰符修饰。没有默认值;必须初始化才能使用。
生命周期:语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
内存分布:局部变量是在栈上分配内存空间的
class test{
public static void main(String[] args) {
int a=100;
}
{
// 代码块里的变量
int b=100;
}
}
成员变量(分两类)
静态成员变量(有static修饰)
特点:
用法:静态成员变量一般用于声明为常量 ;有static修饰;可以用public等权限修饰符。
访问方式:
类名.变量名(在本类 类名可以省略)或者对象访问(本质还是通过对象找到这个类型;即便这个对象是null也能访问;但是不建议,idea这样访问它编译器是没有提示的)
生命周期:静态变量储存在静态存储区。程序开始时创建,在程序结束时销毁。静态成员变量永远只有一份。
默认值:数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。
import java.lang.reflect.Modifier;
public class test1 {
//说明常量;张三是唯一的一个人;而且加上final相当于是常量
public static final String name="张三";
public static int a;
public static void main(String[] args) {
System.out.println(a);//默认值是0;在本类的访问方式类名可以省略
System.out.println(test1.a);
test1 t=new test1();
System.out.println(t.a);
a=10000000;//进行修改后;这些打印的结果都改变;因为这个a是只有一个
System.out.println(a);
}
}
提个问题:如果在使用static修饰变量;不加权限修饰符会默认是什么呢?已经默认是default;你再自己手动加上default也是不行的;多此一举。
实例成员变量(无static修饰)
用法:通过对象进行访问;实例变量可以声明在使用前或者使用后
存储位置在堆里
public class test6 {
public static void main(String[] args) {
}
}
class Show{
public int sum(){
return a+b;
}
private int a=1;
private int b=1;
}
使用范围:
a:在本类普通方法里;实例变量可以直接通过变量名访问
b:静态方法只能访问静态成员(包括变量和方法),不能直接访问实例成员,除非使用对象调用。(在别的类或者静态方法访问就得通过对象访问)
静态方法
1:在静态方法内部,不能直接访问普通方法和普通成员变量(得通过对象访问)
2:但是在同一个类下普通方法内部可以直接访问静态的方法和静态成员变量。(其实本质还是通过类名调用,只是在本类下,类名可以省略)
3:所以我们想在main方法里面调用下图s1方法,得创建成静态方法
静态代码块
代码块:静态代码块(类加载的时候执行,只执行一次),实例代码块。执行速度:静态>实例>构造方法。实例是成员变量;比构造方法先加载;可以理解:构造方法的加载可能需要用到成员变量
public class Student {
public String name;
public int age;
public static String classes = "222";//班级 静态成员变量-》类变量 访问: 类名.去访问
{
name = "lisi";
System.out.println("实例代码块!");
}
static {
classes = "111";
//类加载的时候 就被执行
System.out.println("静态代码块!");
}
public Student() {
//调用本类当中 其他的构造方法
//this("wangwu",99);//必须放在构造方法里面,并且必须是第一行
System.out.println("不带参数的构造方法");
}
public Student(String name, int age) {
//this(); 不能循环调用
System.out.println("带2个参数的构造方法");
this.name = name;
this.age = age;
}
private void setStudent(String name, int age) {
this.name = name;
this.age = age;
}
public void print() {
System.out.println(this.name + " => " + this.age + "->" + Student.classes);
}
public static void func2() {
//this.print();
}
public static void main(String[] args) {
Student student1 = new Student();
System.out.println("===========");
Student student2 = new Student();
System.out.println(Student.classes);
}
}
this关键字
三种用法:
this.成员变量;能区分形参和实参变量名相同的情况;这个带this代表是成员;
this.成员方法
this();访问构造方法;只能写在构造方法里;并且是第一行。//这个挺管用的;可以不改变业务代码就能实现调用不同构造方法的效果
public class test7 {
public static void main(String[] args) {
}
}
class studet1{
public int age1;
public studet1() {
this(10);//调用有参构造方法,必须放在第一行
this.studet2(11);//访问成员方法
this.age1=100; //访问成员变量
}
public studet1(int age1) {
this.age1=age1;//区分变量名与参数名相同的情况
System.out.println(age1);
}
public void studet2(int age) {
System.out.println(age);
}
}