一、局部变量和成员变量
局部变量:定义在方法中的变量称之为局部变量。
作用域:从定义的位置开始到整个方法结束。
成员变量:定义在方法外,类内的变量叫做成员变量(全局变量)。
作用域:整个类体内。
区别:
1.声明位置不同:局部变量在方法中;成员变量在类体中。
2.作用范围不同:局部变量是当前类的方法,成员变量是当前的方法。不同的方法中即使有同名的局部变量也互不影响。
3.内存存放的位置的:局部变量在栈内存中,成员变量在堆内存中。
4.成员变量有默认值;局部变量没有默认值。
代码输出结果:20 20 10 30 10
public class VarDemo {
static int age=20;
public void test(){
System.out.println(age);
age=10;
System.out.println(age);
int age=30;
System.out.println(age);
}
public void show(){
int a=10;
String name="Alen";
System.out.println(age);
}
public static void main(String[] args){
System.out.println(age);
new VarDemo().test();
System.out.println(age);
}
}
二、引用类型
Java语言中除基本类型之外的变量类型都称之为引用类型。
Java中的对象和数组是通过引用对其操作的。
引用可以理解为一种受限的指针
指针时可以进行与整数做加减运算的,两个指针之间也可以进行大小比较运算和相减运算的。引用不行,只能进行赋值运算。
引用就是一个变量或对象的别名(引用的本质是一个对象);指针是一个段内存空间的地址(指向存储一个变量值的空间或一个对象的空间)。
三、内存分析
栈(static):
存放:局部变量
先进后出,自上而下存储
方法执行完毕,自动释放空间
堆(heap):
存放new出来的对象
需要垃圾回收器来回收:System.gc()
方法区(method area):
存放:类的信息(代码)、static变量、字符串常量等。
四、构造方法
创建对象的时候默认会调用构造方法来创建对象,(在堆中开辟空间),可以完成某些成员变量的初始化操作。
构造方法的语法:
方法名称:构造方法名称必须跟类的名称保持一致。
访问修饰符:略。
形参:可以用户定义添加,跟方法的普通参数一样。
方法体:完成对象的初始化功能。
返回值:没有返回值。
注意:
1.创建完类之后,如果没有手动调用构造方法,会有一个默认的无参的构造方法供调用。
2.当用户自定义了构造方法之后,默认的无参构造方法就不能够使用了,必须要手动定义无参构造方法。
3.同一个类中可以包含多个同名的构造方法。
重载:
在一个类中可以包含多个重名的方法,但是注意方法的参数列表不能相同。
三个方面的不同:
1.参数的个数不同
2.参数的类型不同
3.参数的顺序不同
注意:
一般构造方法都会进行重载(一个类中可能包含多个属性值,当只需要给部分属性初始化的时候需要调用不同的构造方法)。
代码输出结果:Marry 30 haha lisa 29 hihi Bob
public class Teacher {
String name;
int age;
public Teacher(){
}
public Teacher(String Name){
System.out.println("hihi");
name=Name;
}
public Teacher(String Name,int Age){
System.out.println("haha");
name=Name;
age=Age;
}
public void teach(){
System.out.println("start");
}
public static void main(String[] args){
Teacher teach =new Teacher();
teach.name="Marry";
teach.age=30;
System.out.println(teach.name);
System.out.println(teach.age);
Teacher teacher2=new Teacher("lisa",29);
System.out.println(teacher2.name);
System.out.println(teacher2.age);
Teacher teacher3=new Teacher("Bob");
System.out.println(teacher3.name);
}
}
五、构造器
构造器定义:constructor构造方法。
一个在创建对象时被自动调用的特殊方法。
构造器作用:
为对象进行初始化(成员变量)工作。
构造器是一种特殊的方法:
构造器的方法名必须和类名一致。
构造器虽然没有返回值,但是不能定义返回类型(返回值的类型肯定是本类),不能构造器里调用。
如果我们没有定义构造器,则系统会自动定义一个无参的构造方法。如果已定义,则编译器不会添加无参构造方法。
与普通方法一样,构造方法也可以重载。
例题:定义一个“点”(Point)类用来表示二维空间中的点标。要求如下:
1.可以生成具有特定坐标的点对象。
2.提供可以设置两个坐标的方法。
3.提供可以计算该“点”距另外点距离的方法。
public class Point {
int x;
int y;
public void set(int xx,int yy){
x=xx;
y=yy;
}
public double calcDistance(Point p){
return Math.sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y)-y);
}
public static void main(String[] args) {
Point p1=new Point();
p1.set(3,0);
Point p2=new Point();
p2.set(0,4);
System.out.println(p1.calcDistance(p2));
}
}
六、this关键字
this的作用:
this表示的是当前对象本身,更准确地说,代表当前对象的一个引用。
普通方法中使用this
区分类成员属性和方法的形参。
调用当前对象的其他方法(可以省略)。
构造方法中使用this
当构造方法中的参数名称跟类的成员变量名称一样的时候,可以使用this代表当前对象。
位置:必须是第一条语句。
this不能用于stati方法。
理解代码:
public class ThisDemo {
String name;
int age;
//构造方法中使用this
public ThisDemo(String name,int age){
this.name=name;
this.age=age;
}
//普通方法中使用this
public void test1(){
System.out.println("test1");
}
public void test2(){
System.out.println("test2");
this.test1();
//成员变量中使用this
System.out.println(this.name);
}
public static void main(String[] args) {
ThisDemo td=new ThisDemo("Lili",40);
System.out.println(td.name);
System.out.println(td.age);
td.test2();
}
}
七、static关键字
在类中,用static声明的成员变量为静态成员变量,或者叫做:类属性,类变量。
普通变量在使用的时候,必须要通过对象名进行调用。
类变量或者静态变量可以使用对象名也可以使用类名进行调用。
静态变量在创建对象之前被初始化,或者说在类被载入之前进行初始化。
成员变量在堆中,static变量置于方法区中。
静态变量不能定义在静态方法中进行调用。
静态方法中不能直接调用非静态方法。
用static声明的方法为静态方法
不需要对象,就可以调用(类名.方法名)。
在调用该方法时,不会将对象的引用传递给它,所以static方法中不可访问非static的成员。
静态方法不能以任何方式引用this和super关键字。
静态属性的访问形式
(1)对象名.属性
(2)类名.属性
静态方法
访问修饰符static返回值类型 方法名(){}
访问形式
(1)对象名.方法名();
(2)类名.方法名();
理解代码:
public class StaticDemo {
String name="Alen";
static int age=10;
public static void main(String[] args){
StaticDemo staticDemo=new StaticDemo();
//使用对象进行调用
System.out.println(staticDemo.name);
System.out.println(staticDemo.age);//10
staticDemo.age=20;
System.out.println(staticDemo.age);//20
System.out.println(StaticDemo.age);//20
StaticDemo.age=30;
System.out.println(staticDemo.age);//30
System.out.println(StaticDemo.age);//30
StaticDemo staticDemo1=new StaticDemo();
System.out.println(staticDemo1.age);
//使用类名调用,报错
//System.out.println(StaticDemo.name);
//System.out.println(StaticDemo.age);
}
}