成员变量和局部变量的区别,私有化

本文详细介绍了面向对象编程中的成员变量与局部变量的区别,包括它们在类中的位置、内存中的位置、生命周期以及初始化值的不同。此外,还讲解了方法的形式参数为类名时的调用方式、匿名对象的应用场景及封装的概念与好处。
面向对象
一、成员变量和局部变量的区别
A:在类中的位置不同
    * 成员变量:在类中方法外
    * 局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
    * 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
    * 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
C:生命周期不同
    * 成员变量:随着对象的创建而存在,随着对象的消失而消失
    * 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
    * 成员变量:有默认初始化值
    * 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
    
注意事项:
    * 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
    * 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
    * 引用数据类型变量包括哪些:数组,类,接口,枚举
    
二、方法的形式参数是类名的时候如何调用
A:方法的参数是类名public void print(Student s){}//print(new Student());
    * 如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
三、匿名对象的概述和应用
A:什么是匿名对象
    * 没有名字的对象
B:匿名对象应用场景
    * a:调用方法,仅仅只调用一次的时候。
        * 那么,这种匿名调用有什么好处吗?
            * 节省代码
        * 注意:调用多次的时候,不适合。匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。
    * b:匿名对象可以作为实际参数传递

四、封装的概述
A:封装概述
    * 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
B:封装好处
    * 隐藏实现细节,提供公共的访问方式
    * 提高了代码的复用性
    * 提高安全性。
C:封装原则
    * 将不需要对外提供的内容都隐藏起来。
    * 把属性隐藏,提供公共方法对其访问。
private关键字的概述和特点
A:private关键字特点
    * a:是一个权限修饰符
    * b:可以修饰成员变量和成员方法
    * c:被其修饰的成员只能在本类中被访问
    * 封装和private的应用:
    * A:把成员变量用private修饰
    * B:提供对应的getXxx()和setXxx()方法
    * private仅仅是封装的一种体现形式,不能说封装就是私有

this关键字的概述和应用
A:this关键字特点
    * 代表当前对象的引用


成员变量局部变量是编程中两种不同类型的变量,以下从多个方面对它们进行分析比较: ### 声明位置 - **局部变量**:在方法体、形参或代码块内部声明。例如在方法`test(int j)`中,参数`j`就是局部变量;在代码块`{ int i=1; }`中,`i`也是局部变量 [^2]。 - **成员变量**:在类中方法外声明。成员变量又可分为类变量实例变量,类变量有`static`修饰,实例变量没有`static`修饰。如`static int s;`是类变量,`int i;``int j;`是实例变量 [^2]。 ### 修饰符 - **局部变量**:可以使用`final`修饰,表明该变量一旦赋值就不能再改变 [^2]。 - **成员变量**:可以使用`public`、`protected`、`private`、`final`、`static`等修饰符。`public`表示公共的,可被任何类访问;`protected`表示受保护的,可被同一包内的类不同包的子类访问;`private`表示私有的,只能在本类中访问;`final`表示常量,值不能改变;`static`表示类变量,属于类而不是对象 [^2]。 ### 值存储的位置 - **局部变量**:存储在栈中,在方法调用时加载。当方法被调用时,为局部变量分配内存,方法执行结束后,局部变量的内存被释放 [^1][^2]。 - **成员变量**: - **实例变量**:存储在堆中,在对象实例化时加载。每个对象都有自己独立的实例变量副本 [^2]。 - **类变量**:存储在方法区,在类加载时加载。该类的所有对象共享同一个类变量 [^2]。 ### 作用域 - **局部变量**:作用域从声明处开始,到所属的代码块结束。在代码块外部无法访问局部变量 [^1][^2]。 - **成员变量**: - **实例变量**:在当前类中可以使用`this.`(有时`this.`可以缺省)来访问,在其他类中需要通过“对象名.”来访问 [^2]。 - **类变量**:在当前类中可以使用“类名.”(有时类名.可以省略)来访问,在其他类中可以使用“类名.”或“对象名.”来访问 [^2]。 ### 生命周期 - **局部变量**:每一个线程,每一次调用执行都是新的生命周期。即每次方法调用都会重新创建局部变量,方法执行结束后局部变量销毁 [^1][^2]。 - **成员变量**: - **实例变量**:随着对象的创建而初始化,随着对象的被回收而消亡。每个对象的实例变量是独立的 [^2]。 - **类变量**:随着类的初始化而初始化,随着类的卸载而消亡。该类的所有对象共享类变量 [^2]。 ### 变量重名处理 - 当局部变量与实例变量重名时,在实例变量前面加“`this.`”来区分 [^2]。 - 当局部变量与类变量重名时,在类变量前面加“`类名.`”来区分 [^2]。 以下是一个示例代码,展示了成员变量局部变量的使用: ```java public class Exam5 { static int s; // 类变量,类初始化时加载,整体代码只有一个s变量 int i; // 成员变量,一个实例化类对象中有一个 int j; // 成员变量,一个实例化类对象中有一个 { int i = 1; i++; // 就近原则,为局部变量 j++; s++; } public void test(int j) { j++; // 就近原则,为局部变量 i++; s++; } public static void main(String[] args) { Exam5 obj1 = new Exam5(); Exam5 obj2 = new Exam5(); obj1.test(10); obj1.test(20); obj2.test(30); System.out.println(); System.out.println("obj1:" + obj1.i + "," + obj1.j + "," + obj1.s); System.out.println("obj2:" + obj2.i + "," + obj2.j + "," + obj2.s); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值