奋斗黑马程序员----面向对象之继承小结

来源:互联网 发布:手机软件禁止访问网络 编辑:程序博客网 时间:2024/05/17 06:01

------- android培训java培训、期待与您交流! ----------

/** 继承小结:*/class Student{private String name;private int age;public void setName(String name){this.name = name;}public void setAge(int age){this.age = age;}public String getName(){return name;}public int getAge(){return age;}}class Worker{private String name;private int age;public void setName(String name){this.name = name;}public void setAge(int age){this.age = age;}public String getName(){return name;}public int getAge(){return age;}}//对比发现/*1,当定义很多类时,发现这些类中有很多共性的描述,如果每一个类中都有的话,就会很麻烦,而且会浪费内存空间那么怎么解决呢?所以:将学生和工人的共性描述抽取出来,单独进行描述,只要让学生和工人与单独描述的这个类有关系,就可以了!这种关系就称为继承!继承的描述:1,多个类中存在相同属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无论谁再定义这些属性和行为,只要继承单独的那个类即可。2,多个类可以称为子类,单独的这个类称为父类或者超类。3,子类可以直接访问父类中的**非私有**的属性和行为。(注意,是非私有的属性和行为)4,通过extends关键字让类与类之间产生继承关系。eg:class SubDemo extends Demo{}继承的好处:5,继承的出现提高了代码的复用性6,继承的出现让类与类之间产生了关系,提供了多态的前提。注意:千万不要为了获取其他类的功能,简化代码而继承,必须是类与类之间有所属关系才可以继承,所属关系:A is a sth,即A是sth的一种*///如此,以上代码就可以简化为:class Person//人类,{private String name;private int age;/** * 给name赋值 * @param name */public void setName(String name){this.name = name;}/** * 设置年龄 * @param age */public void setAge(int age){this.age = age;}/** * 取得name * @return */public String getName(){return name;}/** * 取得 age * @return */public int getAge(){return age;}}class Student extends Person//Student类是Person类的子类,Person类称为父类{//此时,该类自动有了name,age属性}class Worker extends Person//Worker类是Person类的子类,Person类称为父类{//此时,该类自动有了name,age属性}/*但是: *在java语言中:java只支持单继承,不支持多继承,即:一个子类只能有一个父类。但一个父类可有多个子类 * java中,一个孩子只能有一个父亲!哈哈!就像人一样 * 如:学生类,只能继承Person一个类,不能同时再继承其他类 * 因为多继承容易带来安全隐患:当多个父类中定义了相同功能,且功能内容不同时,子类对象不能确定要运行那一个! * 但是java保留了这种机制,并用另一种体现形式来完成表示,**多实现**。(接口) *  * 但是java支持多层继承。也就是一个继承体系。 * 如:class C{} * class B extends C{} * class A extends B{} * **那么如何使用继承体系呢? *想要使用体系, *先查阅体系父类的描述,因为父类中定义的是该体系中的共性功能。(也是最基本的功能) * 通过了解共性功能,就可以知道该体系的基本功能 * 这个体系就基本可以使用了。 * 在具体调用时,要创建最底层子类的对象。为什么呢? *一是因为父类不能创建对象(抽象类); *  二是,创建子类对象可以使用更多的功能,包括基本的,也包括特有的,包括继承的,可以扩展功能 *  * 简而言之:查阅父类功能,创建子类对象使用功能*//* *事物间聚集关系与聚合关系,组合关系 * 聚集:A has a B,就是A里有一个B。 * 组合:事物的联系程度更紧密。如:手是人身体的一部分。 *如:b和c组成a,那么b,c就是组合关系,a和b,a和c就是聚集关系*///由于子类可以继承父类的内容,那么子父类出现后,类成员是如何变化的呢?/*   *类中成员包含三个部分: * 1,变量 * 2,函数 * 3,构造函数 *  * 1,变量:如果子父类中出现了非私有的同名成员变量时,子类要访问本类中的变量:用this. * 子类要访问父类中的同名变量,用super. * super的使用和this的使用几乎一致 * this代表的是本类对象的引用 * super代表的是父类对象的引用 *  * 2,子父类中的函数: * 当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容, * 如同父类的函数被覆盖一样 * 这种情况是函数的另一个特性:重写(覆盖) *  * 当子类继承了父类,此时沿袭了父类的功能到子类中,但是,子类虽具备该功能,功能的内容却和父类不一致, * 这时,没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能内容 *  * 覆盖: * 子类覆盖父类,必须保证子类权限大于等于父类,才可以覆盖,否则编译失败 * 静态只能覆盖静态,(加载顺序问题) *  * 记住: * 重载:只看**同名函数**的参数列表 * 重写:子父类要一模一样,包括返回值类型*///如下:class Person{ String name = "里斯"; int age = 20; void showName()//权限默认不写时,权限介于public和private之间 { System.out.println("这里是人类的名字:"+name); } public String getName() { return name; }}class Student extends Person //Student类时Person类的子类,Person类称为父类{//此时,该类自动有了name,age属性String name = "小明";public void showName()//这里是覆盖,但是不会输出父类的内容{System.out.println(this.age);//此时,age还是指向了父类的age,为什么?因为子类没有定义,会默认指向父类的System.out.println("这次打印的是学生的姓名:"+this.name);System.out.println("还是学生的姓名:"+name);//由此可见,如果不用super标示,name默认是Student类的nameSystem.out.println("这个是谁的名字:"+super.name);}public String getName()//这是,子类必须和父类的类型一致{this.name = "Steven";//不会错return name;}}class Worker extends Person{//此时,该类自动有了name,age属性}public class 总结一 {/**主函数入口 * @param args */public static void main(String[] args) {// TODO Auto-generated method stubStudent s = new Student();s.showName();System.out.println(s.getName());}}/* 3,子父类的构造函数 * * 在对子类对象进行初始化时,父类的构造函数也会运行 * 那是因为子类的构造函数默认第一行有一条隐式的语句    super(); * super(); 会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super(); *  * 为什么子类一定要访问父类中的构造函数: * 子类在用父类中的数据前,是否要查看一下该数据有没有初始化呢?那是必须的 * 因为:父类中的数据,子类可以直接获取,所以子类对象在建立时,需要查看父类是如何对这些数据进行初始化的 * *也就是说,父类会先于子类初始化,这样子类才能访问父类中的内容 * * 所以子类在对象初始化时,要先访问一下父类中的构造函数, * 如果要访问父类中指定的构造函数,可以通过手动的定义super()语句的方式来指定,如:super(5); *  * 注意:super();语句一定要定义在子类构造函数的第一行,否则出错 *  * this();和super();都要放在第一行,所以二者不能同时出现在第一行, * 但是他们为什么要出现在第一行?因为初始化动作要先做 *  * 子类的实例化过程:(很重要) * 结论:子类的所有的构造函数,默认都会访问父类中**空参数**的构造函数,因为子类的每一个构造函数内的第一行都有一句隐式super(); * 当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数 * 当然,子类的构造函数第一行也可由手动指定this();语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数 *///如下:class Person{ String name = "里斯"; int age = 20; Person()//显示定义默认的构造函数,无参数 { System.out.println("这里是父类默认的构造函数--Preson run"); } Person(String name)//自定义的构造函数 { System.out.println("自定义的父类构造函数,会输出姓名:  "+name); }}class Student extends Person {String name = "小明";Student()//默认的构造函数{//如果不指定构造函数,就会访问默认的构造函数super("张三");//手动指定父类的构造函数,就不会访问默认的构造函数System.out.println("这里是子类默认的构造函数--Student run");}Student(String name)//自定义的构造函数{this();System.out.println("自定义的子类构造函数,会输出姓名:    "+name);}Student(int age)//自定义的构造函数{//没有指定父类的构造函数,会访问默认的System.out.println("自定义的子类构造函数,会输出年龄:  "+age);}}public class 总结一 {/**主函数入口 * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("第一次初始化对象:");Student s = new Student();System.out.println();System.out.println("第二次初始化对象:");Student s1 = new Student("往东");System.out.println();System.out.println("第三次初始化对象:");Student sd = new Student("90");}}


 

------- android培训java培训、期待与您交流! ----------  

详细请查看:http://edu.csdn.net/heima/ 

原创粉丝点击