黑马程序员--关于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)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。


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





















0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 榨的果汁不甜怎么办 11个月宝宝吃盐怎么办 1岁半宝宝长牙慢怎么办 小孩里面的牙黑怎么办 7个半月宝宝便秘怎么办 2个月婴幼儿便秘怎么办 3个月宝宝不消化怎么办 一天大便二三次不消化怎么办 不消化没胃口几天不大便怎么办? 两个月的宝宝拉绿屎怎么办 肠胃不好消化功能差怎么办 2岁宝宝消化不好怎么办 5天新生儿不拉大便怎么办 七个月宝宝一周不拉屎怎么办 七个月的宝宝消化不良怎么办 七个月宝宝消化不良拉肚子怎么办 宝宝六个月了便秘怎么办 宝宝拉水酸臭味怎么办 50天婴儿不拉屎怎么办 六个月宝宝吃米粉便秘怎么办 纯母乳喂养的宝宝便秘了怎么办 换奶粉拉绿色是怎么办 2个月宝宝发烧怎么办 小宝绿色稀大便怎么办 新生儿吃奶粉大便干燥怎么办 婴儿拉绿色奶瓣怎么办 宝宝吃奶粉大便干燥怎么办 婴儿吃奶粉不大便怎么办 孩子喝奶粉拉大便干怎么办 吃奶粉拉不出来怎么办 一岁半宝宝睡觉抱着睡放不下怎么办 3月大婴儿拉奶瓣怎么办 70多天宝宝便秘怎么办 宝宝喝奶粉上火便秘怎么办 a2奶粉吃了便秘怎么办 两个月宝宝两天没有大便怎么办 婴儿一直拉肚子吃药也不好怎么办 吃奶粉的婴儿便秘怎么办 一个多月小狗便便不成形怎么办 3个月宝宝不拉屎怎么办 好几天不拉大便怎么办