继承,多态,接口与抽象类学习总结

一,继承

动手实验_1:

题目:运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大!

TestInherits.java:

class Grandparent {
    public Grandparent(){
          System.out.println("GrandParent Created.");
}
    public Grandparent(String string) {
            System.out.println("GrandParent Created.String:" + string);
 }
}
class Parent2 extends Grandparent{
    public Parent2(){
            super("Hello.Grandparent.");
            System.out.println("Parent Created");
       // super("Hello.Grandparent.");
      }
}
class Child2 extends Parent2 {
    public Child2()  {
        System.out.println("Child Created");
      }
}

public class TestInherits {
    public static void main(String args[]) {
            Child2 c = new Child2();
  }
}

结论:

1,子类的构造方法在运行之前,必须调用父类的构造方法。

2,通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。

(注:super的用法:(1)调用父类的构造方法(2)操作被隐藏的成员变量和被覆盖的成员方法)

思索:为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

答:

构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。不能反过来调用也是这个原因,因为父类根本不知道子类有神魔变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!2,探索技术的奥秘:参看ExplorationJDKSource.java示例并运行得到了一个奇特的运行结果: [email protected]版)为什么?曲折的探索之路:(1)使用javap –c命令反汇编ExplorationJDKSource.class;

(2)阅读字节码指令,弄明白println()那条语句到底调用了什么?

前面示例中,main方法实际上调用的是: public void println(Object x),这一方法内部调用了String类的valueOf方法。

valueOf方法内部又调用Object.toString方法:

public String toString(){

return getClass().getName() +"@" + Integer.toHexString(hashCode());

}

hashCode方法是本地方法,由JVM设计者实现: public native int hashCode();

3,神奇的“+”号
Fruit.java
public class Fruit
{

    public String toString()
    {
        return "Fruit toString.";
    }

    public static void main(String args[])
    {
        Fruit f=new Fruit();
        System.out.println("f="+f);
        System.out.println("f="+f.toString());
    }
}

结论:

1,首先,Fruit类覆盖了Object类的toString方法。

2,在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。

4,请自行编写代码测试以下特性(动手动脑):

在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。

Test.java

class fu{
    void fun() {
        System.out.println("父类——fun()");
    }
}
class zi extends fu{
    void fun() {
        super.fun();
    }
}
public class Test1 {
    public static void main(String[] args) {
        zi t1=new zi();
        t1.fun();
    }

}

二,多态

1,在实践中理解把握复杂的知识-1

ParentChildTest.java

public class ParentChildTest {
    public static void main(String[] args) {
        Parent parent=new Parent();
        parent.printValue();
        Child child=new Child();
        child.printValue();

        parent=child;
        parent.printValue();

        parent.myValue++;
        parent.printValue();

        ((Child)parent).myValue++;
        parent.printValue();

    }
}

class Parent{
    public int myValue=100;
    public void printValue() {
        System.out.println("Parent.printValue(),myValue="+myValue);
    }
}
class Child extends Parent{
    public int myValue=200;
    public void printValue() {
        System.out.println("Child.printValue(),myValue="+myValue);
    }
}

问题:

1. 上边的程序运行结果是什么?

2. 你如何解释会得到这样的输出?

前两行正常,

第三行,当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,

第四行,parent=child;仅仅是将parent中有的值用child的值代替,所以parent.myValue++;parent只有一个自己的myValue值,而输出的是child的myValue。

第五行,强制类型转换,++作用在child的myValue,输出的也是child的myValue

3. 计算机是不会出错的,之所以得 到这样的运行结果也是有原因的, 那么从这些运行结果中,你能总 结出Java的哪些语法特性?

总结:

1,当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

2,这个特性实际上就是面向对象“多态”特性的具体表现。

3,如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

4,如果子类被当作父类使用,则通过子类访问的字段是父类的!



原文地址:https://www.cnblogs.com/20183544-wangzhengshuai/p/11720989.html

时间: 2024-10-15 08:26:59

继承,多态,接口与抽象类学习总结的相关文章

php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关E

基础学习day07---面向对象三---继承,接口与 抽象类

