Java 继承

目录

1.继承的概念

2.继承的特性

3.super 与 this, final,static 关键字


1.继承的概念

       继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

       例如新建一个Person类,拥有age,name属性和introduce方法。

public class Person {
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void introdce() {
		System.out.println("My name is "+getName()+",I am "+getAge()+" years old.");
	}
}

  再新建一个学生类,同样拥有age,name属性和introduce方法,同时还有school属性和study方法。

public class Student {
	private int age;
	private String name;
	private String school;
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void introdce() {
		System.out.println("My name is "+getName()+",I am "+getAge()+" years old.");
	}
	public void study() {
		System.out.println("I am studying in "+getSchool());
	}
}

       观察这两个类可知,他们拥有相同的属性和方法。如果再新建一个Teacher类,同样拥有age,name属性和introduce方法,又得重复写一遍,非常麻烦。这时我们可以将他们相同的属性和方法抽取出来写到一个类里,通过继承的方式实现我们的需求。以Person类和Student类为例,我们可以用Student类继承Peron类。

//extends 为继承关键字
public class Student extends Person {
	private String school;
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	
	public void study() {
		System.out.println("I am studying in "+getSchool());
	}
}

       被继承的类(Person)称为父类,也叫超类,实现继承的类(Student)叫子类,也称派生类。 通过继承Student类拥有了父类的属性和方法,简化了代码。

public static void main(String[] args) {
		Student student = new Student();
		student.setAge(20);  //引用父类方法
		student.setName("Amy");
		student.introdce();
	}

     Student类里没有introduce方法,但通过继承获得Person类的方法,可直接调用。运行结果:

My name is Amy,I am 20 years old.

 

2.继承的特性

  ①Java 不支持多继承,但支持多层继承

     一个类只有一个父类,例如A类不能既继承B类,又继承C类。但B类可以继承C类,然后A类再去继承B类(多层继承)

· ②子类拥有父类非private的属性,方法

     如果把上面Person类的introduce方法改为private,Student类对象不能引用。

· ③子类可以拥有自己的属性和方法,即子类可以对父类进行扩展(可以理解为:“子类 is a 父类”

      上面例子中,Student类除了继承Person类的属性和方法,还拥有school属性和study方法.

  ④子类可以重写父类的方法

重写定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称方法的重置、覆盖在程序执行时,子类的方法将覆盖父类的方法。

在上面的例子中,Student类继承Person类,我们可以在Student类中重写introduce方法。

public class Student extends Person {
	private String school;
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	
	@Override  //重写标志
	public void introdce() {
		// TODO Auto-generated method stub
		System.out.println("My name is "+getName()+",I am "+getAge()+" years old."+"My school's name is "+getSchool());
	}
	public void study() {
		System.out.println("I am studying in "+getSchool());
	}
}

  当我们新建Student对象引用introduce方法时,将执行子类重写的方法。(本例中即输出“My name is.....My school's...”)。

 注意:

Ø重写方法必须被重写方法具有相同的方法名称、参数列表和返回值类型。

Ø重写方法不能使用比被重写方法更严格的访问权限。(例如不能将public改为protected,但可将protected改为public)。

3.super this, final ,static关键字

  ①final

    当用final修饰一个类时,表明这个类不能被继承。修饰一个方法时,该方法不能被重写。修饰属性变量时该变量为常量,不能修改,只能在定义时初始化或者构造方法中初始化。

②static

   static修饰方法时,表示方法属于类,称为静态方法,不用定义对象可直接调用。

class A{
	final int i = 0;
	public static void out() {
	 System.out.println("7777777");
	}
} 
//调用静态方法
class B {
	public static void main(String[] args) {
		A.out();
	}
}

  static修饰变量时,该变量也属于类,称为静态变量,也可直接调用。

  注意:静态方法中只能调用本类中的静态变量和静态方法。

 ③this

   我们在写类属性的set方法用过。他可以用来引用成员变量,成员方法,也可以引用构造方法。

class A{
	private int i;
	A(){
		System.out.println("无参构造函数");
	}
	A(int i){
		this();//引用构造函数(必须写在第一行)
		this.i = i; //引用成员变量
	}
	public  void out() {
	 System.out.println("7777777");
	}
	public void output() {
		this.out(); //引用成员方法
	}
} 

 ④super

    我们可以通过super关键字来实现对父类(非private)成员,方法的访问,也可以调用父类的构造器。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器, 如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

class A{
	private int i;
	A(int i){
		this.i = i;
	}
	public  void out() {
	 System.out.println("7777777");
	}
}
class B extends A{
	public B(int i) {
		super(i); // 调用父类构造函数(必须写在第一行)
		super.out(); //调用父类方法
	}
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值