JAVA继承

JAVA继承

一、继承介绍

1.什么是继承

继承是将多个子类的共性,往上抽取到父类当中,实现代码的复用性,和维护性。

2.为什么要继承(有何好处)

继承是面对对象编程的三个特性之一,它能够提高代码的复用性维护性。同时继承使两个类之间产生了联系,是多态的前提。

二、怎样继承

1.extends关键字

关键字  class childrenClass  extends  fatherClass...

extends 是继承关键字,它说明了该类继承自哪一个类。在JAVA中只支持单继承,也就是说extends 后面只能写一个类名。
如果想要多重继承 ,可以使用接口来实现。

2.Object 类是所有类的父类。

JAVA有着自己的继承体系,虽然不支持多继承但支持多重继承。所有我们能够使用的类都有一个共同的父类就是Object类。
即使我们自己创建的类 不声明继承,他也会默认继承自Object类。

三、怎么使用继承

1.如何调用父类成员

1)super关键字

super 代表父类空间的一个表示,你可以理解为父类的一个引用,通过super可以访问父类的数据。
super用来在子类局部范围访问父类的成员变量 成员方法,构造方法

2)this与super的区别

this 代表的是本类对象的引用
super 代表的是父类存储空间的标识(可以理解成父类的引用,可以操作父类的成员)
this和super的使用
调用成员变量
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量
调用构造方法
this(…) 调用本类的构造方法
super(…) 调用父类的构造方法
调用成员方法
this.成员方法 调用本类的成员方法
super.成员方法 调用父类的成员方法

2.子类能够使用父类的哪些功能。

1)调用父类的成员变量与成员方法

思考一下代码为什么不会编译成功

public class A {
	private int a;
}
public class B extends A{
	private int b;
	public B(){
		b=super.a;   //编译报错,找不到 a
	}
}

这是因为子类只能继承父类所有非私有的成员(包括成员方法和成员变量)。
那我们应该如何进行改进,如果将父类的成员声明为public 类型,则程序会失去封装性。
这时候可以使用protected关键字,protected可用于保护继承。protected关键字声明的成员可以被子类和同一包下的无关类所访问到,

本类同一个包下(子类和无关类)不同包下(子类)不同包下(无关类)
privateY
默认YY
protectedYYY
publicYYYY

以下代码编译器则不会报错。

public class A {
	protected int a;
	protected void method()
	{
	}
}
public class B extends A{
	private int b;
	public B(){
		b=super.a;   
		super.method();
	}
}
2)调用父类的构造方法

子类不能继承父类的构造方法但可以通过super来调用父类的构造方法。
子类的构造方法中会默认调用父类的构造方法

public class A{
}
public class B extends A(){
	public B(){
		super();//系统会默认在子类构造方法中第一句调用父类的构造方法(即使不写)
		...
	}
}

那么应该如何通过调用父类的构造方法来实例化自己的成员变量。

public class A{
		protected int a;
		public A(int a){
			this.a=a;...
}
public class B extends A(){
	private int b;
	public B(int a,int b){
		super(a);//调用父类构造方法
		this.b=b;	
	}
}

从上面的例子也能看出,如果创建一个子类的对象,一定会在创建子类对象前,先初始化父类的数据。因为只有等父类的数据初始化完成,子类才能去调用父类的数据。

3.子类如何对父类进行改进(方法重写)。

子类可以继承父类的所有成员(除私有成员外),如果子类想使用一个父类已有的方法,但是对于父类的方法却不太满意怎么办?
这个时候就可以使用方法重写。通过方法重写,子类可以去重写一些父类已有的方法,从而对父类的方法进行改进。

举一个简单的例子,刚才提到过Object类是所有类的父类,在Object中有一个toString()方法。Object类中的toString()方法会返回一个该类所在路径的一个字符串。其他类可以通过重写这个方法来返回一个描述该类对象的一个字符串。
我们可以先看看Object类中的toString方法

public static void main(String[] args) {
		Object o=new Object();
        System.out.println(o);//输出类的对象,相当于输出该对象的toString()返回的字符串  所以这句代码相当于System.out.println(o.toString());
}

输出结果为:
在这里插入图片描述
我们可以设计一个矩形类,通过重写toString()方法来返回对对象的描述。

public class rectangle {
    private int a, b;
    public rectangle(int a, int b) {
        this.a = a;
        this.b = b;
    }
    @Override   //重写方法表示符
    public String toString() {
        return "this rectangle length is "+a+" wide is "+b;
    }
}
public class text extends Object {
    public static void main(String[] args) {
        rectangle re = new rectangle(12,6);
        System.out.println(re);
    }
}

输出结果为
在这里插入图片描述

在方法重写中我们需要注意三点
1.子类不能重写父类的私有方法,因为不能继承。
2.子类重写方法的修饰符权限不能比父类的低。
3.子类重写的静态方法不属于方法重写。

4.如果不想让其他类继承我的类或重写我类中的方法怎么办(final关键字)。

final关键字
使用final关键去修饰一个类则该类不能被继承

public final class A{
}
public class B extends A{ //编译器报错,A类不能被继承
}

当final关键字修饰一个方法时,该方法不能被重写。

public  class A{
	public final void method(){
	}
}
public class B extends A{ 
	public void method(){//编译器报错,该方法不能重写
	}

}

当final修饰变量是该变量就是一个常量,不能再被赋值。

public static void main(String[] args) {
        final int num = 100;
        //num=1;        编译器报错。
        //final 修饰引用数据类型,指的是这个引用的地址值不能再改
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值