成员变量和局部变量的区别
1)书写位置不同
局部变量:在方法定义中或者方法声明上
成员变量:在类中方法外 (范围大)
2)内置中的位置不同
局部变量:在栈内存中
成员变量:在堆内存中
3)生命周期不同
局部变量: 随着方法调用而存在,随着方法调用结束而消失
成员变量:随着对象的创建而存在, (跟对象有关系:类名 对象名= new 类名();)随着对象的创建完毕等待垃圾回收器空闲的时候回收掉,而消失!
4)初始化值不同
局部变量:要么先定义,后面初始化;要么直接直接初始化 在使用之前必须初始化,否则报错 "可能尚未初始化变量"
成员变量:存在系统默认初始化,可以不赋值,可以赋值,但是不一般不会直接赋值
都是通过对象名.成员变量名=赋值;
形式参数如果是基本数据类型,形参的改变不会影响实际参数
如果形式参数是引用数据类型,(数组,类,接口),他们作为形式参数,
形式参数的改变会直接影响实际参数,他们都是空间地址值传递
String作为引用数据类型,是一种特殊的引用类型,
它作为形式参数的效果和基本类型是一致的,形参的改变不会影响实际参数
(因为String是常量)
String str = "abc" ;
//定义一个学生类
class Student{
//成员方法
public void study(){
System.out.println("Good Good Study ,Day Day Up!!!");
}
}
//StudentDemo类
class StudentDemo{
//成员方法
public void method(Student student){//形式参数Student类型,引用类型
student.study() ;//什么才能访问学生类的study方法呢?
//学生对象才能访问study方法呀!!
//实际参数需要创建Student类对象才能访问study()
//下面的实际参数就是s---代表学生对象
//s.study() ;
}
}
//测试类
public class StudentTest {
public static void main(String[] args) {
//需求:调用StudentDemo类中的method方法?如何访问呢?
//1)创建StudentDemo类对象
StudentDemo studentDemo = new StudentDemo() ;
//一看到,当前method方法中有一个Student类型,所以需要创建Student类的对象
Student s = new Student() ;
studentDemo.method(s);//实际参数,形式参数是Student类型
}
}
匿名对象的格式:
new 类名() ; 不需要在栈内存开辟空间,
直接堆内存申请空间
匿名的好处:
1)在实际开发中,匿名对象不要多次,
使用一次即可,使用完毕之后,立即就被垃圾回收器回收了
(因为没有栈内存变量指向堆内存地址)
2)匿名对象可以作为参数传递
3)匿名对象 从内存角度考虑,节省内存
关键字----叫"this",来区分成员变量和局部变量
this:代表的是当前类对象的地址值引用!
this.变量名---->变量名---->成员变量名 (对象.成员变量)
//使用私有化对程序封装
public class Phone {
private String brand;
private int price;
private String color;
private String memory;
public String getBrand(){
return brand;
}
public void setBrand(String brand){
this.brand=brand;
}
public int getPrice(){
return price;
}
public void setPrice(int price){
this.price=price;
}
public String getColor(){
return color;
}
public void setColor(String color){
this.color=color;
}
public String getMemory(){
return memory;
}
public void setMemory(String memory){
this.memory=memory;
}
public void callPhone(String name){
System.out.println("打电话给某人"+name);
}
public void sendMes(String name){
System.out.println("发消息给"+name);
}
public void playGame(String gamename) {
System.out.println("玩" + gamename + "游戏");
}
}
//测试类
public class PhoneTest2 {
public static void main(String[] args){
Phone pho=new Phone();
pho.setBrand("小米12");
pho.setColor("白色");
pho.setPrice(4399);
pho.setMemory("128G");
System.out.println("手机品牌是" + pho.getBrand() + " 颜色是" + pho.getColor() + " 价格是" + pho.getPrice() + " 内存是" + pho.getMemory());
pho.callPhone("杨同事");
pho.sendMes("王小二");
pho.playGame("LOL");
}
}