抽象和继承

继承

面向对象的三大特征:封装、继承、多态

继承是多态的前提,如果没有继承,就没有多态

继承主要解决的问题是共性抽取

继承的特点

  • ​ 子类可以拥有父类的”内容“
  • 子类还可以拥有自己专有的内容

继承的格式

/*
在继承关系当中,”子类就是一个父类“,也就是说子类可以当作一个父类看待
例如父类是员工,子类是讲师。那么”讲师就是一个员工“。
定义父类的格式://一个普通的类
	public class 父类名称{
	//...
	}
定义子类的格式:
	public class 子类名称 extends 父类名称{
	//...
	}
	
*/

//定义父类
public class Employee{
    public void method("员工类~执行了");
}

//定义一个员工的子类
public class Teacher extends Employee{
    
}

继承中成员变量访问特点

/*
在父类的继承关系当中,如果成员变量,则创建子类对象时,访问有两种方式:

直接通过子类对象访问成员变量:
	等号左边是谁,就有优先用谁,没有向上找。
间接通过成员方法访问成员变量:
	该方法属于谁,就优先用谁没有则向上找。
*/

//定义父类
public class Fu {
	int fuNum=100;
	int num=200;
	public void mthod() {
		System.out.println(num);
	}
}


//定义子类
public class Zi extends Fu {
	int ziNum=300;
	int num=400;
	public void method() {
		System.out.println(num);
	}
}

//创建一个测试类
public class MainTest {
	public static void main(String[] args) {
		//定义一个子类
		Zi zi=new Zi();
		System.out.println(zi.fuNum);//100
		System.out.println(zi.ziNum);//300
		System.out.println(zi.num);//400
		zi.method();//400
		zi.mthod();//200
	}
}

区分子类方法中重名的三种变量

/*
本类的成员变量		直接写成员变量名
局部成员变量		this.成员变量
父类成员变量		super.成员变量
*/

//定义父类
public class Fu {
	int fuNum=100;
	int num=200;
	public void method() {
		System.out.println(num);
	}
}


//定义子类
public class Zi extends Fu {
	int ziNum=300;
	int num=400;
	public void method() {
        int num=500
		System.out.println(num);//500
        System.out.println(super.num);//200
		System.out.println(this.num);//400
	}
}

//创建一个测试类
public class MainTest {
	public static void main(String[] args) {
		//定义一个子类
		Zi zi=new Zi();
		zi.method();

	}
}

继承中成员方法的访问特点

/*
在父子类继承关系当中,访问成员变量方法规则:
	创建对象是谁就优先用谁,如果没有则向上找。
	
	注意事项:
		无论是成员方法还是成员变量,如果没有都是向上找的,绝对不会向下找子类的。
*/

方法的重写

概念:在继承关系中,方法的名称一样,参数列表也一样。

重写:(Override):方法的名称一样,参数列表【也一样】。也叫覆盖、重写

重载:(OverLoad):方法的名称一样,参数列表【不一样】。

方法的覆盖重写的特点:创建的子类对象,则优先使用子类方法。

注意事项:(了解)

  • 必须保证父子类之间的名称相同,参数列表也相同。@Override:写在方法前面,用来检测是不是有效的正确覆盖重写。这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。
  • 子方法的返回值必须【小于等于】父类方法的返回值范围,小扩展提示:java.long.Object类是所有类的公共最高父类(祖宗类),java.long.String就是Object的子类。zilei
  • 子类方法的权限必须【大于等于】父类方法的权限修饰符,小扩展提示:public>protected>(default)>private,备注:(default)不是关键字default,而是什么都不写,留空。

super关键字的三种用法

  • 在子类的成员方法中,访问父类的成员变量。
  • 在子类的成员方法中,访问父类的成员方法。
  • 在子类的构造方法中,访问父类的构造方法。

this关键字的三种用法

  • 在本类的成员方法中,访问本类的成员变量。
  • 在本类的成员方法中,访问本类的另一个成员方法。
  • 在本类的构造方法中,访问本类的另一个构造方法。

继承相关的重要特征

java语言是单继承的

一个类的直接父类只能由唯一一个

java语言是多继承的

我有父亲 父亲有爷爷 爷爷还有祖爷爷

一个类的直接父类是唯一的,但是一个父类可以拥有很多子类。

抽象

/*
抽象方法:就是加上abstract关键字,去掉大括号,直接分号结束。
抽象类:抽象爱国发所在的类,必须是抽象类才行。在calss之前写上abstract即可

如何使用抽象类喝抽象方法:
	不能直接创建new抽象类对象。
	必须用一个子列来继承抽象父类
	子类必须重写覆盖抽象父类当中所有的抽象方法
	覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
	创建子类对象进行使用。
*/

注意事项

  • 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
  • 抽象类中,可以有构造方法,是提供子类创建对象对象时,初始化父类成员使用的。
  • 抽象类中,不一定包含抽象方法,但是含有抽象方法的类必定是抽象类。
  • 抽象类的子类,必须重写抽象父类中的所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
原文地址:https://www.cnblogs.com/liu-xin-yang/p/12607621.html