7.16java学习笔记——super.this.static.final

一、super与this

(1)、在子类的构造函数中,如果需要使用super的话,必须放在代码行的第一行。

例子1:

Public  class  person{

  //父类构造函数

  Person(){

  System.out.println("人");

  }

}

Public  class  student  extends  person{

  //子类构造函数

  Student(){

  Super();//若是要调用父类的构造函数,这一句话必须写在第一行,若是写在第二行,那么前面写的所有代码又被super过来的父类的代码覆盖了。

  System.out.println("学生");

  }

(2)}、如果在子类中遇到与父类中名字相同的函数或成员变量,而我们要调用的是父类的函数或变量,则需要使用super。

例子2:

public class test {

public static void main(String[] args) {

person ren = new person();

student xuesheng = new student();

xuesheng.value();

}

}

public class person{

String name;

void value(){

name = "人";

}

public class student extends person{

String name = "学生";

void value(){

System.out.println(name);

super.value();//若不调用这一句,那么在接下来的一句中的super.name将会等于null,因为没有为之赋值

System.out.println(super.name);

}

}

(3)、若是父类中只有无参构造器,那么在子类中的无参构造器中默认有一个super(),并且是可以不写的,编译器会自动为我们添加,若是存在有参构造器,那么就必须要写super了,并且在super之后要加一个括号,括号里要填写与父类相应构造器对应的参数。

例子3:

  class Person {

    public static void prt(String s) {

       System.out.println(s);

    }

 

    Person() {

       System.out.println("A Person.");

    }

 

    Person(String name) {

       System.out.println("A person name is:" + name);

    }

}

 

public class Chinese extends Person {

    Chinese() {

       super(); // 调用父类构造函数(1

       System.out.println("A chinese.");// (4)

    }

 

    Chinese(String name) {

       super(name);// 调用父类具有相同形参的构造函数(2

       System.out.println("his name is:" + name);

    }

 

    Chinese(String name, int age) {

       this(name);// 调用当前具有相同形参的构造函数(3

       System.out.println("his age is:" + age);

    }

 

    public static void main(String[] args) {

       Chinese cn = new Chinese();

       cn = new Chinese("kevin");

       cn = new Chinese("kevin", 22);

    }

}

(4)、this也有"."和"()"两种形式:

“.”——之前介绍过;

“()”:在一个构造器中调用本类中的另一个构造器,且必须放在第一行,如例子3;

(5)、this在一个构造器中不可以调用两次;

(6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。 

(7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。 

 

 

 

二、Static

(1)、静态属性:若父类中有一个静态成员,子类在继承的时候都是共用内存中的同一个区域,这样就减小了多态性。另外,可以直接通过类来调用;

(2)、静态函数:可以直接通过类调用;

(3)、在编译的时候,凡是标记了static的方法、属性都会提前编译,并且是自上之下的编译,类似于C语言中的预处理;

(4)、静态块:是java中不从属与方法的一段单独的代码,用“{   }”括起来,编译时也是类似于预处理进行提前编译。

例子4、

public class A {

public final int t=10;

public A(){

System.out.print("A");

}

}

public class B extends A {

public B(){

super();

System.out.print("B");

}

}

public class C {

private static A a = new A();

private B b = new B();

public C(){

System.out.print("C");

}

public static void main(String args[]){

C c = new C();

c.change();

}

public  void change(){

b = new B();

}

}

输出结果:AABCAB

例子5、

若将例子4中的C类改成如下:

    public class C { 

    private static A a = new A(); 

    private B b = new B(); 

    public C(){ 

     System.out.print("C"); 

    } 

    public static void main(String args[]){ 

     C.change(); 

    } 

    public  static void change(){ 

     b = new B(); 

    } 

输出结果:AAB

 

 

 

三、Final

(1)、final类不能被继承,没有子类,final类中的方法默认是final的。

(2)、final方法不能被子类的方法覆盖,但可以被继承。

(3)、final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

(4)、final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

(5)final不能用于修饰构造方法。

(6)注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
(7)、当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
例子6、

public class Test { 

public static void main(String[] args) { 

new Test().f(2); 

public void f(final int i){ 

//i++; //i是final类型的,值不允许改变的. 

System.out.print(i); 


猜你喜欢

转载自yuyongjia.iteye.com/blog/1595850
今日推荐