【黑马程序员】第四章:面向对象(下)

一、类的继承


1、继承的概念

   在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种书屋之间形成一种关系体系。例如猫和狗都属于动物,程序中便描述为猫和狗继承自动物,同理波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗都继承自狗,这些动物之间会形成一个体系。

   在 Java  中,类的继承是指在一个仙有泪的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称为父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用 extends 关键字。

//定义 Animal 类
class Animal{
	String name;
	void shout(){
		System.out.println("动物发出叫声");
	}
}
//定义 Dog 类继承 Ainmal 类
class Dog extends Animal{
	public void printName(){
		System.out.println("name=" + name);
	}
}
class ExtendsDemo1{
	public static void main(String[] args){
		Dog dog = new Dog();
		dog.name = "沙皮狗";
		dog.printName();
		dog.shout();
	}
}

   运行结果如下:

   继承的特点:

  • 类只支持但继承,不允许多重继承,也就是说一个类只能有一个直接父类;

        //这种情况是不合法的!
        class A{}
        class B{}
        class C extends A,B{}

  • 多个类可以继承一个父类;

	//这种情况是允许的!
	class A{}
	class B extends A{}
	class C extends A{}

  • 多层继承是可以的,即一个类的父类可以再去继承另外的父类;

	//这种情况是允许的!
	class A{}
	class B extends A{}
	class C extends B{}

  • 子类和父类是一种相对概念,也就是说一个类时某个类父类的同时,也可以是另一个类的子类。

   继承的作用:

  • 继承的出现提高了代码的复用性;
  • 让类与类之间产生了关系,提供了多态的前提。

   定义继承需要注意:

  • 不要仅为了获取其他类中的某个功能而去继承;
  • 类与类之间要有所属关系,xx1 是 xx2 的一种。

2、重写父类方法

   在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。需要注意的是,在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。

//定义 Animal 类
class Animal{
	void shout(){
		System.out.println("动物发出叫声");
	}
}
//定义 Dog 类继承 Ainmal 类
class Dog extends Animal{
	void shout(){
		System.out.println("汪汪······");
	}
}
//定义测试类
class ExtendsDemo1{
	public static void main(String[] args){
		Dog dog = new Dog();
		dog.shout();
	}
}

   运行结果如下:


  注意:子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限,如父类中的方法是 public 的,子类的方法就不能是 private 的。

3、super 关键字

   当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在 Java 中专门提供了一个 super 关键字用于访问父类的成员,例如访问父类的成员变量、成员方法和构造方法。

   super 关键字的具体用法:

  • 使用 super 关键字调用父类的成员变量和成员方法;

              >  super . 成员变量
              > super . 成员方法([参数1,参数2···])

class Animal{
    String name = "动物";
    void shout(){
        System.out.println("动物发出叫声...");
    }
}
class Dog extends Animal{
    String name = "犬类";
    void shout(){
        super.shout();
    }
    void printName(){
        System.out.println("name="+super.name);
    }
}
public class Example{
    public void main(String[] args){
        Dog dog = new Dog();
        dog.shout();
        dog.printNmae();
    }
}

  • 使用 super 关键字调用父类的构造方法;

              > super([参数1,参数2...])

class Animal{
	public Animal(String name){
		System.out.println("我是一只"+name);
	}
}
class Dog extends Animal{
	public Dog(){
		super("沙皮狗");
	}
}
public class Example{
	public void main(String[] args){
		Dog dog = new Dog();
	}
}

   需要注意的是

  • 通过 super 调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次;
  • 子类中所有的构造函数默认都会访问父类中空参数的构造函数,因为每一个构造函数的第一行都有一句默认的 super();
  • 当父类中没有空参数的构造函数时,子类的构造函数必须通过 this 或 super 语句指定要访问的构造函数。

二、final 关键字


   final 关键字可用于修饰类、变量和方法,它有 " 这是无法改变的 " 和 " 最终 " 的含义,因此被 final 修饰的类、变量和方法将具有以下特性:

  • final 修饰的类是不能继承的;
  • final 修饰的方法不能被子类重写;
  • final 修饰的变量(成员变量和局部变量)是常量,只能赋值一次。

1、final 关键字修饰类

   Java 中的类被 final 关键字修饰后,该类将不可以被继承,也就是不能派生子类。

//使用 final 修饰Animal类
final class Animal{}
//Dog继承Animal类
class Dog extends Animal{}
//测试类
public class Example{
	public void main(String[] args){
		Dog dog = new Dog();
	}
}

   编译程序报错:


2、final 关键字修饰方法

   当一个类的方法被 final 关键字修饰后,这个类的子类将不能重写该方法。

//定义Animal类
class Animal{
	//使用final修饰
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值