java基础复习day4
1.继承
1.1概念和格式
概述:继承是面向对象三大特征之一。可以使子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
格式:
public class 子类名 extends 父类名{..}
1.2继承的利弊
- 提高复用性(多个类相同的成员可以放到同一个类中)和维护性(修改一处即可)
- 类的耦合增强,削弱子类独立性
- 什么时候能用?
存在关系 is a的时候:苹果是水果,猫是动物,
1.3继承中变量的访问特点
- 子类局部变量>子类成员变量>父类成员变量>没有报错就近原则?
- super(父类的引用)
1.4继承构造方法访问特点
子类中所有的构造方法的访问都会默认访问父类无参构造方法
原因:
- 子类会继承父类的数据,可能还会用到父类的数据。所以子类初始化前会先初始化父类
- 每一个子类的默认构造方法的第一条语句默认都是:super()
如果父类没有无参构造方法,只有带参构造方法,怎么办?
- 子类构造方法第一句用super关键字去显示调用父类的带参构造方法
- 父类写一个无参构造方法 (推荐)
1.5继承中成员方法的访问特点
通过子类访问一个方法和访问变量一样(就近原则)
子类成员范围找>父类成员范围>报错
1.6继承内存图
方法内的局部变量在栈内存中
卧槽花点时间看看
1.7方法重写(1.5既视感)
概述:
- 子类中出现和父类中一模一样的方法声明
应用:
- 当子类需要父类的功能,而功能主体子类有自己特有的内容,可以重写父类的方法,这样,沿袭父类的功能又定义子类的特有内容
eg:手机类 新手机类
写代码的时候用@override然后在下面写方法重写(一个注释,检查方法重写声明的正确性)
1.8继承注意事项
方法重写:
- 私有方法(privat)不能被重写(private 不能被继承)
- 子类方法权限不能更低(public>默认>private)
继承:
- java只支持单继承,不能继承多个
- 可以支持多层继承
package teacher;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package teacher;
public class Teacher extends Person {
public Teacher() {
}
public Teacher(String name, int age) {
super(name, age);
}
public void teach() {
System.out.println("用爱教育每个学生!");
}
}
package teacher;
public class PersonDemo {
public static void main(String[] args) {
Teacher t1 = new Teacher();
t1.setName("文天圣");
t1.setAge(20);
System.out.print(t1.getName()+","+t1.getAge()+"岁,");
t1.teach();//文天圣,20岁,用爱教育每个学生!
Teacher t2 = new Teacher("陈彦池",100);
System.out.print(t2.getName()+","+t2.getAge()+"岁,");
t2.teach();//陈彦池,100岁,用爱教育每个学生!
}
}
小结: 上述代码,teacher继承person,但是不能继承父类private的成员变量,所以需要用父类的方法进行赋值。
猫狗案例:
package catanddog;
public class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package catanddog;
import groovyjarjarantlr4.v4.codegen.model.SrcOp;
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
public void catchMouse() {
System.out.println("猫抓老鼠");
}
}
package catanddog;
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
public void lookDoor() {
System.out.println("狗看门");
}
}
package catanddog;
public class AnimalDemo {
public static void main(String[] args) {
Cat c1 = new Cat();
c1.setName("汤姆");
c1.setAge(20);
System.out.println(c1.getName() + "," + c1.getAge());
c1.catchMouse();
Cat c2 = new Cat("加菲", 30);
System.out.println(c2.getName() + "," + c2.getAge());
c2.catchMouse();
/* 汤姆,20
猫抓老鼠
加菲,30
猫抓老鼠*/
Dog d1 = new Dog();//同理
}
}