黑马程序员--关于Java的继承,多态的个人笔记
来源:互联网 发布:网易云课堂mac版 编辑:程序博客网 时间:2024/06/07 09:45
------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();//输出 111System.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)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
不过更多的用处还是得从开发中学习。本人初来乍到,文章算是我自学的一些小见解吧。
- 黑马程序员--关于Java的继承,多态的个人笔记
- 黑马程序员Java 多继承个人总结
- 黑马程序员---Java的继承
- 黑马程序员---Java的继承
- 黑马程序员java学习笔记——面向对象的特征封装、继承和多态
- 黑马程序员_java关于子类的继承
- 黑马程序员-------java学习笔记之继承与多态
- 《黑马程序员》java笔记->【03】关于继承与覆盖
- 【黑马程序员】java中的继承多态的体现,什么情况下用继承
- 黑马程序员 java继承的学习总结
- 黑马程序员-java中继承的使用
- 黑马程序员—JAVA类的继承
- 黑马程序员-java面向对象的继承
- 黑马程序员--java 类的继承
- 黑马程序员--Java的继承和实现
- 黑马程序员—关于Java中的内部类的笔记
- 黑马程序员-我的入学笔记4-类的继承和多态
- 黑马程序员学习笔记 关于继承
- robotium相关代码学习
- iphone自定义弹出式菜单(popoverView)
- 哈希表基础知识(3)
- 关于数学的一些资料整理
- Mysql 源码安装
- 黑马程序员--关于Java的继承,多态的个人笔记
- 自定义控件实现锁屏效果!
- 建一个maven WEB项目
- 京东高调开售三星SUHD TV,从“真”向“壕”转型?
- leveldb之log写操作
- Windows Phone Gird布局
- 【POJ】3667-Hotel(线段树的区间合并)
- Robotium源码分析之运行原理
- 使用红杏公益代理,更新Android Studio,SDK以及Gradle等