关于成员变量与局部变量
1.局部变量:
1)是定义在方法中的(包括方法和方法中的语句块)
2)方法是在栈内存中运行的,所以定义在方法中的局部变量就处于栈内存
3)栈内存中的变量没有默认值,所以局部变量就必须初始化值,没有初始化值
就不能参加运算;
4)方法被调用了就会进栈执行,此时方法的局部变量就产生了,方法执行结束
就会从栈内存弹出(将栈内存中方法的执行空间给销毁了),方法的局部变量
也就一起销毁了;所以局部变量的作用域在其所处的方法中;
2.成员变量:
1)是直接定义在类中
2)对象的空间是在堆内存中开辟的,所以成员变量处于堆内存
3)堆内存中的变量有默认值,所有成员变量可以不初始化值,那么就是使用其默认
值的;当然也可以初始化值,而我们初始化的值并不是真正的初始化值,真正的
初始化值是默认值,我们给定的初始化值叫"显示化初始值";
4)成员变量属于对象,对象创建在堆中开辟空间,对象的成员变量产生;对象销毁,
堆中对象的空间销毁,成员变量就销毁;成员变量是随着对象的创建而产生随着
对象的销毁而销毁;
看着点代码就好理解了:
public class Demo1
{
public static void main(String[] args){
//创建对象
Person person1 = new Person();
/*
不去给对象的属性指定值,那么对象的属性值都是默认值,是真正的初始化值:
null 0 null
一旦给对象的属性指定了显示化初始值,那么显示化初始化会很快的将默认值
给覆盖了,但是其不是真正的初始化值,真正的初始化值还是默认值:
null 1 null
*/
person1.show();
person1.name = "张三";
person1.age = 21;
person1.gender = "男";
person1.show();
}
}
/*
描述类 ----> 对象
1.先定义描述类,在描述类中定义(描述)其实体所具有的属性和功能;
2.创建类的实体对象,对象就具有了类所描述的属性和功能了;
*/
//人的描述类
class Person
{
//成员属性
String name;
//定义成员变量age并指定了显示化初始化
int age = 1;
String gender;
//成员方法
public void show(){
System.out.println(name+" "+age+" "+gender);
}
}
关于基本类型传参和引用类型传参
/*
基本类型传参:
引用类型传参:
*/
public class Demo2
{
public static void main(String[] args){
/*
这个num变量是定义在main方法中的,所以属于main方法,作用域在main方法中;
*/
int num = 10;
System.out.println(num);//10
/*
基本类型传参本质是将实参变量的值传递给了形参变量,所以在方法中对形参
变量进行操作,也只是操作了方法自己的形参变量而已,不会影响实参变量的值;
1)
numAdd(num);
numAdd(10);
*/
numAdd(num);
System.out.println(num);//10
System.out.println("--------------------------");
/*
1>
addNum(num);
addNum(10);
5>
num = 30;
*/
num = addNum(num);
System.out.println(num);//30
System.out.println("------------------------------");
/*
引用类型变量传参传递的是地址,即是将实参引用变量所引用的地址传递给了
方法的形参引用变量,此时实参引用变量就和形参引用变量所引用的对象地址
相同了,即就是形参引用变量和实参引用变量指向堆内存中同一块对象空间了
(同一个对象的两个引用而已);
所以,形参引用变量将对象的属性值进行了修改,实参引用变量和形参引用变量是
一个对象,那么这个属性值肯定也被改了;
*/
X x = new X();
System.out.println(x.n);//100
addN(x);
System.out.println(x.n);//300
}
/*
*/
public static void addN(X y){
y.n+=200;
}
/*
方法的形参就是方法的局部变量;
numAdd方法的形参num就是方法numAdd的局部变量,所以其作用域就是在numAdd方法中;
2)
int num = 10;
*/
public static void numAdd(int num){
//3)num = 20;
num+=10;
}
/*
2>int num = 10;
*/
public static int addNum(int num){
//3>num = 30;
num+=20;
//4>return 30;
return num;
}
}
//描述
class X
{
//成员变量
int n = 100;
}
对于对象的深度理解
/* Student s = new Student();
1.new Student();
是对象,而且是真正的对象; --- 表示堆内存中的对象空间;
匿名对象 --- 没有名字,没有引用
2.s:
是对象 --- 引用变量,引用的是堆内存真正的对象的空间的地址,就代表真正的对象了;
引用对象 ---- 有名字的对象
用法:
1>引用对象和匿名对象都可以做实参;
2>引用对象只要不改变对象的引用,就能保证对象被多次使用,多次访问对象的属性值不会变,
因为始终是同一个对象;
匿名对象是每new一次就是一个新的对象(就是在堆内存中开辟出一块新的对象空间),所以
匿名对象不能重复使用;
选择依据:
大部分场景下都是使用引用对象,目的就是使对象能够被重复使用;当某个对象只被使用一次时,
就可以使用匿名对象(就是对象的方法只要求被调用一次时,就可以使用匿名对象);
*/
public class Demo3
{
public static void main(String[] args){
Student s = new Student();
s.sno = 101;
s.name = "jack";
s.age = 21;
System.out.println("---------------------");
showStu(s);//101 jack 21
System.out.println("----------------------");
showStu(new Student());//0 null 0
System.out.println("----------------------");
System.out.println(s.sno);//101
System.out.println(s.sno);//101
System.out.println(s.sno);//101
System.out.println(new Student().sno);//0
System.out.println(new Student().sno);//0
System.out.println(new Student().sno);//0
System.out.println("======================");
//多次新建对象,每次都将对象的test()方法只调用了一次
new Student().test();
new Student().test();
new Student().test();
//在多次调用s对象的test()方法
s.test();
s.test();
s.test();
}
public static void showStu(Student stu){
stu.show();
}
}
class Student
{
int sno;
String name;
int age;
public void show(){
System.out.println(sno+" "+name+" "+age);
}
public void test(){
System.out.println("你好");
}
}