目录
一、继承
- 继承的关键字是extends
1、继承的好处:提升了代码的复用性和维护性。
2、继承的弊端:削弱了子类的独立性。
因此,什么时候使用继承要慎重考虑,多做一些项目,自然就会有更深的理解。一般来说,一个类是另一个类的一种时使用继承,比如,猫和狗都是动物中的一种,因此,猫和狗可以继承动物类。
3、继承中变量和方法的访问特点
- 访问子类的变量和方法时,先在子类局部范围找,再在子类成员范围找,再在父类成员范围内找,都没有就会报错。
- 使用this.成员变量,可以跳过局部范围,直接在子类成员变量范围内找,使用super.成员变量,可以跳过子类成员变量,直接在父类成员范围内找。
上代码:
(1)定义一个动物类
package InheritAndPolymor;
public class Animal {
private int age = 80;
private String name = "动物";
public Animal() {
}
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat(){
System.out.println("动物吃东西");
}
public void sleep(){
System.out.println("动物要睡觉");
}
}
(2)定义一个猫类,继承自动物类
package InheritAndPolymor;
public class Cat extends Animal{
private int age = 40;
private String name = "猫";
public Cat() {
}
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void show(){
//变量
int age=20;
//访问局部变量
System.out.println(age); //输出结果为20
//访问成员变量
System.out.println(this.age); //输出结果为40
//访问父类成员变量
System.out.println(super.getAge()); //输出结果为80
}
}
(3)定义一个测试类,演示继承中,变量和方法的访问特点
package InheritAndPolymor;
public class Demo {
public static void main(String[] args) {
Cat c = new Cat();
c.show();
//成员方法
c.eat();//访问子类成员方法,输出结果为:猫吃鱼
c.sleep();//子类没有该方法,在父类中寻找,输出结果为:动物要睡觉
}
}
上面的例子中,看懂输出结果是什么,就弄懂继承中变量和方法的访问特点了。
4、继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类的无参构造方法,因为子类构造方法的第一句默认都是super();
如果父类中没有无参构造方法,必须在子类构造方法的第一句访问父类带参构造方法:super(参数)。
5、方法重写
- 私有方法不能被重写(因为父类中的私有成员变量和私有成员方法子类是不能继承的)
- 子类方法访问权限不能更低(public>默认>私有)
6、继承的注意事项
- 只能继承一个父类,即不支持多继承
- 可以继承爷爷类,即支持多层继承
二、多态
多态使用时: Animal a = new Cat();
多态的体现:
- 有继承/实现关系
- 有方法重写
- 有父类引用(Animal a) 指向子类对象(new Cat())
1、多态的好处:提高了程序的扩展性
定义方法的时候,使用父类作为参数,将来在使用的时候,使用具体的子类参与操作。
2、多态的弊端:不能使用子类的特有功能
3、多态中成员访问特点
(1)成员变量
- 编译看左边(也就是说,左边的类中有该变量,编译时才能不报错)
- 执行看左边(也就是说,访问多态类的成员变量时,其值是左边的类的值)
上代码
定义一个动物类:
package InheritAndPolymor2.InheritAndPolymor;
public class Animal {
public int age = 80;
}
定义一个猫类:
package InheritAndPolymor2.InheritAndPolymor;
public class Cat extends Animal {
public int age = 40;
public int wight = 60;
}
定义一个测试类:
package InheritAndPolymor2.InheritAndPolymor;
public class Demo {
public static void main(String[] args) {
Animal c = new Cat();
System.out.println(c.age); //编译看左,Animal类中有age成员变量,所以不报错,
//执行看左,Animal类中age的值为80,这里输出结果为80
System.out.println(c.wight); //编译看左,Animal 类中没有wight属性,所以编译报错
}
}
(2)成员方法
编译看左,执行看右,这是因为成员方法有重写,而成员变量没有。
4、多态的转型
多态的转型是为了克服多态的弊端,让父类对象也能使用子类的特有功能。
(1)向上转型
父类引用指向子类对象, Animal a = new Cat();
(2)向下转型
父类引用转换为子类对象,Cat c =(Cat)a; 相当于一个变量类型转换。