五、继承、super、this、抽象类

五、继承、super、this、抽象类_第1张图片

  戳我跳到个人主页

  本人码云(建议pc端打开,手机可能会出现字体过小问题。)
  本人会不定期在码云上更新一些算法或数据结构的基础程序,后期也会学习进阶程序,也会更新大厂的面试题。
  如果您有好的建议和想法,欢迎在本人码云相应代码评论区评论哦。希望大家都能在编程这条路上越走越远。也祝看到这篇博客的人,能真正搞懂这方面知识,当然,若有错误,请提出改正,谢谢大家啦。

  本人后续会在这里更新操作系统和计组的笔记,敬请期待!
  有赞必回,评论必回,顺着网线回访!

五、继承、super_this、抽象类

  • 一.继承
    • 1、继承的概述
    • 2、继承的格式
    • 3、继承中成员变量的访问特点
    • @3、小结
    • 4、继承中方法的覆盖重写
    • 5、什么时候用方法覆盖
    • 6、继承中【构造方法】访问特点
    • 7.1、super关键字使用方法
    • 7.2、this关键字的使用方法
    • 8、Java 继承的三个特点

一.继承

1、继承的概述

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

继承是多态的前提,如果没有继承,就没有多态。
假如徒弟和师傅是继承的关系:
五、继承、super、this、抽象类_第2张图片继承主要解决的问题就是:共性抽取。
五、继承、super、this、抽象类_第3张图片

2、继承的格式

在继承的关系中,“子类就是一个父类”,也就是说,子类可以被当作父类看待。 例如父类是员工,子类是讲师,那么 ”讲师就是一个员工“。
关系:is-a。

定义父类的格式:(一个普通的类定义)
public class 父类名称 {
	// . . .
}
 
定义子类的格式:
public class 子类名称  extends 父类名称 {
	// . . .
}

父类员工、Employee

package three;

//定义一个父类,员工类
public class Employee
{
	public void method()
	{
		System.out.println("方法执行!");
	}
}

子类讲师、Teacher

package three;

//定义一个子类,讲师类
public class Teacher extends Employee
{
}

子类助教、Assistant

package three;

//定义了员工的另一个子类,助教类
public class Assistant extends Employee
{
}

类Demo01Extends

package three;

public class Demo01Extends
{
	public static void main(String[] args)
	{
		//创建了一个子类对象
		Teacher t = new Teacher();
		t.method();
		//Teacher类中虽然什么都没写,但是会继承来自父类的method方法。
		
		//创建另一个子类对象
		Assistant a = new Assiatant();
		a.method();
		//Assistant类也继承了员工类的方法
		
	}
}

五、继承、super、this、抽象类_第4张图片

3、继承中成员变量的访问特点

父类

package three;

public class Fu
{
	//父类的三个成员变量
	//分别是numFu、num1 和 num2
	int numFu = 10;
	int num1 = 100;
	int num2 = 20;
	
	public void methodFu()
	{
		System.out.println(num1);
	}
	
	public void methodZi()
	{
		System.out.println(num1);
	}
	
}

子类

package three;

public class Zi extends Fu
{
	//子类的两个成员变量
	//是numZi、num1
	//不难发现,num1与父类成员变量重名
	int numZi = 20;
	int num1  = 200;
	
	//这是一个和父类成员方法重名的子类成员
	public void methodZi()
	{
		//本类中有num1,优先用本类的
		System.out.println(num1);
	}
	
	public void method()
	{
		//本类中没有num2,用父类的成员变量num2
		System.out.println(num2);
	}
}

应用类

五、继承、super、this、抽象类_第5张图片五、继承、super、this、抽象类_第6张图片

@3、小结

1、父子类中可以出现重名变量和重名方法

2、父子类中均不可出现主方法;(main)

3、子类可以继承父类的成员变量和成员方法

4、例如:
父类:Fu.java
–成员变量:num1 = 100 ;
      num2 = 200 ;
     num4 = 90 ;
–成员方法:public void method1 () { out.num1; }
     public void method3 () { out.num2; }
     public void method4 () { out.num1; }

子类:Zi.java
–成员变量:num1 = 10 ;
     num3 = 30 ;
–成员方法:public void method1 () { out.num1; }
     public void method2 () { out.num2; }
     public void method3() { out.num4; }
     public void method5() { out.num3; }

5、当创建一个父类对象时:
  Fu f = new Fu() ;
  就跟基本的类的使用方法一致。

6、当创建一个子类对象时
  Zi z = new Zi() ;
  z对象可以使用的范畴

成员变量区:
z.num1 = 10 ; 重名,用子类的
z.num2 = 200 ; 继承
z.num3 = 30 ; 子类专有的变量
z.num4 = 90 ; 继承

成员方法区:
z.method5() ; //30,子类专有的方法,子类专有的变量 ;
z.method1() ; //10,重名方法包含重名变量,用子类的变量;
z.method2() ; //200,子类方法method2继承父类的num2,再引用给子类对象z;
z.method3() ; //90,重名方法,子类中的方法method3继承父类的变量num4,再引用给子类变量z;
z.method4() ; //100,继承父类的方法,输出父类的num1。

综上所述: 先看方法属于父类还是子类,再看成员变量是否需要继承

4、继承中方法的覆盖重写

一、重写(覆盖、覆写)
[1]、概念:在继承关系中,父子类中方法的名称一样,参数列表也一样。

[2]、区别
重写:方法名称一样,参数列表【也一样】;
重载:方法名称一样,参数列表【不一样】。

二、方法覆盖重写注意事项!!!
[1]、必须保证父子类中方法名称相同,参数列表也相同;

[2]、@Override:写在【子类方法】前面,用于检测是不是正确有效的覆盖重写;

[3]、【子类方法】返回值 必须【小于等于】父类的返回值类型;

//前提:Object类是所有类的公共最高父类(祖宗类)
//java.lang.String就是Object的子类

[4]、【子类方法】的 权限 必须【大于等于】父类方法的权限修饰符;

小扩展提示:public > protected > (default) > private
备注:(default)不是关键字default,而是什么都不写,留空。

父类
五、继承、super、this、抽象类_第7张图片

子类
五、继承、super、this、抽象类_第8张图片
解释说明:

method方法,继承num2变量并且正常覆写;
poly方法,遵循了子类返回值小于等于父类的;
dc方法,Object类是所有类的祖宗类;
mars方法,遵循子类方法权限大于父类。

应用类
五、继承、super、this、抽象类_第9张图片

5、什么时候用方法覆盖

一、问题引入
五、继承、super、this、抽象类_第10张图片

二、父类老手机

package jicheng02;

public class OldPhone
{
	String name;
	int telnumber;
	String location;
	
	public void call(){
		System.out.println("打电话");
	}
	public void sendMessage(){
		System.out.println("发短信");
	}
	public void show(){
		System.out.println("来电显示");
	}


}

三、子类新手机

package jicheng02;

public class NewPhone extends OldPhone
{
/*	String name;
	int telnumber;
	String location;
	
	public void call(){
		System.out.println("打电话");
	}
	public void sendMessage(){
		System.out.println("发短信");
	}
	注释为新旧手机的继承
*/
	@Override
	public void show()
	{
		super.show();
		//super关键字、可以引用父类方法中相同的部分、后面会详细介绍
		System.out.println("姓名:"+name);
		System.out.println("电话号码:"+telnumber);
	}


}

四、应用类Demo手机

package jicheng02;

public class DemoPhone
{
	public static void main(String[] args)
	{
		NewPhone p1 = new NewPhone();
		p1.name = " John Lee ";
		p1.telnumber = 1872698;
		p1.location = "安徽六安";
		p1.show();
	}
}

五、继承、super、this、抽象类_第11张图片

6、继承中【构造方法】访问特点

继承关系中,父子类构造方法的访问特点:

1、子类构造方法当中有一个默认的“super()”,先调用父类,后调用子类;
 
2、可以通过super关键字在子类构造方法中调用【父类重载构造】;
3super的父类构造调用,必须是子类构造方法中第一条语句,也只能调用一次;

总结:
【1】子类必须调用父类构造方法,不写则赠送super();, 写了则用写的指定的super调用,例父类的重载构造方法;
【2】子类构造方法中,super只能有一个,而且是第一条语句
06:06:33
父类

package jicheng03;

public class Fu
{
	public Fu()
	{
		System.out.println("父类无参构造");
	}
	public Fu(int num)
	{
		System.out.println("父类有参重载构造方法");
		System.out.println(num);
	}
}

子类

package jicheng03;

public class Zi extends Fu
{
	public Zi()
	{
//		super();在调用父类无参构造方法
		super(10);//在调用父类重载构造方法
		System.out.println("子类构造方法");
	}
}

应用类

package jicheng03;

public class Demo
{
	public static void main(String[] args)
	{
		Zi zi = new Zi();
	}
}

五、继承、super、this、抽象类_第12张图片

7.1、super关键字使用方法

*问题引入:一个普通的父类
五、继承、super、this、抽象类_第13张图片

1、在子类的成员方法中,访问父类的成员变量。
2、在子类的成员方法中,访问父类的成员方法。
3、在子类的构造方法中,访问父类的构造方法。

子类
五、继承、super、this、抽象类_第14张图片

Demo类
五、继承、super、this、抽象类_第15张图片

7.2、this关键字的使用方法

1、在本类的成员方法中,访问本类的成员变量;
(重名变量时使用)
 
2、在本类的成员方法中,访问另一个成员方法;
 
3、在本类的构造方法中,访问本类的另一个构造方法。
(A、也必须是那个方法中的第一条语句)
(Bsuperthis构造方法的调用,不能在同一个方法中)

父类

package jicheng05;

public class Fu{
	int num = 90;
}

子类

package jicheng05;

public class ZI extends Fu
{
	int num = 20;
	s
	//子类两个构造方法
	public ZI(){
		System.out.println("子类无参构造方法");
	}
	public ZI(int num){
		this();//有参方法、调用无参方法
		this.num = num;
		System.out.println("子类全参构造方法,参数是+"num);
	}
	s
	//子类show方法
	public void show(){
		int num = 10;
		System.out.println(num);//局部
		System.out.println(this.num);//成员
		System.out.println(super.num);//父类成员
	}
	s
	//子类,B方法访问A
	public void metA(){
		System.out.println("AAA");
	}
	public void metB(){
		this.metA();
		System.out.println("BBB");
	}


}

Demo类
五、继承、super、this、抽象类_第16张图片

8、Java 继承的三个特点

五、继承、super、this、抽象类_第17张图片

你可能感兴趣的:(笔记,java,学习,开发语言)