一、super和this
1、this
指向自己的引用。
我之前一般都在构造函数中用this
class parents{
int x,y;
public parents(int x,int y) {
this.x=x;
this.y=y;
}
}
用法:
this.x 指向当前的x字段
this.method() 指向当前的method()方法
this() 指向当前构造方法
2、super
调用父类的构造字段用super.x;
调用父类的构造方法用super();
调用父类方法用super.method();
//接上面代码,这时我想继承parents
public class ThisSuper extends parents {
public ThisSuper() {
}
//这时ThisSuper会报错:Implicit super constructor parents() is undefined. Must explicitly invoke another constructor
//如果我在Thissuper的构造方法里,加上super(0,0);报错就消失了,因为我用super()定义了父类的构造方法。
学习中遇到的细节:
1、我试着把super写在main方法里,提示:Cannot use super in a static context。所以super不能放在静态区域里。
2、同一个方法内只能调用一次this()或super()。否则会报错:Constructor call must be the first statement in a constructor
其实extends时,就会调用super();
二、@override
override是重写父类非私有的方法,返回类型和形参都不能改变。
然后是,不能重写final方法(继承的前提)
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
上面这句话我理解是,父类方法已定义好了范围,子类重写他就必须在他范围内写,所以,父类定义了异常,子类就不能抛出更大的异常。
总而言之,重写是具体做什么时的重写,然后范围只能写小不能写大。
下面还是举个栗子:
class parents {
public int add(int a,int b){
return (a+b);
}
}
public class ThisSuper extends parents {
@Override
public int add(int a,int b){
int c=a*10+b*10;
return c;
}
public static void main(String[] args) {
ThisSuper t=new ThisSuper();
parents p=new parents();
parents pt=new ThisSuper();
System.out.println("重写后的方法:a*10+b*10="+t.add(3,4));
System.out.println("父类方法:a+b="+p.add(3,4));
System.out.println("父类类型但是用子类方法实现:add(3, 4)="+pt.add(3,4));
//输出:
/*
重写后的方法:a*10+b*10=70
父类方法:a+b=7
父类类型但是用子类方法实现:add(3,4)=70
*/
//第三条是因为父类也有这个方法,所以可以实现。
//如果父类没有这个方法,使用parents pt=new ThisSuper();就会报错The method te() is undefined for the type parents
}
}
实践时,犯了个傻乎乎的错误:打算重写父类构造函数。其实重写是在继承类后,方法之间的事情。然后构造函数是用来调用初始化的。前面也说了不用super,子类也会默认调用父类的构造函数。即无继承何来重写。
写最后一个例子的时候,想起了咦,我继承了怎么没有报错。前面写到
如果我在Thissuper的构造方法里,加上super(0,0);报错就消失了,因为我用super()定义了父类的构造方法。
再看一遍,想起来是因为父类是重载带参数的构造方法,我继承他。原因是系统会调用的是默认的无参数方法,但是因为我写了有参数的构造方法,系统不会默认生成无参数构造方法,所以才报错。
然后我除了用super(0,0);还可以在父类方法写上了无参数的构造方法。