一、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 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 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);
}
}