面向对象3_关键字【this】【static】【final】

来源:互联网 发布:郑州360排名优化 编辑:程序博客网 时间:2024/06/03 14:18


this关键字

this.变量名 代表当前对象

只要在本类中用到了本类的对象,通常都用this

局部变量和成员变量同名时,用this区分,

没有this则不能访问堆内存中的成员变量相当于

       int x=3;

x=x;//在栈内存中给自己赋值

this就是所在函数所属对象的引用,哪个对象调用了this,this就代表那个对象

this是被对象调用,主函数中p持有当前对象地址,将地址赋给this;

Person(name)执行完之后弹栈

内存图解




this在构造函数中的调用(分步初始化)

Person(String name,int age){                          //用括号内 (name)来区分,空参数则为this.();       this(name);// 只能定义在构造函数的第一行,因为初始化动作要先执行       this.age=age;}Ø        this(参数),参数可以是参数名(name),也可以是具体的值(“小强”) Ø        构造函数之间调用应避免递归(相互调用),否则会导致栈内存溢出

Ø        this关键字的应用:对象之间的比较

p1和p2两个对象对比public boolean compare(Person p){return this.age==p.age;}

static关键字

static修饰的变量被对象共有

随着类加载而加载,可以不用创建对象而直接用类名访问

 

static的特点:

1,static是一个修饰符,用于修饰成员。

2,static修饰的成员被所有的对象所共享。

3,static优先于对象存在,因为static的成员随着类的加载就已经存在了。

4,static修饰的成员多了一种调用方式,就可以直接被类名所调用 。 类名.静态成员 。

5,static修饰的数据是共享数据,对象中的存储的是特有数据。

 

成员变量和静态变量的区别?

1,两个变量的生命周期不同。

       成员变量随着对象的创建而存在,随着对象的被回收而释放。

       静态变量随着类的加载而存在,随着类的消失而消失。

2,调用方式不同。

       成员变量只能被对象调用。

       静态变量可以被对象调用,还可以被类名调用。

3,别名不同。

       成员变量也称为实例变量。

       静态变量称为类变量。

4,数据存储位置不同。

       成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据.

       静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据.

静态使用的注意事项

1,静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)

a)        注:静态方法要访问非静态成员必须通过对象,否则编译失败

2,静态方法中不可以使用this或者super关键字。(没有对象)

3,主函数是静态的。

       静态成员变量前面省略类名,非静态成员变量前面省略this

b)主函数中通过创建对象访问非静态成员

 

主函数的特殊之处:

格式固定  被jvm识别和使用

public:因为权限必须是最大的。

static:不需要对象的,直接用主函数所属类名调用即可。

void:主函数没有具体的返回值。

main:函数名,不是关键字,只是一个jvm识别的固定的名字。

String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。           args        arguments

给主函数传值

 

如果有具体的返回值,必须写return语句

静态内存图解


静态什么时候用?

1,静态变量

       当分析对象中所具备的成员变量的值都是相同的 。这时这个成员就可以被静态修饰。

       只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。

       如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。

 

2,静态函数

       函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据

       简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。

       如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,

       但是非静态需要被对象调用,而仅创建对象调用非静态的

       没有访问特有数据的方法,该对象的创建是没有意义。

3,静态代码块

       随着类的加载而执行,而且只执行一次

       用于给类初始化

构造代码块

创建几个对象就运行几次,可以给所有对象进行初始化  (通用性)

构造函数是给对应的对象进行针对性的初始化                  (针对性)

        类中的构造代码块调用一般方法使用

局部代码块       限定局部变量的生存周期

执行顺序:静态代码块>构造代码块>构造函数

 

数组工具中静态的使用,

用new创建数组工具对象访问成员函数       

工具类 只提供封装方法而不访问特有数据

给方法加静态直接用类名调用静态函数                      

不需要对象,私有化构造函数阻止其他类创建对象


final关键字

继承的弊端:打破封装性

final关键字:

1,final是一个修饰符,可以修饰类,方法,变量。

2,final修饰的类不可以被继承。

3,final修饰的方法不可以被覆盖。

4,final修饰的变量是一个常量,只能赋值一次。

为什么要用final修饰变量。其实在程序如果一个数据是固定的,

那么直接使用这个数据就可以了,但是这样阅读性差,所以它该数据起个名称。而且这个变量名称的值不能变化,所以加上final固定。

 

       写法规范:常量所有字母都大写,多个单词,中间用_连接。

                            变量首单词小写,第二个单词首字母大写

开发中凡是固定的值都用final表示,static和final通常一起出现

public static final double MY_PI=3.14      //全局常量



原创粉丝点击