一、成员变量和局部变量的区别
1、在类中的位置不同
成员变量:类中方法外
局部变量:方法内或者方法声明上
2、在内存中的位置不同
成员变量:堆内存
局部变量:栈内存
3、生命周期不同
成员变量:随着对象的存在而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4、初始化值不同
成员变量:有默认的初始化值
局部变量:没有默认的初始化值,必须先定义,赋值,才能使用。
基本类型作为形式参数,形式参数的改变不影响实际参数
引用类型作为形式参数,形式参数的改变直接影响实际参数
二、封装
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
好处:
隐藏实现细节,提供公共的访问方式
提高了代码的复用性
提高安全性。
封装原则:
将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问。
private关键字
可以修饰成员变量和成员方法,被修饰的成员只在本类中才能访问
this关键字
哪个对象调用那个方法,this就代表那个对象
this内存图
三、构造方法
构造方法的作用是给对象数据进行初始化,它的方法名与类名相同,没有返回值,void都没有。构造方法也可以重载。举例如下
class student
{
private String name;
private int age;
public student()
{
System.out.println("这是无参构造方法");
}
public student(String name)
{
System.out.println("这是带一个String类型的构造方法");
this.name=name;
}
public student(int age)
{
System.out.println("这是带一个int类型的构造方法");
this.age=age;
}
public student(String name,int age)
{
System.out.println("这是一个带多个参数的构造方法");
this.name=name;
this.age=age;
}
public void show()
{
System.out.println(name+"------"+age);
}
}
class ConstructDemo
{
public static void main(String[] args)
{
student s=new student();
s.show;
System.out.println("----------------");
student s2=new student("张三");
s2.show;
System.out.println("----------------");
student s3=new student(18);
s3.show;
System.out.println("----------------");
student s4=new student("张三",18);
s4.show;
}
}
如果你不提供构造方法,系统会给出默认构造方法,如果你提供了构造方法,系统将不再给出,建议永远自己给出无参构造方法。
四、类的初始化过程
Student s = new Student();在内存中做了哪些事情?
加载Student.class文件进内存
在栈内存为s开辟空间
在堆内存为学生对象开辟空间
对学生对象的成员变量进行默认初始化
对学生对象的成员变量进行显示初始化
通过构造方法对学生对象的成员变量赋值
学生对象初始化完毕,把对象地址赋值给s变量
五、static关键字
static关键字用于创建静态变量,它可以修饰成员变量和成员方法。static关键字随着类的加载而加载,并且优先于对象存在,能被所有类的对象共享,可以通过类名调用。需要注意的是,静态方法中没有this关键字,并且静态方法只能访问静态变量和静态方法。
举例:
class Person
{
String name;
int age;
static String country;
public Person(){}
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public Person(String name,int age,String country)
{
this.name=name;
this.age=age;
this.country=country;
}
public void show()
{
System.out.println("姓名:"+name+",年龄:"+age+",国籍:"+country);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p1=new Person("邓丽君",16,"中国");
p1.show();
Person p2=new Person("杨幂",22);
p2.show();
Person p3=new Person("凤姐",20);
p3.show();
p3.country="美国";
p3.show();
p1.show();
p2.show();
}
}
上面的代码中使用了static关键字来修饰变量country。上面的代码在运行时,首先加载class文件,随着class文件的加载,内存中的方法区加载了不同class文件的成员变量和成员方法,同时加载了构造方法,以及在方法区中的静态区加载了main方法和country变量。在执行Person p1=new Person()时,就会在栈内存中生成局部变量p1和在堆内存中生成Person类的成员变量和成员方法标记以及静态标记,并且将该片区域的地址赋值给p1。给country赋值一次后它就会保持值不变,而重新赋值后值就会改变。
static关键字内存图