黑马程序员--关于Java的继承,多态的个人笔记

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

知识点一:继承

一、继承概念

继承是面向对象的特点之一,是一个非常重要的特征。在Java中,当多个不同命名的类具有相同属性或者相同的方法的时候,我们需要简化我们的代码,不能让相同的东西在不同的类中重复的出现,这样可能会增加阅读的复杂度。所以我们这个时候就可以用到继承这个概念。

首先,我们将相同的部分抽取出来,然后创建一个super类,就是用来被其他类继承的类。在这个super类里面我们把刚才很多类里面共有的东西都提取出来,写到这个super类中,其他的类只要通过继承的方式(使用extends关键字)就可以向原先一样有相同的功能,而且代码上会变得更加的清晰,易读。

具体的语法是:class Child extends Super{ class body } 

继承的特点有以下几点:

1.提高了代码的复用性。

2.让类和类之间相互有了关联,有了具体的共性。

3.提高代码的可读性。

注意和C++不同的是,Java是单继承,不是多继承,所有在一个类中只允许在extends后面跟一个类名

比如:class Child extends Super , Super2{ class body } 。这个样子是错的,假如在IDE上开发会直接报出语法错误。


二、继承的应用场景和相关示例代码

1.当存在多个类都有共同属性的情况下。

2.当存在多个类都有相同的方法的情况下。

3.当某个类是抽象类的情况下。

上述几种情况均可以使用到继承。下面,我给大家简单的展示一下示例代码:

package cn.suzuki_tech;

public class Human {

	/**
	 * 为了让子类继承之后能够使用到下面的成员变量,
	 * 必须使用protected修饰。这样保证了只有子类才能使用,其他的无关的类无法使用。
	 */
	protected String name;
	protected int age;
	protected String Sex;
	
	//父类的构造器
	public Human(String name , int age , String sex) {
		this.name = name;
		this.age = age;
		this.Sex = sex;
	}
	
	public static void main(String[] args) {
		Student st = new Student("suzuki", 17, "boy", 14237);
		System.out.println(st.getName());//打印student对象的name属性
		st.hello();
	}
	
	void hello(){
		System.out.println("this is human's hello");
	}
	
	//相关的属性方法。
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return Sex;
	}
	public void setSex(String sex) {
		Sex = sex;
	}
}

/**
 * 定义Student类,继承Human类
 */
class Student extends Human{
	
	private int stuNum;//学生类自己的成员变量
	
	public Student(String name, int age, String sex,int stuNum) {
		super(name, age, sex);//完成父类的构造器
		this.stuNum = stuNum;//子类的构造器
	}

	void hello(){
		System.out.println("this is student's hello");
	}
	
	//student类自己的属性方法
	public int getStuNum() {
		return stuNum;
	}

	public void setStuNum(int stuNum) {
		this.stuNum = stuNum;
	}
}
运行的结果截图:(编辑工具Eclipse)


三、小结

1.上述代码中,需要注意到的一点是在Java继承在代码编写的时候,一定要让子类在自己的域看见父类的东西(成员变量,成员方法等)。因此,应该使用Protected修饰符

2.其次,你可以在示例代码中看见如图情况:

父类代码

子类代码

因此,这就是继承带来的好处,当父类继承过来的东西满足不了子类的需求的时候,可以考虑采取这种override的方式然后覆盖掉父类继承过来的功能。



知识点二:多态

一、多态的概念

Java的引用变量有两种类型,一是编译类型,二是运行类型。编译类型有声明该变量时使用的类型决定,运行时类型,由实际赋予该变量的对象决定。如果编译时类型和运行时类型不一致,那么就会出现多态。

所谓的编译时类型和运行时类型,请看:Aclass aa = new Aclass();这时,编译时类型有等号左边的 aa运行时类型就是赋给aa的值。就如大家经常听到的对象引用,指向实际对象实体;等号右边的new Aclass();就创建了一个对象的实体,它就是运行时类型


二、多态的代码示例

package cn.suzuki_ted
 
class BaseClass
{
	public int book = 111;
	public void base()
	{
		System.out.println("父类方法");
	}
	public void test()
	{
		System.out.println("父类被用来覆盖的方法");
	}
}
public class SubClass extends BaseClass
{
	//重新定义一个book实例属性覆盖父类的book实例属性
	public String book = "sdjflsdfsdj";
	public void test()
	{
		System.out.println("子类的覆盖父类的方法");
	}
	public void sub()
	{
		System.out.println("子类的普通方法");
	}
	public static void main(String[] args)
	{
		//下面编译时类型和运行时类型完全一样,因此不存在多态
		BaseClass bc = new BaseClass();
		//输出 111
		System.out.println(bc.book);
		//下面两次调用将执行BaseClass的方法
		bc.base();
		bc.test();//输出父类被用来覆盖的方法

		//下面编译时类型和运行时类型完全一样,因此不存在多态
		SubClass sc = new SubClass();
		System.out.println(sc.book);
		//下面调用将执行从父类继承到的base方法
		sc.base();
		//下面调用将执行从当前类的test方法,sub方法
		sc.test();
		sc.sub();//输出子类普通方法

		//下面编译时类型和运行时类型不一样,多态发生
		BaseClass bbc = new SubClass();
		System.out.println(bbc.book);
		//下面调用将执行从父类继承到的base方法
		bbc.base();
		//下面调用将执行从当前类的test方法
		bbc.test();//输出子类的普通方法

	}
}

上述代码我们可以看见如下的几个特点:

1.当使用的编译类型和运行类型均为同一个类的时候,当前的对象只能访问本类的相关的方法,打印出来的东西和其他类无关。

2.当使用的编译类型是父类,运行类型是子类的时候,在存在没有override的情况下,该对象即可以访问父类继承过来的属性,有可以访问自己本身覆盖过的方法。

比如上述例子中:BaseClass bbc = new SubClass();这个就是父类的引用指向子类的对象。

这个bbc对象既可以访问没有被覆盖的成员变量即 public int book = 111; 同时也可以访问运行时类型本身的方法,比如test方法

3.大家是否看见我在子类中还写了一个方法,叫做sub();方法,但是,你可以尝试一下在使用父类引用指向之类对象的情况下,即使用bbc这个引用去访问这个sub方法,你会发现,这样是会发生编译时报错的。这是因为,在编译类型中没有存在sub()这个方法,这个方法是属于运行时类的,所以在编译的时候报错。


三、小结一下多态

多态具有一下的优点:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。


不过更多的用处还是得从开发中学习。本人初来乍到,文章算是我自学的一些小见解吧。





















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值