8、继承及其相关


八、继承及其相关

1、系统结构图(xmind)

—1.继承:


——2.多态:


——3.内部类:


——4. 包:


2、tips

——1.继承

        Java不支持多继承,但支持多层继承(继承体系):

        C继承B,B继承A,就会出现继承体系,多层继承出现的继承体系中,通常看父类中的功能,了解该体系的基本功能,建立子类对象,即可使用该体系功能。定义继承时需要注意:不要仅为了获取其他类中某个功能而去继承,类与类之间要有所属("is a")关系。


——2.函数具有两个特性

1.重载,在同一个类中。

2.覆盖,子类中,覆盖也称为重写,覆写,override。

        什么时候使用覆盖操作?

       当子类需要父类的功能,而功能主体子类有自己特有的内容时,可以覆写父类中的方法,这样即沿袭了父类的功能,又定义了子类特有的内容。


——3.构造函数总结

一个对象实例化过程,以person p = new person();为例:

1.JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下)。

2.在内存中开辟空间,并分配地址。

3.并在对象空间中,对对象的属性进行默认初始化。

4.调用对应的构造函数进行初始化。

5.在构造函数中,第一行会先到调用父类中构造函数进行初始化。

6.父类初始化完毕后,再对子类的属性进行显示初始化。

7.再进行子类构造函数的特定初始化。

8.初始化完毕后,将地址值赋值给引用变量。


——4.final关键字

在程序中如果一个数据是固定的,那么直接使用这个数据就可以了,但是这种阅读性差,所以应该给数据起个名字,而且这个变量名称的值不能变化,所以加上final固定。

       写法规范:常量所有字母都大写,多个单词,中间用_连接。


——5.多态概述

栗:动物中猫。

       猫这个对象对应的类型是猫类型:猫 m = new 猫();

       同时猫也对应着动物这个类型:动物 d = new 猫();

       动物是猫这个具体事务中抽取出来的父类型,代表更大的范围,父类型引用指向了子类对象。

多态性简单说就是一个对象对应着不同类型。「

实例代码:

//类型动物的抽象类描述了一个吃的共性
abstract class Animals
{
	public abstract void eat();
}
//类型猫继承动物,重写一个共性吃,以及自身抓老鼠的行为
class Cat extends Animals
{
	public void eat()
	{
		System.out.println("吃鱼");
	}
	public void catchmouse()
	{
		System.out.println("抓老鼠");
	}
}
//类型狗继承动物,重写了一个吃的共性,以及自身看家的行为
class Dog extends Animals
{
	public void eat()
	{
		System.out.println("啃骨头");
	}
	public void lookhouse()
	{
		System.out.println("看家");
	}
}
//类型猪继承动物,重写了吃的共性,以及自身拱地的行为
class Pig extends Animals
{
	public void eat()
	{
		System.out.println("饲料");
	}
	public void gongdi()
	{
		System.out.println("拱地");
	}
}

class duotaiDemo
{
	public static void main(String[] args)
	{
		//自动类型提升,猫对象提升到了动物类型。但是特有功能无法访问,作用就是限制对特有功能的访问。
		 //专业讲:向上转型,将子类型隐藏。就不能使用子类的特有方法了。
		Animals a =new Cat();
		a.eat();
		//报错a.catchmouse();

		//如果还想用具体动物的功能,还可以向下转型。
		Cat c = (Cat)a;//向下转型的目的是为了能够使用子类的特有方法
		c.eat();
		c.catchmouse();
		//注意:对于转型,自始至终都是子类对象在做类型的变化。
		//Animal a = new Dog();
		//Cat c = (Cat)a;//但是类型不能随意转换,否则可能会报出ClassCastException的异常
	}
	public static void Eat(Animals a)
	{
		a.eat();
	}
}


运行结果:

          


——6.内部类

栗1:

class Outer
{
	private int num = 4;
	private static int num2 = 5;
	//静态定义在类上,不是内部类的方法上。
	static class  Inner 
	{
		public  void show()
		{
			System.out.println("Inner run...."+num2);
		}
	}
}
class InnerClassDemo2
{
	public static void main(String[] args)
	{
		//Outer.Inner o = new Outer().new Inner();当内部类为静态是当做外部类使用。
		Outer.Inner o = new Outer.Inner();
		//静态内部类的方法只能访问静态内部类变量
		o.show();。
	} 
}

运行结果:

      


2.匿名内部类实例

//定义一个拥有两个方法的接口
interface Inter
{
	void show1();
	void show2();
}
class InnerClassDemo8
{
	public static void main(String[] args)
	{
		/*
		直接将接口式匿名内部类当做参数。
		重写Inter接口中的两个方法。
		*/
		show(new Inter()
		{
			public void show1()
			{
				System.out.println("show1...run");
			}
			public void show2()
			{
				System.out.println("show2...run");
			}
		});
	}
	//输入的参数为一个接口,返回值类型为void
	public static void show(Inter in)
	{
		in.show1();
		in.show2();
	}
}


运行结果:

       





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章