Day15-面向对象

Day15-面向对象

方法重写(覆盖)Override

当父类提供的方法无法满足子类的需求时,可以在子类中定义和父类相同的方法进行重写

​ 要求:

​ 方法名,参数列表,返回值类型必须与父类相同

​ 访问权限符可以与父类相同或比父类更加宽泛

​ 执行机制:子类重写父类方法之后,调用时优先执行子类重写后的方法

public class TestOverride {
	public static void main(String[] args) {
		Dog dog = new Dog();
		dog.eat();
		dog.sleep();
	}
}

//父类
class Animal{
	String breed;
	int age;
	String sex;
	
	public void eat() {
		System.out.println("动物吃...");
	}
	public void sleep() {
		System.out.println("动物睡...");		
	}
}

//子类
class Dog extends Animal{
	String furColor;
	public void run() {
		
	}
	//重写
	@Override
	public void eat() {
		System.out.println("狗狗吃骨头...");
	}
}

//子类
class Cat extends Animal{
	String eyeColor;
	//重写
	@Override
	public void eat() {
		System.out.println("猫猫吃鱼...");
	}
}

super关键字

子类对父类方法复用,然后叠加额外的功能代码

  • super关键字的第一种用法:

​ 在子类的方法中使用“super.”的形式访问父类的属性或方法

​ 例如:super.父类属性; super.父类方法(); super.value; super.eat();

  • super关键字的第二种方法:

​ 在子类的构造方法的首行,使用super(); super(实参);调用父类构造方法

​ 同一个子类的构造方法中,super()、this()不可同时存在

public class TestBasicSuper {
	public static void main(String[] args) {
		B b = new B();
		b.printValue();
	}
}

class A{
	int value = 10;
}

class B extends A{
	int value = 20;
	public void printValue() {
		int value = 30;
		System.out.println(value);
		System.out.println(this.value);
		System.out.println(super.value);
	}
}

public class TestArgs {
	public static void main(String[] args) {
		//new Son();
		new Son(10);
	}
}
class Father{
	public Father() {
		System.out.println("Father()无参构造执行了");
	}
	public Father(int a) {
		System.out.println("Father()有参构造执行了");
	}
}

class Son extends Father{
	public Son() {
		System.out.println("Son()无参构造执行了");
	}
	public Son(int a) {
		super(a);
		System.out.println("Son()有参构造执行了");
	}
	
}

继承关系下的对象构建

继承关系下,构建子类对象时,一定先构造父类对象

由“父类的共性”+“子类的独有”,组成一个完整的子类对象

/**
 * 继承中的对象构建
 * 1、构造父类对象
 * 2、初始化自身属性
 * 3、执行自身构造方法的逻辑代码
 */
public class TestCreatClass {
	public static void main(String[] args) {
		C c = new C();
	}
}

class A{
	String fieldA = "A的属性";//1、加载属性
	public A() {//2、执行构造方法中的逻辑代码
		super();//默认存在,调用父类构造
		System.out.println("A的构造方法执行了..."+fieldA);
	}
}
class B extends A{
	String fieldB = "B的属性";//1、加载属性
	public B() {//2、执行构造方法中的逻辑代码
		super();//默认存在,调用父类构造
		System.out.println("B的构造方法执行了..."+fieldB);
	}
}
class C extends B{
	String fieldC = "C的属性";//1、加载属性
	public C() {//2、执行构造方法中的逻辑代码
		super();//默认存在,调用父类无参构造
		System.out.println("C的构造方法执行了..."+fieldC);
	}
}

继承关系下对象的构建流程

1、构建父类对象

2、初始化自身属性

3、执行构造方法中的逻辑代码

多态

概念:父类引用指向子类对象,从而引起多种状态

构造多态的前提:二者必须具有直接或间接的继承关系,父类引用指向子类对象,进而为多态做准备

父类引用只能调用父类中声明的属性和方法,不能调用子类独有的属性和方法

多态的应用场景:

​ 使用父类作为方法,形参实现多态,实际传递子类对象使方法参数类型更加广泛

public class Vehicle {
	String type;//类型
	int speed;//速度
	double price;//价格
	public void run() {
    	System.out.println("一辆价值"+this.price+"RMB的,"+this.type+"正在以"+this.speed+"的速度行驶。");
    }
}

public class Bicycle extends Vehicle{
	String color;//颜色
	public void run() {
		System.out.println("一辆价值"+this.price+"RMB的,"+this.color+"颜色的"+this.type+"正在以"+this.speed+"的速度行驶");
	}
}

public class Bus extends Vehicle{
	int seatNum;//座位数
	public void run() {
     	System.out.println("一辆价值"+this.price+"RMB的,"+this.seatNum+"个座位"+this.type+"正在以"+this.speed+"的速度行驶。");
     }
}

public class Car extends Vehicle{
	String brand;//品牌
	public void run() {
		System.out.println("一辆价值"+this.price+"RMB的,"+this.brand+"品牌的"+this.type+"正在以"+this.speed+"的速度行驶");
	}
}

public class TestPloy {
	public static void main(String[] args) {
        Vehicle v = new Car();
        v.type = "小汽车"; 
		v.speed = 60; 
		v.price = 350000; 
		//v.brand = "宝马";父类不可以调用子类特有的属性 v.run();
        
        Vehicle v1 = new Bus(); 
		v1.type = "公交车"; 
        v1.speed = 100; 
		v1.price = 1000000;
		v1.run();
        
        Vehicle v2 = new Bicycle(); 
		v2.type = "自行车"; 
		v2.speed = 10; 
		v2.price = 3000;
		v2.run();//多态场景下,父类引用调用方法时,如果子类重写父类方法,优先调用子类重写后的方法
	}
}

抽象(abstract)

父类:不够完整,不够具体,不该独立存在。如何解决?通过abstract修饰,意为抽象类

抽象类不能独立new对象

可以被子类继承,为子类提供共性属性和方法

可以声明引用,更纯粹的使用多态

抽象类构造方法作用:构建子类对象时,先构建父类对象,由“父类共性”+“子类独有”组成完整的子类

子类继承抽象类后,必须重写父类中所有的方法,

public abstract class Animal {//使用abstract修饰的类为抽象类,不能new对象(不能独立存在)
	String breed;
	int age;
	String sex;
	
	//子类继承用
	public Animal() {
		System.out.println("Animal构造被调用了");
	}
	
	//抽象方法
	public abstract void eat();
	
	public void sleep() {
		System.out.println("动物睡");
	}
}

public class Cat extends Animal{
	@Override
	//继承重写eat方法
	public void eat() {
		System.out.println("猫咪正在吃鱼");
	}
}

public class Dog extends Animal{
	public Dog() {
		super();
		System.out.println("Dog构造被调用了");
	}
	@Override
	//继承重写eat方法
	public void eat() {
		System.out.println("狗狗正在吃骨头");
		
	}
}

public class TestAnimal {
	public static void main(String[] args) {
		//Animal a = new Animal();//不能被创建实例,不该独立存在
		Animal a = new Dog();//构建子类对象要先构建父类对象
		a.eat();
		a.sleep();
		
		Animal a2 = new Cat();
		a2.eat();
		a2.sleep();
	}
}
posted @ 2021-07-26 20:05  CN_Darren  阅读(39)  评论(0)    收藏  举报