一.继承 1.1.继承概念 将对象的共性抽取出来.提取出一个单独的类. 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法通过 extends 关键字让类与类之间产生继承关系. 让类和类之间产生了关系,有了这个关系,才有了多态的特性. 注意:千万不要为了获取其他类的功能,简化代码而继承. 必须是类与类之间有所属关系才可以继承,所属关系是 is  a.的关系 1.2

封装,继承,多态,接口

封装 封装的概述和好处: 是面向对象三大特征之一 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改. 封装原则: 将不需要对外提供的内容都隐藏起来. 把属性隐藏,提供公共方法对其访问. 成员变量private,提供对应的getXxx()/setXxx()方法 好处: 通过方法来控制成员变量的操作,提高了代码的安全性 把代码用方法进行封装,提高了代码的复用性 public class Student { String name; //int age

修饰、继承、接口、抽象类

 1.private 修饰属性或者方法,只能在本类中被访问,定义后需要加get()set()方法,这样提高数据的安全性 私有属性虽然不能直接访问,但是其对象 或者 子类对象可以通过公有方法进行设值和获取,这就是为什么最好加get和set方法 私有方法存在于本类并且不能在其他类中被使用 package my_acm; class Hello{ private int id=12; public int getid(){ return this.id; } public void Setid(int

继承多态接口

1. 继承的作用?好处?坏处? 继承:通过继承实现代码复用.Java中所有的类都是通过直接或间接地继程java.lang.Object类得到的.继承而得到的类称为子类,被继承的类称为父类.子类不能继承父类中访问权限为private的成员变量和方法.子类可以重写父类的方法,及命名与父类同名的成员变量.但Java不支持多重继承,即一个类从多个超类派生的能力. 优点:a因为大部分是继承而来的,实现代码重用,减少代码书写量: b很容易修改和扩展已有的实现 缺点:a打破了封装,因为基类向子类暴露了实现细节

继承、接口和抽象类

继承 子类继承父类 物以类聚->提取共同点形成父类(parent)/基类(base)/超类(super) 子类/派生类继承父类 子类也会继承父类的属性(成员变量)和方法,私有的成员变量(private)除外,private变量要用public方法去访问. 同名同参情况下,本类的方法会比父类的方法优先级高. 单根继承:每个类都只能继承一个类(C++可以多个类) 不写extends,java类默认继承于java.lang.Object类,默认有方法toSrting,clone,equals,fina

接口与抽象类小练习

/* 继承中接口与抽象类练习: 乒乓球运动员和篮球运动员 乒乓球教练和篮球教练. 为了出国交流,乒乓球相关人员都需要学习英语 分析: 乒乓球运动员:属性: 姓名,年龄,技能: 打乒乓球 篮球运动员: 属性: 姓名年龄, 技能: 打篮球 乒乓球教练: 属性: 姓名,年龄, 技能: 教练乒乓球 篮球教练: 属性: 姓名,年龄 技能: 教练 篮球 运动员抽象类: 属性: 姓名,年龄, 方法: 打球 教练抽象类: 属性: 姓名年龄, 方法: 教练 接口: 学习英语 实现: 接口: 学习英语 运动员抽象类

初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM,字节码 两个命令: javac helloworld.java:将Java文件编译为字节码的.class文件 java helloworld:运行Java程序...??暂时这么认为 数据类型: 普通数据类型:int a=3; 对象数据类型:使用关键字new,String s=new String("

java----基础(this,继承,多态,抽象类,接口)

this指针 this指针在类定义时用到,this属于用类实例化的对象,只能在定义类的时候使用:(在下面的代码中会有体现) 类变量&类方法 定义: 访问修饰符 static+数据类型+变量名 所有该类的对象均可访问,均可修改,不会在调用后初始化,相当于全局变量. 可以被所有对象访问到,并且可以通过类访问到  类名.类变量 静态方法 == 类方法 可以被类名和对象访问到 原则上类变量用类方法来访问 类方法中不能访问非类变量,类变量可以被非类方法访问. 四种访问控制符: public : 对外公开