Ps:括号中的内容为自身理解,看到可以略过。本人喜欢想些乱七八糟的东西。
类继承:子类继承父类的状态和行为,同时也可以具有自己的特征。
(简单来讲,就是基因(非private)继承,同时自己经过环境变异增强得到自己独有的(自己定义的方法和变量))
方法覆盖也称为重写,即在子类为父类的同名方法提供一个不同的实现(必须有继承关系)。
(类似于父亲数学好,当了数学老师,儿子数学好,当了经济学家)maybe?
重写特征:
1、重写的方法必须与原方法有相同的方法名、参数列表和返回值类型。(数学好当然就是数学好了,怎么能变成肌肉大呢)
2、final类型无法重写,因为final类型为常值,一但赋值便不能改变。(不可遗传基因突变?自带的)
3、private类型无法重写,重写了也无关。(你无法继承父亲独有的特点,继承不了咋另作他用,重写了也是你模仿的)
4、父类的static可以被继承,但不能被重写。如果父类中的方法为静态,而子类重写了完全一样的方法,父类的方法就会被隐藏。(长江后浪推前浪)但父类中隐藏的static仍然可以用“类名.方法名”调用。
如果父类是static,子类不是。但是满足重写条件,此时会出现编译错误。(编不下去了,理解不了就硬背吧)
5、重写的方法的访问权限不能比原方法低,但是可以高。
6、重写抛出的异常的范围不能比原方法更多,但是可以更少。
7、发生在运行阶段。
父类代码:
package example.csdn;
public class Father {//父类
public char last_name;//姓
private String first_name;//名
public final String vehicle;//家族汽车
public Father() {
last_name = '张';
first_name = "三十";
vehicle = "红旗";
}
public Father(char Lname,String Fname,String Carname) {
last_name = Lname;
first_name = Fname;
vehicle = Carname;
}
public void called() {
System.out.println("My name is "+first_name+last_name);
}
public void GoodAtMath() {
System.out.println("I'm good at math,So i am math teacher");
}
}
子类代码:
package example.csdn;
public class Son extends Father{
private String Son_first_name;
public Son() {
Son_first_name = "四十";
}
@Override
public void called() {
System.out.println("My name is "+Son_first_name+last_name);
}
public void drive() {
//vehicle = "五菱宏光";//出错
System.out.println("I'm going for a ride in my"+vehicle);
}
public static void listen(String music) {
System.out.println("I'm bored listening to "+music);
}
}
很明显,你爹的名字都敢用,肯定错了。
自己搞个名字,这样才可以
继承过来的明明时红旗,怎么能是五菱宏光呢。很明显,final定义的常量类型可以被继承,但是不能被修改。
这里的Father f = new Son() 相当于一个子类转父类的向上转型, 即指父类 Father 引用 f 指向子类 Son 对象,这时候因为使用的是父类引用,所以方法都是以父类为主,如果子类对父类方法进行重写的话,这时候调用的会是子类的。
在这里,父类的方法被重写,所以f.called和s.called的结果都是子类重写后的方法结果。而static类型的listen方法并不能被重写,所以f.listen使用的还是父类的static方法,而s.listen 用的就是子类自己定义的 static 方法。
方法重载,即 一个类中定义多个名称相同但参数不同的方法(发生在同一个类当中)。
重载特征:
1、方法名必须相同。(否则会报错)
2、方法的参数列表必须不同。(参数的个数、类型、顺序不同,满足其中一个即可,也可以同时满足)
3、方法的返回值的类型不做要求。
4、重载发生在编译器编译阶段,编译器根据参数的不同调用相应的方法。
5、调用重载的方法时还可能发生自动类型转换。
6、可以声明新的或更广的检查异常。
这里是构造方法重载,其他方法重载与这个类似。
(方法重载,相当于用另一个号介绍自己吧,表面上是个学生,实际上是个🐭🐭?)
重写和重载的区别:
1、重写只能用于子类,而重载用于同一类中。
2、重写的方法名、参数列表、返回值类型必须相同,重载的参数列表必须不同,返回值类型任意。
3、重写对方法的访问权限和抛出异常有特殊的要求,而方法的重载没有这方面的限制。
4、父类的方法只能被同一子类重写一次,而一个方法可以被重载很多次。
5、重写是运行时的多态,重载是编译时的多态。
6、重写与重载都与参数名无关。