相信你在定义类时总会在多个类中反反复复进行着同样的步骤,例如成员方法,构造方法等等,难道不会觉得这样会复杂吗?所以为了增加我们代码的可读性和我们写代码的效率,Java引用了“继承”,下面就由我来介绍继承!!!!
一、继承是什么?
多个类中存在相同属性或行为时,将这些内容抽取到单独的一个类中,那么其余的多个类将不用再定义这些属性和行为,只需继承那个类即可;
多个类可以称为子类,存放这些相同行为的类称为父类、超类或基类!
子类可以直接访问父类中非私有的属性和行为,通过entends关键字让子类与父类产生联系;
public class zi extends fu{} //zi是子类,fu是父类
二、子类的好处与弊端
好处:
提高代码的复用性;
提高代码的维护性;
弊端:
由于继承使类与类产生了联系,当父类发生变化时,子类也必须要变化;
三、继承不可滥用
使用继承的情况必须是包含关系时。例如:苹果和水果、猫和狗等等就可用继承,但猫和狗就不可用;
四、继承的特点
Java继承只支持单继承,不支持多继承
public class zi extends fu{
}//可用
public class zi extends fu,futwo{
}//报错
Java支持多层继承:即子类继承父类,父类继承父父类
public class A extends B{}
public class B extends C{}
public class C extends D{}
五、继承中变量的访问特点
先在子类方法中寻找变量,再在成员变量中寻找,最后才是父类中,如果都找不到就报错(这里不考虑多层继承);
看代码!!!
//父类
public class fu {
String a="我是父类";
String b="调用父类";
}
//子类
public class zi extends fu{
String a="我是子类";
public void show(){
System.out.println(a);
System.out.println(b);
}
}
//测试
public class zi_fu_demo {
public static void main(String[] args) {
zi z=new zi();
z.show();
}
}
输出结果:
子类中有些需改变,再看代码^_^:
public class zi extends fu{
String a="我是子类";
public void show(){
String a="我是子类方法";
System.out.println(a);
System.out.println(b);
}
}
六、super关键字
简介:super关键字主要是为了方便我们直接取父类中的内容。
super与this的区别
this是直接访问本类中的内容
用法:
成员变量:super.变量;//父类
this.变量;//本类
构造方法:super();
this();
成员方法:super.方法名();
this.方法名();
代码以访问成员变量为例:
//父类
public class fu {
String a="我是父类";
String b="调用父类";
}
public class zi extends fu{
String a="我是子类";
public void show(){
String a="我是子类方法";
System.out.println(super.a);
System.out.println(this.a);
}
}
七、继承中构造方法的访问特点
注意:由于子类继承父类,所以在我们调用子类的构造方法时,系统会默认先调用父类中的无参构造方法(也就是在子类的构造方法中系统默认给了一个super()),所以当我们写父类的带参构造方法时须给出无参构造方法(当然我们也可以直接在子类调用父类中的带参构造方法就可以不用写无参构造,系统也就不会调用父类中的无参构造)!!!!
//子类
public class zi extends fu{
public zi(){
//super();//加与不加效果相同
System.out.println("子类无参构造方法被调用");
}
public zi(int i){
//super();//加与不加效果相同
System.out.println("子类带参构造方法被调用");
}
}
//父类
public class fu {
public fu(){
System.out.println("父类无参构造方法被调用");
}
public fu(int i){
System.out.println("父类带参构造方法被调用");
}
}
//测试
public class zi_fu_demo {
public static void main(String[] args) {
zi z=new zi();
zi z1=new zi(0);
}
}
但你此时肯定会说,那父中的带参方法怎么调用呢,那不等于白写那儿?当然不是!!!我们可以采用super(参数)的形式调用,这里我们对上面代码子类进行一个小小改动:
//子类
public class zi extends fu{
public zi(){
super(0);
System.out.println("子类无参构造方法被调用");
}
public zi(int i){
super(0);
System.out.println("子类带参构造方法被调用");
}
}
八、继承中的成员方法的访问特点
先在子类成员中寻找,再在父类中寻找,如果都找不到就报错(这里不考虑多层继承);
代码如下(注意看不同哦!!):
//父类
public class zi_fu_demo {
public static void main(String[] args) {
zi z=new zi();
z.A();
z.B();
}
}
//子类
public class zi extends fu{
public void A(){
System.out.println("子类A方法被调用");
}
}
//测试
public class zi_fu_demo {
public static void main(String[] args) {
zi z=new zi();
z.A();
z.B();
}
}
我们在子类中添加与父类一样的B方法再看:
//子类
public class zi extends fu{
public void A(){
System.out.println("子类A方法被调用");
}
public void B(){
System.out.println("子类中B方法被调用");
}
}
你现在可能会说,那我们如果要调用父类中的B方法该怎么办呢?这里super关键字就起到了作用,同样我们只对子类代码进行操作,看代码~:
public class zi extends fu{
public void A(){
System.out.println("子类A方法被调用");
}
public void B(){
super.B();
System.out.println("子类中B方法被调用");
}
}
九、方法重写
前言:当你觉得你的父类方法不满足你的某一个子类的需求但别的父类又需要时,你改怎么办呢???这里我们引入了方法重写!
什么是方法重写?
方法重写就是当我们的子类和父类的中的方法声名相同时,我们既要父类方法的功能,也要子类特有的内容时就需要对父类方法进行重写,切记切记!!方法名写别写错。。。。。
注意事项:父类中的私有方法不可重写,并且访问权限不能更低!!!这里简单说一下Java访问权限顺序(public>默认>私有)
看代码(注意看不同!!):
//父类
public class fu {
public void B(){
System.out.println("父类中B方法被调用");
}
}
//子类
public class zi extends fu{
public void A(){
System.out.println("子类A方法被调用");
}
public void B(){
System.out.print("我需要调用父类B方法:");
super.B();//这里我们可以写与父类B方法同样的内容,但太麻烦,所以用super关键字!!
}
}
//测试
public class zi_fu_demo {
public static void main(String[] args) {
zi z=new zi();
z.A();
z.B();
}
}
现在我们对子类稍稍改动一点:
public class zi extends fu{
public void A(){
System.out.println("子类A方法被调用");
}
void B(){
System.out.print("我需要调用父类B方法:");
super.B();
}
}
看,报错了吧~~~~~~
总结
以上就是我对继承的理解,有什么地方没讲到或者有错,欢迎指正!!!