Java_03【继承】

今天这个专题就是来介绍Java三大特性之一的----继承

01继承的理解

1。继承作为Java中,重要的功能之一直接提现了Java语言的特性——复用性,编写代码是实现程序的功能,一段代码最重要的是功能强大,数量最少,且不产生任何Bug是优良代码。复用代码是达到目标路径之一。
2。继承–抽象到生活中就像一个家庭就是一个程序,各个成员就好比个各类,那么继承就体现在父亲和子女的关系,就像父类和子类。
3。继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类,通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
4。继承的关系中 子类不能选择性的继承父类,就像子女不能选择自己的亲生父亲,在继承中更像是子继父业子女可以去继承父类的产业,也就是父类中的功能,也可以在继承功能的同时添加新的数据和功能。就像你不但会你父亲会的也可以拥有比你父亲更多的功能。
5。实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性。但是在继承中继承关系不能被改变,你可以是你爸的儿子,但是你爸爸永远不可能是你的儿子,向上转型的引入,更能体现出继承者的特殊化

02继承重点总结

1。子类可以拥有父类的非private属性和方法
private 在不同类中是不可见的,就像你的父亲不让你看见他抽烟,你也就无法从父类那里学会抽烟这个方法

class Father{
	public String name ="王";
	private void Smoking(){
		System.out.println("Smoking");
	}
}
class Child extends Father{
	public String toString(){
		return name;
	}
	public static void main(String[] args){
		Child cc = new Child();
		System.out.println(cc);
		cc.Smoking();
	}
}

在这里插入图片描述
显而易见子类继承父类的过程中只能继承非private 而对于private的属性或者方法,不能继承
2。子类可以拥有自己的属性和方法,即子类可以对父类进行拓展

class Child extends Father{
   public void Skill(){
   	System.out.println("更加年轻");
   	}
   }

在这里插入图片描述
在这里子类可以添加父类中没有的方法或者属性

03构造器的引入

构造器作为一个类的特殊组成,不能被继承但是可以调用,是一个类特有的,在子类调用父类的构造方法中可以使用super() 关键字
编译器会默认给子类调用父类的构造器。
前提:父类有默认构造器。如果父类没有默认构造器,我们就要必须显示的使用super()来调用父类构造器,否则编译器会报错:无法找到符合父类形式的构造器。
总的来说:
对于继承而已,子类会默认调用父类的构造器,但是如果没有默认的父类构造器,子类必须要显示的指定父类的构造器,而且必须是在子类构造器中做的第一件事必须在构造方法的第一行

04向上转型

牵扯一个名词叫做动态绑定 何为动态绑定 向上转型之后 如果子类重写了父类的方法那么父类引用的指向或者调用的方法就变成子类的方法,向上转型之后父类的引用不能调用子类自己本身的方法

class Father{
	public void fun(){
   	System.out.println("父亲大笑");
   }
}
class Child extends Father{
public void Skill(){
   	System.out.println("更加年轻");
   }
	public void fun(){
   		System.out.println("儿子大笑");
   }
   	public static void main(String[] args){
   	Father cc = new Child();
   	System.out.println(name);
   	// cc.Smoking();
   	cc.fun();
   }
}

在这里插入图片描述
可以看到通过父类引用子类new 对象调用子类的方法
如果去调用子类有的而父类没有的方法
在这里插入图片描述

05向下转型

向下转型需要考虑安全性,如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误即能否向下转型,只有先经过向上转型的对象才能继续向下转型。
向下转型的过程中不能直接

Child cc = new Father();

在这里插入图片描述
要通过

Child cc = new Child();
  Father ff = new Father();
  cc = (Child)ff;

达到转型的目的但是
在这里插入图片描述
只有先经过向上转型的对象才能继续向下转型。
向下转型的过程中不能直接

Father ff = new Child();
  Child cc = (Child)ff;
  cc.Skill();

如果代码较多,不确定引用变量是否属于该类或该类的子类,可以用instanceonf 判断 该引用型变量所“指向”的对象是否属于该类或该类的子类。
instanceof是Java、php的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。

Father f = new Child(); //向上转型
	Father ff = new Father();
	Child  cc = (Child)f;
	if(ff instanceof Child){
		Child c1 = (Child)ff;
		c1.Skill();
	}

生命不息!!奋斗不止!!

猜你喜欢

转载自blog.csdn.net/qq_36390039/article/details/88620722