变量(Variable)
- 声明:[修饰符列表] 类型 变量名;
- 变量是以变量名所对应的内存地址为起点的一段内存,内存中存其值;内存大小由数据类型来决定。
- 变量分为成员变量和局部变量,成员变量包括静态变量和实例变量。
成员变量
在类体中或在方法外声明的变量为成员变量,加static关键字为静态变量,不加的为实例变量。
• 静态变量:
- 不需要创建实例对象,直接使用类名进行访问,支持引用来访问(不建议),在方法区分配内存。
- 初始化:类加载的时候不手动赋值按默认值初始化。
- 生命周期:类加载的时候,会给静态变量分配内存,jvm退出的时候会释放掉。
• 实例变量:
- 只有在创建了实例对象之后才会被分配空间,使用引用来访问。当引用为null时访问,会出现空指针异常。在堆中分配内存。
- 初始化:创建对象的时候不手动赋值按默认值初始化。
- 生命周期:new对象的时候,开辟出内存空间·,对象没有引用的时候会变成垃圾回收器回收。
局部变量
- 在方法内声明的变量为局部变量,局部变量存储在栈中。
- 局部变量没有缺省值,必须手动赋值。
在什么时候声明静态变量,什么时候声明为实例变量?
- 字段描述了现实世界中的事物的属性(静态方面)。
• 静态变量相当于类级别的属性(字段),描述一类事物的共同特征可声明为静态变量。
• 实例变量相当于对象级别的属性(字段),描述一个对象的独有特征可声明为实例变量。
• 此处拿中国人来举个例子,都是黄皮肤,黑头发,可以声明为静态变量,每个中国人都有不同的名字,不同的身高,体重,可以声明为实例变量。
方法(Mothed)
- 定义:[修饰符列表] 返回值类型 方法名([参数列表]){方法体}
- 方法是以方法名所对应的内存地址为起点的一段内存,内存存储着一组机器语言。
普通方法在内存中怎么样运行的?
- 方法不调用,在jvm中不会分配内存。
- 方法区内存是独立的,可以重复调用,方法代码片段在方法区内存中只有一份,每次调用,在栈中分配所需内存空间。
- 当方法调用时,会给该方法 分配内存空间,会在栈中发生压栈动作,方法调用结束,给该方法分配的内存全部释放掉,会发生弹栈动作。
实例方法
- 不加static为实例方法,用引用来访问。
静态方法
- 加static关键字为静态方法,用类名来访问,支持引用来访问,但是不建议。
什么时候定义静态方法,什么时候定义实例方法?
- 方法则描述了现实世界中事物的行为(动态方面),表示干什么事。
- 同类事物共有的行为定义为静态方法。
- 对象特有的行为则定义为实例方法。
方法重载(OverLoad)
- 在同一个类中,有两个或两个以上同名方法且参数不同的方法即是重载。
要求:
- 位于同一个类中。
- 方法名相同。
- 方法的参数列表不同(参数个数,参数类型,不同类型参数的顺序)。
- 与方法的返回值和修饰符列表无关。
使用方法重载的好处:
- 方便了方法的调用。
- 大大提升了代码可读性。
- 构成方法重载的方法一般作用相似
public class Example1_1{
public static void print(String str){
System.out.println("String="+str)
}
public static void print(int i){
System.out.println("int="+i)
}
public static void print(float i){
System.out.println("float"+i)
}
public static void main(String[]args){
print("123");
print(123);
print(1.23f);
}
}
构造方法
- java中每个类都有一个构造方法,它是类的一种特殊方法,构造方法与类名完全相同,对象的创建就是通过构造方法完成的,当类实例化一个对象时,类会自动调用构造方法。
构造方法特点如下:
- 构造方法没有返回值,也不用void修饰,构造方法的默认返回类型就是对象类型本身。
- 构造方法的名称要与本类的类名相同。
- 构造方法可以重载。
- 构造方法本身不能由用户直接调用,只有使用new创建对象时系统自动调用。
- 构造方法不是明确要定义的,如果在类中没有明确地给出一个构造方法,java就会自动构造一个默认的无参构造方法,只要类中定义了任何构造方法,系统就不会再提供默认构造方法。
class E{
public int x;
public int y;
public E(int x,int y){
this.x =x;
this.y =y;
}
}
public class Demo {
public static void main(String[] args) {
E e=new E(5,10);
System.out.println(e.x); //5
System.out.println(e.y); //10
}
}