目录
0、本文的细节小知识点
0.0 、专有名词
父类(基类)(超类) : parent class 、 base class 、 superclass
子类(派生类)(次类)(扩展类) :
child class 、derived 、 subclass 、 extended class
继承&多态 : Inheritance Polymorphism
重写&重载 : Override Overloading
动态绑定 : Dynamic binding(理解动态绑定)
0.1、修饰符
0.2、super 和 this 关键字
0.2.1 super 关键字
super关键字 ! 指代父类 可以用于调用父类中的普通方法和构造方法!
即 super关键字 可以用于两种途径:
(1):调用父类的构造方法。
父类的构造方法不会被子类继承,
例如当在父类中 只有有参构造方法时,那么父类中的系统自己补充的无参构造方法就被覆盖了!
而且需要明白super关键字的第(1)种用法,还需要知道,在JAVA中,当子类实例化new对象的时候,先调用父类的构造方法,再调用自己的构造方法!
public class TestDemo
{
public static void main(String[] args)
{
// System.out.println("HelloWorld");
SonChildErzi son = new SonChildErzi();
}
}
class DieFatherBa
{
public DieFatherBa()
{
System.out.println("我恁爹,先有爹再有子,姜还是老的辣!");
}
}
class SonChildErzi extends DieFatherBa
{
public SonChildErzi()
{
System.out.println("nbnb666,先有父后有子,上梁不正下梁歪");
}
}
输出结果如下图所示:
这时候你在爹的构造函数里传了参,把他变成有参构造了,那问题就来了
子类构造方法先构造父类再构造子类的时候,他原来父类好端端的(系统自己补的)无参构造方法,父类无参时,子类在构造父类的时候也自己悄悄补了个super(),但是现在,父类变成有参构造方法了,被显式调用了,那么子类也必须显式调用父类的构造方法!
要调用 父类 构造方法 ,没有系统给你默默补上 super(),
你就需要了解到 ,要调用父类的构造方法就必须使用关键字super,而且这个调用必须是构造方法的第一条语句。
这时候就不会再报错了!
所以 设计指南上说了:一般情况下,最好能为每个类提供一个无参构造方法,以便于对该类进行扩展,同时避免错误!
(2):调用父类的方法!关键字super不仅可以调用父类的构造方法,也可以引用父类的方法!
结果如下:
0.2.2、 this关键字
(1)this.属性名称
(2)this.方法名称 这两点均在以前的博客中有讲解
(3)因为super的第一个作用与父类构造方法有关且花了大篇幅叙述讲解,因此在此
着重讲一下第三个作用 this()加以区分!
this() 访问本类中的构造方法,()中可以有参数的,如果有参数的,就是调用的指定的有参构造!
注意事项:
1、this() 不能使用在普通方法中! 只能写在构造方法中!
2、必须是构造方法中的第一条语句!
this()这个可不能单独写在类中嗷,跟super(参数)一样要写在构造方法中哦,不然分分钟报错给你啊!~
这时候我们换到无参的构造方法中:
!!!!this()要被写在 构造方法中!!!还要this括号内传的参数和放进去的构造方法的参数不同!!!
即:this内有N个构造方法,你可以根据参数列不同,对N-1(除去跟自己所在的构造函数相同的参数列)个构造方法进行互相调用!
如图:
1、继承
1.1、何为继承?!
面向对象的编程允许你从 已经定义的类中 定义 新的类 这称为 继承!
继承是Java在软件重用方面一个重要且功能强大的特称。
(假设要定义一个类,例如图书馆模型中,分为图书管理员和普通用户,对其进行抽象建模,面向对象对图书的属性 和 User 对 图书的操作 建模,User中的(Admin和NoramalUser)有很多共同的特性。如何设计?
User类来避免冗余并且易于维护(更改一个父类,其他中的子类也更改)的最好方式?
答案自然是使用继承!
继承使得你可以定义一个通用的类(即父类),之后扩充该类为一个或多个更加特定的类(即子类)
子类会自动拥有和继承父类所有可以继承的属性和方法!
和传统的理解不同,子类并不是父类的一个子集。实际上,一个子类通常比他的父类包含更多的信息和方法!此外,继承还是一种“是一种”关系(is-a)关系来建模的
如上文提到的 Admin是User NormalUser 也是 User
除构造方法外的所有方法和属性,
对于父类中有private的:私有数据域,在该类外是不可访问的,因此,不能在子类中直接使用。
但是,如果父类中定义了针对这些私有数据域的访问器/修改器,那么就可以通过这些公共的访问器/修改器来访问和修改他们!
面向对象方法结合了面向过程范式的强大之处,并且进一步将数据和操作集成在对象中!
1.2、Java有多态继承吗?
其实,Java只是选择了“单继承”,且提出解决丰富度的方案:
String str1 = new String("小红日srs");
int [] array = new int[ ] ;
HashSet<Integer> set1 = new HashSet<>();
User user = new User();
一旦出现new,就在堆上开辟内存用来存储对象了!
Java中的继承是来自于一个父类,这种限制称为单一继承(single inheritance),如果使用extends关键字来定义一个子类,他只允许有一个父类。
2、方法重载和方法重写
方法重载:Overload
1:要求必须在同一个类中。
2:对于签名中的返回值类型不做要求,与修饰符无关。
3:对于参数列表中的参数个数或参数类型或参数顺序不做要求。
4:要求必须同名。
方法重写:Override 又叫覆写
1、方法重写必须是子类重写父类中的方法
2、重写的方法与父类中的方法返回类型和方法名称,参数列表必须相同
满足上述条件这样我们说子类与父类的方法构成了重写关系。