JavaSE笔记6.6-面向对象-继承

一. 概述

  1. 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的那个类即可。
  2. 多个类可以称为子类,单独这个类称为父类或者超类。
  3. 子类可以直接访问父类中的非私有的属性和行为。

二. 用法

通过extends关键字让类与类之间产生继承关系

class Person
{
     
	String name;
	int age;	
}

class Student extends Person
{
     
	void study()
	{
     
		System.out.println("Good good study!");
	}
}
class ExtendsDemo
{
     
    public static void main(String[] args)
    {
     
        Student s=new Student();
        s.name="zhangsan";
    }
} 

优点:
提高了代码的复用性;
让类与类之间产生了关系,提供了多态的前提

三. 特点

1. java只支持单继承

一个类只能有一个父类,不能有多个父类。

class SubDemo extends Demo{
     }   //OK
class SubDemo extends Demo1,Demo2...   //error

因为多继承容易带来安全隐患:
当多个父类中定义了名称相同但内容不同的功能时,子类对象不确定要运行哪一个。

2. Java保留了多继承的机制

用另一种体现形式来完成表现:多实现

3. Java支持多层继承
class A{
     }
class B extends A{
     }
class C extends B{
     }

四. 子父类中成员的特点

类中成员:变量;函数;构造函数

1. 变量–super、this关键字
(1)概述

如果子类中出现与父类中同名的非私有的成员变量时,
子类要访问本类中的变量,用this
子类要访问父类中的同名变量,用super。

super的使用和this的使用几乎一致。
this代表的是本类对象的引用。
super代表的是父类对象的引用。

(2)内存特点
class Fu
{
     
	int num=4;
}

class Zi extends Fu
{
     
	int num=5;
	void show()
	{
     
		System.out.println(super.num);
	}
}
class ExtendsDemo2 
{
     
	public static void main(String[] args) 
	{
     
		Zi z=new Zi();
		z.show();
	}
}

JavaSE笔记6.6-面向对象-继承_第1张图片

(3)例子
  • 子类&父类有同名变量,不使用关键字
class Fu
{
     
	int num=4;
}

class Zi extends Fu
{
     
	int num=5;
}
class ExtendsDemo2 
{
     
	public static void main(String[] args) 
	{
     
		Zi z=new Zi();
		System.out.println(z.num);
	}
}

在这里插入图片描述

  • 子类&父类有同名变量,使用super和this关键字
class Fu
{
     
	int num=4;
}

class Zi extends Fu
{
     
	int num=5;
	void show()
	{
     
		System.out.println(super.num);
		System.out.println(this.num);
	}
}
class ExtendsDemo2 
{
     
	public static void main(String[] args) 
	{
     
		Zi z=new Zi();
		z.show();
	}
}

在这里插入图片描述

  • 子类无同名变量,使用this关键字
    多态:父类引用指向子类对象
class Fu
{
     
	int num=4;
}

class Zi extends Fu
{
     
	void show()
	{
     
		System.out.println(this.num);
	}
}
class ExtendsDemo2 
{
     
	public static void main(String[] args) 
	{
     
		Zi z=new Zi();
		z.show();
	}
}

在这里插入图片描述

2. 函数–重写/覆盖
(1)概念

当子类出现和父类一模一样的函数时,
当子类对象调用该函数,会运行子类函数的内容。
如同父类的函数被覆盖一样。

这种情况是函数的另一个特性:重写(覆盖)

(2)作用

当子类继承父类,沿袭了父类的功能到子类中。
子类虽具备该功能,但是功能的内容却和父类不一致。
这时,没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能内容。

(3)用法(当功能需要更新时)
  • 利用重写特性,而不是直接在父类上修改
  • 在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取
class Tel
{
     
	void show()
	{
     
		System.out.println("number");
	}
}

class NewTel extends Tel
{
     
	void show()
	{
     
		super.show();
		System.out.println("name");
		System.out.println("pic");
	}
}
(4)注意
  • 子类覆盖父类,必须保证子权限大于等于父权限,才可以覆盖,否则编译失败。
    (权限有3种:public>默认>private)
  • 父类中的私有方法不能被覆盖
class Fu
{
     
    void speak()
    {
     
        System.out.println("vb");
    }
}

class Zi extends Fu
{
     

}

class  ExtendsDemo3
{
     
    public static void main(String[] args)
    {
     
        Zi z=new Zi();
        z.speak();  //保留父类中的speak()函数,但是子类用的是自己的speak()函数
    }
}

在这里插入图片描述
JavaSE笔记6.6-面向对象-继承_第2张图片

  • 静态只能覆盖静态
(5)重载&重写区别

重载:只看同名函数的参数列表。
重写:子父类方法要一模一样(包括返回值类型、函数名、参数列表)。
JavaSE笔记6.6-面向对象-继承_第3张图片

3. 构造函数–子类的实例化过程
(1)特征1

在对子类对象进行初始化时,父类的构造函数也会运行。
那是因为子类的构造函数默认第一行有一条隐式的语句 super();
super() :会访问父类空参数的构造函数,而且子类中所有构造函数默认第一行都是super()。

class Fu
{
     
	Fu()
	{
     
		System.out.println("Fu run");
	}
	Fu(int x)
	{
     
		System.out.println("Fu..."+x);
	}
}

class Zi extends Fu
{
     
	Zi()
	{
     
		//super();
		System.out.println("Zi run");
	}
	Zi(int x)
	{
     
           //super();         
		System.out.println("Zi..."+x);
	}
}

class ExtendsDemo4 
{
     
	public static void main(String[] args) 
	{
     
		Zi z=new Zi();
		Zi z1=new Zi(4);
	}
}

JavaSE笔记6.6-面向对象-继承_第4张图片

(2)特征2

默认隐式函数super()访问的是父类中空参数的构造函数,如果没有空参数的构造函数会报错。
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。
JavaSE笔记6.6-面向对象-继承_第5张图片

class Fu
{
     
    Fu(int x)
    {
     
        System.out.println("Fu..."+x);
    }
}

class Zi extends Fu
{
     
    Zi()
    {
     
        super(5);
        System.out.println("Zi run");
    }
    Zi(int x)
    {
     
        super(5);
        System.out.println("Zi..."+x);
    }
}

class ExtendsDemo4
{
     
    public static void main(String[] args)
    {
     
        Zi z=new Zi();
        Zi z1=new Zi(4);
    }
}

JavaSE笔记6.6-面向对象-继承_第6张图片

(3)特征3

super语句一定要定义在子类构造函数的第一行

(4)特征4

子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
子类中至少会有一个构造函数会访问父类中的构造函数。

class Fu
{
     
	int num;
	Fu()
	{
     
		num=60;
		System.out.println("Fu run");
	}
	Fu(int x)
	{
     
		System.out.println("Fu..."+x);
	}
}

class Zi extends Fu
{
     
	Zi()
	{
     
		System.out.println("Zi run");
	}
	Zi(int x)
	{
     
		this();
		System.out.println("Zi..."+x);
	}
}

class ExtendsDemo4 
{
     
	public static void main(String[] args) 
	{
     
		Zi z=new Zi(4);
		System.out.println(z.num);
	}
}

JavaSE笔记6.6-面向对象-继承_第7张图片

你可能感兴趣的:(JavaSE,java)