黑马程序员技术交流社区

标题: 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