继承的相关概念:
继承:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承这个新定义的类即可。java通过extends关键字可以实现类与类的继承:
class 子类名 extends 父类名{ ... }
优点:1.提高了代码的复用性;
2.提高了代码的维护性;
3.让类与类之间产生关系,是多态的前提。
继承设计原则:高内聚低耦合。(内聚指自己完成某件事情的能力;耦合指类与类之间的关系。)
注意事项:1.java支持单继承,不支持多继承(C++),即只能有一个父类;
2.java支持多层继承,即 class A{} --- class B extends A{} --- class C extends B{}
3.子类只能继承父类的所有非私有的成员;
4.子类不能继承父类的构造方法,但可以通过super关键字去访问父类构造方法;
5.能自己完成的功能就自己完成,不要为了部分功能而去继承父类
扫描二维码关注公众号,回复: 4422669 查看本文章
This关键字:
可以看做是本类中的一个对象,用于区分同名的局部变量和成员变量,this指代的是成员变量。
super关键字:
可以看做是父类中的一个引用,用于区分子类中和父类中同名的成员(成员变量,成员方法),super指代的是父类中的值。
1. this和super后面可以跟成员变量和成员方法:
this.成员变量 super.成员变量
this.成员方法() super.成员方法()
2. 调用构造方法:
this(参数):调用本类中的构造方法
super(参数):调用父类中的构造方法
注意事项:this和super 不能用于static 方法中。
public class ExtendsDemo02 {
public static void main(String[] args) {
DaughterClass d = new DaughterClass();
d.show("凌天一击!");
}
}
class DadClass{
String name = "嘲风";
public DadClass() {
System.out.println("hello,我是父类的构造方法");
}
}
class DaughterClass extends DadClass{
String name = "七杀";
public DaughterClass() {
System.out.println("靠你吉娃,我是子类的构造方法");
}
public void show(String name) {
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
方法的重载和方法的重写的区别:
重写(override): 子类中出现了和父类中方法名一样,返回值类型一样,参数列表一样的方法,就叫做方法的重写
重载(overload): 一个类中可以存在多个名字相同的方法,但是必须保证参数的个数或类型不同,与返回值无关
注意事项:
•父类中私有方法不能被重写
•子类重写父类方法时,访问权限不能更低
•父类静态方法,子类也必须通过静态方法进行类似重写的操作。(但其实不叫重写,因为静态方法没有方法重写的特性,多态中证明)
==================此处代码在一个文件中写多个类,以便很好的显示类之间的继承关系。=========================
注意事项:一个文件中可以定义多个类,但是必须只能有一个类使用public类, 并且用public修饰的类必须和文件名相同。main 方法必须定义在用public修饰的类中(定义在非public修饰的类中无法执行)
继承中成员变量的关系:先在子类中找,再去父类中找,父类中没有就报错
继承中成员方法的关系:先在子类中找,再去父类中找,父类中没有就报错
继承中构造方法的关系:子类中的构造方法默认会调用父类中无参数的构造方法,如果父类中没有无参数的构造方法,子类必须直 接或间接地调用父类 中其他的构造方法 (否则程序不能编译)
public class ExtendsDemo {
public static void main(String[] args) {
Cat cat = new Cat(); //实例化子类对象,会默认先调用父类中的构造方法
cat.name = "孤单"; //子类对象调用父类的属性赋值
System.out.println(cat.eyesColor); //输出子类存在的属性信息:金色
System.out.println(cat.age); //输出父类中才存在的属性信息:10
cat.eat(); //子类对象调用父类方法:[父类成员方法]吃东西
}
}
//父类/基类/超类
class Animal{
String name;
int age = 10;
String eyesColor = "蓝色";
public Animal() {
System.out.println("[父类构造方法]");
}
public void sleep() {
System.out.println("[父类成员方法]");
}
public void eat() {
System.out.println("[父类成员方法]吃东西");
}
}
//子类/派生类
class Cat extends Animal{
String eyesColor = "金色";
public Cat() {
super(); //默认调用父类的构造方法,可以不写,但依然存在
System.out.println("[子类构造方法]我是一只小喵喵");
}
public void sleep() {
System.out.println("[子类成员方法]小喵喵在睡觉");
}
}