八、继承及其相关
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();
}
}
运行结果: