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 //全局常量