目录
一、this
- 首先要知道,this是一个关键字,翻译为这个
- this是一个引用变量,所以它里面存放的是地址,但这是一个特殊的地址,它里面存放的是指向他自身的地址。
-
package com.ThisTest; public class Student { private String name; public Student(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void work(){ System.out.println(this.getName()+"在工作"); } }
以上是一个student类,观察下面的测试类
package com.ThisTest; public class TestMain { public static void main(String[] args) { Student s=new Student("张三"); s.work();//输出结果为:张三在工作,因为s调用student中的work方法,s就是this Student s2=new Student("李四"); s2.work();//输出结果为:李四在工作,因为s2调用student中的方法,s2就是this } }
所以无论那个对象调用某个包含this的方法,this就代替哪个对象
-
this只能出现在实例方法中,不能出现在静态方法中,即this不能出现在方法的修饰符列表上带有static关键字的方法中,如public static void main()这个方法中。
-
的大部分情况下this可以省略不写,但在用于区*部变量和实例变量的时候不能省略。一般在使用构造方法和set()时,无论使用idea还是eclipse基本都是自动生成的,所以可能会没有注意到这儿地方,所以大家要记住在构造方法和set中this是不可以省的。
二、super
- this和super的都是Java中的关键字,使用方法是差不多的,但是他不是一个引用变量(什么变量都不是),里面不存放地址,代表的是当前对象的父类特征。
- super不能出现在带有static关键字的方法中。在构造方法的第一行,Java会默认提供一个super(),也可以用super(实参)手动调用父类中的方法,如果在构造方法中手动加一个super()的话,一定要写在构造方法第一行。
-
package com.SuperTest; //customer为父类 public class Customer { private String name; private int age; public Customer(String name) { this.name = name; } public int getAge() { return age; } public void setAge(){ this.age=age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void welcome(){ System.out.println("你好!"); } }
package com.SuperTest; //vip为子类 public class Vip extends Customer { public Vip(String name) { super(name);//super用法之一:super(实参) } public void show(){ System.out.println(this.getName()+"你好");//前面的this一般是会省略的 System.out.println(super.getName()+"你好");//super用法之二:super.属性名 super.welcome();//super用法之三:super.方法名 } }
package com.SuperTest; public class TestMain { public static void main(String[] args) { Vip v=new Vip("张三"); v.show(); } }
最后的输出结果为张三你好、张三你好、你好!。customer为父类,VIP为子类,在父类中写一个name属性,在子类即VIP中继承下来,所以给子类中的name赋值之后,再在子类中用super,就会赋值给父类中的name属性。
- 总结以下super的用法:
- super(实参):用在构造方法的第一行,用来调用父类构造方法
- super.属性名:访问父类中的属性
- super.方法名:访问父类中的方法
三、static
物体A和物体B有共同的特性,将这些共同的特性抽象出来行一个模板、一个概念,就形成了一个类。比如说中国人张三和李四,他俩的共同特性:都有姓名,年龄,性别,国籍......可以将他们构成一个类Chinese,到时候在通过new构造方法创建张三李四等不同的对象,每创建一个对象就会占用一块内存空间(姓名,年龄,国籍等占用空间)。这里面有一个属性的值是所有对象都一样的(国籍),都是中国人,如果在调用构建构造方法的时候,每创建一个对象就对国籍赋一次值,会浪费不必要的内存空间。所以此时可以将国籍提升为一个模板,这时就需要加一个static关键字了,同时赋值。即private static String country="中国",这样就不用再创建对象时再给国籍赋值了,也减少了不必要的内存的浪费
四、final
- final是一个关键字,表示最终的
- 被final修饰的类不能被继承
- 被final修饰的方法不能被重写
- 被final修饰的属性的值一旦确定了不能被修改
- final和static一起使用用来定义常量
public final class A{ }//被final修饰的类不能被继承
public class B extends A{ } //错误 ,因为A被final修饰
public class C{ public final void m(){......} } //被final修饰的方法不能被重写
public class D extends C{ public void m(){......} } //错误,因为m被final修饰
public class Test{
public static void main(string[]args){
fianl int a=10; //被final修饰的属性的值一旦确定了不能被修改
a=21; // 错误,因为a被final修饰
public static final String COLRE="red";//final和static一起使用用来定义常量
}
}
五、finalize与fianlly
1、finalize
fianllize是object类中的一个方法,源码是:
protected void finalize()throws Throwable{
}
里面没有任何代码,只有一个方法体,这个方法在什么时候会被调用呢?当Java中的对象成为垃圾时,jvm就会自动启用垃圾回收器,垃圾回收器自动调用fianlize这个方法,不需要程序员手动调用,fianlize()其实是sun公司为Java程序员提供的一个垃圾销毁时机,希望在垃圾销毁时需要执行一段代码的话,就需要写在这个地方就可以,就相当于人在和这个美丽的世界说拜拜之前留下的遗言,所有的类都是直接或间接继承object类,所以我们只需要讲这个fianlize()进行重写就可以了。但垃圾回收器不会轻易启动,但可以通过System.gc()这个方法,提高启动的效率,效率只是提高了而已,并不是就会启动。
2、finally
finally子句中的代码都是最后执行的,而且是一定会执行的,finally必须和try一起使用,和try一起使用的时候可以没有catch,但不可以只和catch使用。即使try{。。。}catch{。。。}语句中的代码出现了异常也一定汇之星finally里面的语句块,所以在fianlly中一般完成资源的释放和关闭。
package com.SuperTest;
public class TestMain {
public static void main(String[] args) {
try {
System.out.println("我是第一步执行的");
return ;//第三步执行return语句
}finally {
//如果以下这段代码块不放在finally语句中,那么下面这句话就不会执行了
System.out.println("我是第二步执行的");
}
}
}