精华内容
下载资源
问答
  • 今天在看wifi源码时候,发现一个自己在java 继承方面知识理解的一些缺陷。在这儿记录一下。

    今天在看wifi源码的时候,发现一个自己在java 继承方面知识理解的一些缺陷。在这儿记录一下。
    先上代码吧:

    这是父类:

    public class Father {
        public String  getName(){
            Log.d("cxxp","Father getName()");
            return getTrueName();
        }
    
        public String getTrueName(){
            Log.d("cxxp","Father getTrueName()");
            return null;
        }
    
        public String getResult(){
            Log.d("cxxp","Father getResult()");
           return getName();
        }
    }

    这是子类1

    public class Son1 extends Father{
        @Override
        public String getName() {
            Log.d("cxxp","Son1 getName()");
            return "son1";
        }
    
        @Override
        public String getTrueName() {
            Log.d("cxxp","Son1 getTrueName()");
            return "son1 is true name";
        }
    
        public String getMyResult(){
            Log.d("cxxp","Son1 getMyResult()");
            return getResult();
        }
    }

    这是子类2

    public class Son2 extends Father{
        @Override
        public String getName() {
            Log.d("cxxp","Son2 getName()");
            return "son2";
        }
    
        @Override
        public String getTrueName() {
            Log.d("cxxp","Son2 getTrueName()");
            return "son1 is true name";
        }
    
        public String getMyResult(){
            Log.d("cxxp","Son2 getMyResult()");
            return getResult();
        }
    }

    这是调用

        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.bt_son1_getresult:
                    Son1 s1 = new Son1();
                    tv.setText(s1.getMyResult());
                    break;
                case R.id.bt_son2_getresult:
                    Son2 s2 = new Son2();
                    tv.setText(s2.getMyResult());
                    break;
                case R.id.bt_father_getresult:
                    Father father = new Father();
                    tv.setText(father.getResult());
                    break;
            }
        }
    

    这是 log

    //case R.id.bt_son1_getresult:子类1调用 没有重写的方法 getMyResult()
    10-30 08:41:16.634 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Son1 getMyResult()
    10-30 08:41:16.634 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getResult()
    10-30 08:41:16.634 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Son1 getName()
    case R.id.bt_son2_getresult:子类2调用 没有重写的方法 getMyResult()
    10-30 08:41:20.735 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Son2 getMyResult()
    10-30 08:41:20.735 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getResult()
    10-30 08:41:20.735 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Son2 getName()
    case R.id.bt_father_getresult:父类调用 getResult() 方法
    10-30 08:41:23.652 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getResult()
    10-30 08:41:23.652 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getName()
    10-30 08:41:23.652 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getTrueName()
    

    为了便于理解这个场景,再附上一张图:

    这里写图片描述

    怎么去理解最终打出的log?

    把子类的方法当做子类加上父类的方法即可
    子类可以调用父类的方法,但是父类在没有子类对象的情况下无法调用子类的方法。
    父类的public方法,子类都会继承
    是子类的对象所以要用子类的方法

    自己的理解,如果有误,请大神指教,不胜感激。

    展开全文
  •  在看例子之前,首先关于继承有以下几个原则:  (1)子类继承了其父类中不是私有成员变量和成员方法,作为自己成员变量和方法  (2)子类中定义成员变量和父类中定义成员变量相同时,则父类中成员...

            java的继承问题是笔试面试中常考的热点之一,请看下面几个例子,并加以比较:

            在看例子之前,首先关于继承有以下几个原则:

           (1)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法
           (2)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量被隐藏
           (3)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法被覆盖。

            Test1.java

            

    package extend;
    
    class A1{
    	int a = 1;
    	public int getA() {
    		return this.a;
    	}
    }
    
    class B1 extends A1 {
    	int a = 2;
    }
    
    public class Test1 {
    	public static void main(String[] args) {
    		B1 b =new B1();
    		System.out.println(b.getA());
    	}
    }

            此例中,B1继承了A1, 根据原则(2),父类中的int a 变量被隐藏,所以此时如果直接打印:b.a,得到的结果会是2。但是因为B1中没有同名的getA()方法,所以b.getA()中调用的getA()是继承自A1类的,A1类中的getA()调用的是它本身的a(A1.a),所以输出为: 1

          
            Test2.java

    package extend;
    
    class A2{
    	int a = 1;
    	public int getA() {
    		return this.a;
    	}
    }
    
    class B2 extends A2 {
    	int a = 2;
    	public int getA() {
    		return this.a;
    	}
    }
    
    public class Test2 {
    	public static void main(String[] args) {
    		B2 b = new B2();
    		System.out.println(b.getA());
    	}
    }
    
    

            此例中与上个例子的不同之处在于,B2类中定义了同名的getA()方法覆盖了A2类中的同名方法,所以这里b.getA()调用的是B2类中的方法,又因为B2中的getA()方法引用的是B2类自身的变量a(B2.a),所以打印结果为: 2


            Test3.java

    package extend;
    class A3 {
    	int a = 1;
    	public int getA() {
    		return this.a;
    	}
    }
    
    class B3 extends A3 {
    	public B3() {
    		a = 2;
    	}
    }
    
    public class Test3 {
    	public static void main(String[] args) {
    		B3 b = new B3();
    		System.out.println(b.getA());
    	}
    
    }
    

            此例中,子类(B3)既继承了父类(A3)的变量a,同时也继承了父类的getA()方法,所以B3()中的构造函数对a的赋值实际上是对继承自父类的变量a的赋值。由于没有覆盖,b.getA()调用的也是继承自父类A3的方法。输出结果很显然应该是 : 2

             Test4.java

    package extend;
    class A4 {
    	int a = 1;
    	public int getA() {
    		return a;
    	}
    }
    
    class B4 extends A4 {
    	int a = 2;
    	public B4() {
    		a = 3;
    	}
    }
    
    public class Test4 {
    	public static void main(String[] args) {
    		B4 b = new B4();
    		System.out.println(b.getA());
    	}
    
    }
    

            此例中,子类B4中重新定义了同名的变量a,根据规则(2),A4中的变量a被隐藏,所以B4的构造函数中初始化的是B4类中的a,而由于没有重写方法覆盖getA(),所以b.getA()调用的仍然是A4类(父类)中的getA()方法,父类的getA()中返回的a自然是父类本身的变量a,而父类本身的变量a从初始化后一直没变,就是1,所以打印结果是: 1

             顺便提一下:

            1. 如果调用父类方法,则父类方法中引用的变量一定是父类中的变量(如Test1.java)

            2.如果调用子类方法,那么:如果子类中没有重新定义父类中的某个变量(没有隐藏),而在子类方法中引用了,则引用的是父类的变量;如果在子类中重新定义了变量(实现了隐藏),则引用的是子类本身的变量



    展开全文
  • PYTHON继承的一些理解

    2019-11-02 17:36:33
    PYTHON关于继承的一些感悟! 之前用QT写页面,看教程时,发现在继承父类时总是会在子类中加入一条 当时一脸懵,误以为parent参数意为把QWidget中所有的参数都传入子类Windows中,过了段时间,结果发现理解完全错误...

    PYTHON关于类继承的一些感悟!

    之前用QT写页面,看教程时,发现在继承父类时总是会在子类中加入一条在这里插入图片描述
    当时一脸懵,误以为parent参数意为把QWidget中所有的参数都传入子类Windows中,过了段时间,结果发现理解完全错误,其实此处的parent没有任何含义,当打开PYQT库时你会发现在这里插入图片描述
    其实当继承Qwidget时,只是继承该类的方法,该类并没有属性可以继承,于是我将parent删除在这里插入图片描述
    发现在这里插入图片描述
    同样运行成功,于是我再次去学习继承的定义,发现其实
    在这里插入图片描述
    此句只是连接父类和子类的桥梁,当父父类init()中存在参数时,使用子类时使用__init__()和super()时一定要和父类的参数一一对应
    在这里插入图片描述
    并且在创建对象时,要给相应的参数赋值。
    说白了,其实super()函数就相当于两个类别的桥梁,super()__init()中的参数就相当于两个函数直接共同的属性值,当其中不存在参数时,子类就只能访问父类中的方法而不能动用属性值。

    展开全文
  • 两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误理解。今天看《Understanding ...

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客:

    理解JavaScript中原型继承

    JavaScript中的原型继承

    这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误理解。今天看《Understanding Scopes》这让我从新思考了一下原型继承,更重要的是站在一个继承设计者的角度再看一下原型继承。

    在传统的面向类的继承体系中,我们有个Best Practices是优先使用(对象)组合代替(类)继承,而原型继承是这个思想的一个运用。和面向对象和函数式编程一样,使用几乎任何语言都可以实现这样的思想,我以前学的只是这个思想的一个JavaScript实现,而已。

    基于原型的继承其实是一种组合式的继承,朴素的说法就是子域中属性找不到的话就去父域中找找,这里的父域是用原型(__proto__)去引用的,依次递归整个原型链。最终的实现其实就是对象的组合。子对象包含父对象的引用。既然是继承必然涉及到重名问题,子对象和父对象各自相当于一个作用域,重名问题的处理也是就近(可覆盖shadow/隐藏hide)原则,即子作用域的同名属性会起作用,隐藏了父作用域的同名属性,但是由于是组合,这两个属性是独立的。我们用伪代码看看:

    aParent = {name:’jerry’}

    aChild = {__proto__:aParent, name:’frank’}

    aChild中的name和aParent中的name是各自独立的。我们aChild.name=’unknown’并不会改变aParent.name。

     

    有一点要拿出单独说说,造成迷糊的最大根源就是误解,对于如下代码:

    aParent = {name:’jerry’}

    aChild = {__proto__:aParent}

    若我们取aChild.name的值,我们很容易resolve,那就是子域中找不到,去父域中找,找到了jerry。但是对于:aChild.name = ‘frank’这样的赋值代码我们会产生歧义(ambiguous),我们可能有两中含义:

    1,更新父域中的name属性为frank。

    2,设置子域中的name属性为frank。

    JavaScript选用的方式是第2种。即设置(新建)子域自己的name属性为frank,并隐藏了父域中的name属性。我们通常误以为JavaScript是按1的方式工作,其实不是。

     

    另外类(模版)其实在编程语言的实现中是可有可无的,像JavaScript压根就没有类(模版),他只有对象,new Point()只不过是一个语法糖,跟aObj = createObject()是一样的,只是调用一个方法去生成一个对象,而已。

    转载于:https://www.cnblogs.com/Jerry-Chou/p/understanding-prototype-inheritance-2.html

    展开全文
  • 关于JFrame一些理解

    2021-01-27 12:38:52
    声明:这个文章仅记录我当前时段的理解,不一定正确,欢迎各位大佬指出错误。并且会不定期修改。 首先,JFrame是一个框架,我的理解是JFrame是一个顶级容器,它与JApplet、JDialog两个容器同级,并且分别继承自AWT...
  • Node.js关于Stream的理解

    2020-12-08 19:35:53
    理解这两种模式对该种流的理解将更透彻。 流动模式,该模式下的流将会由底层系统自行调用,并尽可能快的提供给你的程序。简而言之,就是程序自动读取数据。 暂停模式,该模式下...
  • 关于异常浅显理解

    2020-12-14 20:40:28
    异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。 3. 返回异常发生时的详细信息 public string getMessage(); 4. 返回异常发生时的简要描述 public string toString(); 5. 返回异常对象的本地化信息...
  • 聊聊关于Java异常一些理解 1. 异常 含义:异常是在程序中导致程序中断运行一种指令流。 首先要清楚异常(exception)和错误(error) Error类和Exception类都是继承Throwable类, 1)Error(错误)是系统中...
  • 本文是个人学习java过程笔记,如有错误欢迎指出 面向对象编程主要体现以下三个特性: 封装性、继承和多态。 封装性 **在我看来,封装性通过私有化使类某些参数、属性、方法封在内部,而想要用时候需要用...
  • 网上找了很久关于C++的接口继承和实现继承的文章,但大多数都是《Effictive C++》的条款34原话,我想把它理解成自己的话然后写出来。 如有错误之处,请指正,谢谢啦,嘻嘻! 函数就是所说的接口,函数体就是所说的...
  • 直接上原文吧,最后加几句细点的理解条款38: 决不要重新定义继承而来的缺省参数值让我们从一开始就把问题简化。缺省参数只能作为函数的一部分而存在;另外,只有两种函数可以继承:虚函数和非虚函数。因此,重定义...
  • 用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认识到接口的作用的时候觉得用接口是多此一举,当然你这样想那是错误的,...
  • 转自:点击打开链接 并更正一个小错误以及增加了自己一些理解 关于C++对象内存布局资料和书籍也有很多,比如陈皓老师博客: 1、C++对象内存布局(上) 2、C++对象内存布局(下) 白杨: RTTI、虚...
  • 在编译时候,偶尔会碰到关于左值或者右值的错误。查了一下关于这方面介绍,记录一下。 C++中左值(lvalue)和右值(rvalue)概念是从C继承。 在C中,左值通常表示赋值符号左边值,右值通常表示赋值符号...
  • 在使用 equals 对比的时候,是错误的! 因为没有重写的类都是继承祖宗 Object 的 hashCode 和 equals 方法 , 这是Object 源码的 hashCode 和 equals 方法 public native int hashCode(); public boo...
  • 一直在博客园潜水,每天都这里看网友们写随笔,受益匪浅!这次我第一次在网上发表文章,请大家多多关照啊!在课程上能学到东西太少,为了以后能找个好工作,一直在加深对基础... 关于继承时候方法覆盖。java与c#...
  • 1、C#接口的作用 : C#接口是一个让很多初学C#者容易迷糊的...当然你这样想那是绝对绝对错误的,比尔盖茨的微软请的员工都是比盖茨还聪明的人,他们的C#能添这样的多足吗?!关于接口的作用,网上有一位就真的深入...
  • 当然你这样想那是绝对绝对错误的,比尔盖茨的微软请的员工都是比盖茨还聪明的人,他们的C#能添这样的多足吗?!关于接口的作用,网上有一位就真的深入浅出给我们做了很好理解的分析。 我们定义一个接口public ...
  • 关于大小问题

    2008-01-26 19:30:00
    一直以来在各个论坛上都不时见过一些关于类大小讨论,尤其是当涉及到虚继承时,类大小就变得更加扑朔迷离,每看完一个帖子都觉得自己有所收获,但当下次遇到类似帖子时却怎么也想不起自己以前对此问题记忆...
  • 甚至继承的方法在$onInit</code> 钩子中就可以直接使用。 首先我们需要思考的是如何使用<code>require</code>,我写过另外一篇深入介绍$onInit 和 require的文章,但是在此我依然会简要介绍一些<code>...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 261
精华内容 104
关键字:

关于继承的理解错误的