黑马程序员技术交流社区
标题:
this,super,static,final关键字详解
[打印本页]
作者:
创造命运
时间:
2013-9-10 13:37
标题:
this,super,static,final关键字详解
本帖最后由 创造命运 于 2013-9-10 13:40 编辑
一、this详解:
this是什么:
this是一个引用类型
在堆中的每一个Java对象上都有this
this保存内存地址指向自身
this能用在哪些地方
第一:this可以用在成员方法中
this用在成员方法中,谁去调用这个成员方法,this就代表谁
this指的就是当前对象
第二:this可以用在构造方法中
语法:this(实参); 该语句必须出现在构造方法的第一行,且在该构造函数中只能有一条该语句
通过一个构造函数去调用另一个构造方法
目的:代码重用
this不能用在静态方法中
静态方法的执行不需要Java对象的存在,直接使用类名. 的方法即可
而this代表的是当前对象,所以静态方法中根本没有this
二、super关键字:
super不是一个引用类型,它表示的是当前子类对象的父类型的特征
什么时候使用super?
子类和父类中都有某个数据,例如,子类和父类中都有name这个属性,如果要在子类中
访问父类中的name属性,需要使用"super."
super可以用在什么地方?、
1.super可以用在成员方法中
在子类中访问父类中的成员属性,需要使用"super."
2.super可以用在构造方法中
语法:super(实参);
作用:通过子类的构造方法去调用父类的构造方法,给当前子类对象的父类型特征赋值
语法规则:一个构造方法中的第一行如果没有this(...),也没有显示的去调用super(...),
系统会默认调用super();
注意: super(...);的调用只能放在构造方法的第一行
super(...);调用了父类的构造方法,但是并不会创建父类型对象
结论:1.super(...)和this(...)不能同时存在在同一个构造方法中
2.在Java语言中,只有是创建了Java对象,那么Object类中的构造方法一定会执行
3.一个类Person,类Student继承了Person。如果子类创建对象时所调用的构造方法的第一行没有
this(...),也没有显示的去调用super(...),那么父类中一定要定义一个无参的构造方法,否
则编译会出错。
3.super不可以用在静态方法中,与this一样
三、static关键字:
1.static修饰的变量是:静态变量
变量分类:
局部变量(栈区)
成员变量(实例变量,非静态变量)(堆区)
每一个对象一份,在创建对象的时候初始化,存储在堆中的每个对象中
静态变量(方法区)
所有的Java对象共享一份,静态变量是类级别的
在类加载阶段赋值,且只赋值一次(初始化一次)
结论:如果一个属性是所有的对象都有,并且这个属性的值是相同的,则该属性声明称静态的属性
静态变量可以使用"类名."方式访问,也可以使用"引用."方式访问(底层仍然使用的是"类名."方式)
2.static修饰的方法是:静态方法
可以使用"类名."方式调用,也可以使用"引用."方式调用(底层仍然使用的是"类名."方式)
静态方法中不能直接访问非静态数据
静态方法中不能使用this
一般情况下工具类中的方法大不封都是静态方法,不用创建对象就可以直接调用该方法
3.static还可以定义静态语句块:
如static{System.out.println("java")};
关于静态方法与空指针异常:
class Test()
{
static String name = "java";
public static void main(String[] args)
{
Test t1 = new Test();
//静态的方法按照正规的方式访问:"类名."
//静态的方法也能用“引用.”方式访问
//编译阶段检查出t1是Test类型,编译通过,运行的时候,仍然使用“类名.”方式
t1.method2(); //调用该方法不需要对象
t1 = null;
//空的引用去访问成员的时候会出现空指针异常
//method2方法不是“成员”,而是静态方法。 name变量是静态变量
//所以即使引用是空的,也不会报空指针异常
t1.method2();
System.out.println(t1.name);
}
public void method1()
{
System.out.println("java1");
}
public static void method2()
{
System.out.println("java2");
}
}
关于代码的顺序
public class Test
{
static
{
System.out.println(i);
}
static int i = 100;
}
//上面的代码在编译时会出错,原因是静态语句块跟静态变量都是在类加载阶段执行
//是按顺序执行的,所有在执行到System.out.println(i);时,出现非法向前引用的错误
//将static int i = 100;移到静态语句块前面就对了
四、final关键字:
final变量的定义:rate_aaa_bbb(下划线法),一般不用驼峰法
final----概念:表示不可改变的含义
1、当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰
2、当不希望类的某个变量的值被修改,可以用final修饰
3、当不希望类被继承时,可以用final修饰
4、final修饰的变量必须显示的初始化,局部变量一旦赋值就不能被改变,成员变量必须手动赋初始
值,不能使用系统默认值
5、如果修饰的引用,那么这个引用只能指向一个对象,也就值说这个引用不能再次赋值,但被指向
的对象的属性是可以修改的。
6、构造方法不能被final修饰
7、抽象类不能被final修饰,抽象方法不能被final修饰。
8、会影响JAVA类的初始化:final定义的静态常量调用时不会执行Java的类初始化方法,也就是说不
会执行static代码块等相关语句,这是由Java虚拟机规定的。
final----注意事项:
1、final修饰的变量又叫常量,一般用xx_xx_xx类命名
2、final修饰的变量在定义时,必须赋值,并且以后不能再赋值
final----什么时候用
1、因为安全的考虑,类的某个方法不允许被修改
2、类不会被其他的类继承
3、某些变量的值是固定不变的,比如圆周率
作者:
木子轩
时间:
2015-2-15 19:16
恩呢,学习呢.......
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2