精华内容
下载资源
问答
  • 在类方法中只能调用本类中的类方法 D. 在类方法中绝对不能调用实例方法 java中的一些bug题目,有的出题的也没有试过总结了一下 在类方法中可 用this来调用本类的类方法在之前一直以为这个是错误。只是要求的jdk...

    java 知识
    下列说法错误的有( )
    A. 在类方法中可用this来调用本类的类方法
    B.在类方法中调用本类的类方法时可直接调用
    C. 在类方法中只能调用本类中的类方法
    D. 在类方法中绝对不能调用实例方法

    java中的一些bug题目,有的出题的也没有试过总结了一下
    在类方法中可 用this来调用本类的类方法在之前一直以为这个是错误。只是要求的jdk版本是1.5以上,但是也编译器也会提示一个警告。
    c是明显的错误,类方法可以调用外部其他类的方法。
    至于D选项中,也是有问题的,只要实力化对象,也是可以调用实例方法的。

    展开全文
  • Java继承中的转型及其内存分配看书时候被一段代码能凌乱啦,代码是这样:package 继承; abstract class People { public String tag = "疯狂Java讲义"; //① public String name = "Parent&...





    Java继承中的转型及其内存分配

    看书的时



    候被一段代码能凌乱啦,代码是这样的:

    复制代码
    package 继承;
    
    abstract class People
        {
            public String tag = "疯狂Java讲义";         //
            public String name = "Parent";
            String getName(){
                return name;
            }
            
        }
        class Student extends People
        {
            //定义一个私有的tag实例变量来隐藏父类的tag实例变量
            String tag = "轻量级Java EE企业应用实战";         //
            public String name = "Student";
        }
        public class HideTest2
        {
            public static void main(String[] args)
            {
                Student d = new Student();
                //将d变量显式地向上转型为Parent后,即可访问tag实例变量
                //程序将输出:“疯狂Java讲义”
                System.out.println(((People)d).tag);         //
                System.out.println(d.getName());  //parent
            }
        }
    复制代码

    运行结果:

    疯狂Java讲义
    Parent

    在这个代码中,抽象父类People定义了两个变量和一个getName()方法,子类student也定义了两个和父类同名的变量,把父类的隐藏。

    关于这段代码的两个困惑:1.子类实例化时必须首先实例化父类对象,而父类是抽象类,不能有对象。那到底子类实例化时产不产生父类对象???

                                      2.d.getName();//返回的是parent,而不是student.不应该把父类的隐藏么??

    书中是这么解释的:

      Student对象会保存两份实例变量,一份是people中定义的实例变量,一份是Student中定义的实例变量,d变量引用一个Student对象,内存示意图如下:

      

    将d向上转型为Parent对象,在通过它访问name变量是允许的,也就是输出“parent”。

    但看着他的解释还是有点不明白,说的不是很清楚,又去网上搜了下:

     

    java 子类实例化时是否同时存在一个父类对象.

      2011-10-14 19:53
    提问者: luoyuehao89 浏览次数:602次
    java 子类实例化时是否同时存在一个父类对象.
    假如父类A中有个int a = 1;
    子类B继承A,同时B中覆盖个int a = 2;
    
    运行:
    A test = new B();
    system.out.println(test.a);
    
    结果是1,是父类中的属性.这个时候是否存在父类对象,我的理解是存在的.
    我又试,把父类用抽象abstract修饰,按理说abstract累不能实例化吧,肯定不能得到父类中的a属性,结果还是一样的.
    怎么理解.

    问题补充:

    是不是创建子类对象,肯定会出现一个父类的对象?
    精彩回答
    不会产生父类对象,只是用了父类的构造函数而已,并不是用到构造函数就会产生对象,构造函数只是起对象初始化作用的,而不是起产生对象作用的,如果new A();即只有new语句才会产生父类A的对象。
    变量是静态绑定 ,方法是动态绑定。 这里面变量在编译期间实现了变量调用语句与变量定义赋值语句的绑定,绑定的自然是父类的,因为调用时类型是父类的,所以值是父类中定义的值 
    其实你可以这么理解  创建了一个子类对象时,在子类对象内存中,有两份这个变量,一份继承自父类,一份子类。 
    绝对不会产生父类对象,父类中的成员被继承到子类对象中,用指向子类对象的父类引用调用父类成员,只不过是从 子类对象内存空间中找到那个被继承来的父类成员,也就是说实质是用子类对象调用变量a,这样就可以解释成员必须通过对象调用的规定,只不过这时调用的是子类对象中的继承自父类的a(子类对象中有两个a,一个继承自父类,一个属于自己)
    
    哎,话说的有些乱。  这个问题也困惑我很久,上网查询发现很多人是错误的,最后找到几篇好的文章才明白,可能很多java老手也都会犯“产生父类对象”这个错误,最近才搞明白。
    你自己想想,如果产生父类对象,如果父类是抽象类,抽象类允许产生对象吗?所以这种说法不严谨

    动态绑定定义

      动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法

    静态绑定与动态绑定

      除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问. 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定. 
    计算机语言中有两种主要的绑定方式,静态绑定和动态绑定. 静态绑定发生于数据结构和数据结构间,程序执行之前. 静态绑定发生于编译期, 因此不能利用任何运行期的信息.
    它针对函数调用与函数的主体,或变量与内存中的区块.. 动态绑定则针对运行期产生的访问请求,只用到运行期的可用信息. 在面向对象的代码中,动态绑定意味着决定哪个方法被调用或哪个属性被访问,
    将基于这个类本身而不基于访问范围.

    谁有更好的解释,说得更清楚点,欢迎留言。。Thanks
    这个解释的不错:http://bbs.csdn.net/topics/390896785
    解释
    如下:
    子类在创建实例后,类初始化方法会调用父类的初始化方法(除了java.lang.Object类,因为java.lang.Object类没有父类),而这种调用会逐级追述,直到java.lang.Object的初始化方法。
    这个地方我说的是初始化方法,而不是构造方法,因为构造方法是相对于java源程序而言,而编译后的class文件是初始化方法即" <init>"方法(红色部分为方法名),
    初始化方法是由java源程序的三个部分组成的,一个部分是成员字段后的直接的初始化语句,例如private int i=0;private Date date=new Date();等等,第二个部分是由初始化块组成,例如:

    Java code
       public class Test{
     private int i=0;//初始化第一部分 
    //以下大括号内为初始化第二部分
     { this.i=4; //do something...... } }
    第三个部分就是java源代码中的构造方法中的代码,java源代码中有几个构造方法,那么class文件中就有几个初始化方法,编译器会把第一部分与第二部分分别复制到每个初始化方法的前端,然后把初始化
    方法对应参数的构造方法的代码复制到相应初始化方法中(这里说的复制其实应该说是编译,不过为了让你更好理解所以如此说).
    那么说初始化方法如何追述其父类的,这也关系到初始化方法的结构,初始化方法的执行顺序以及结构就如上所说,但是每个初始化方法的第一个执行指令就是调用另外一个初始化方法,
    这个初始化方法可能是自身类某个初始化方法,例如你的构造函数中第一句有类似this(...)这种语句,那么初始化方法就会调用自身类的指定构造方法;如果你的构造方法中没有指定构造方法调用,
    那么初始化方法会默认调用父类无参数初始化方法,如果你的子类第一句为 super(....),那么初始化方法会调用父类指定初始化方法。这种调用过程会递归进行调用,直到这个类是java.lang.Object类。
    调用初始化方法并不代表会生成对象,你的java代码中出现new关键字加上构造方法的调用,只会生成一个对象,其父类对象不会生成,所以调用父类为抽象类的构造方法完全是合理的。
    而且初始化方法对于虚拟机来说只是一个名称叫做" <init>"的普通方法,区别只是生成对象以后调用而已(sun 的jdk私有包中有绕过构造方法生成对象的方式,可以证明之上说法,具体如何我这里不陈述)。
    然后回答你的第二个问题,抽象类中的构造方法其实是用来给继承的子类来用的,因为构造方法相当于初始化方法,当子类调用构造方法时必须调用父类构造方法,
    所以你可以在子类产生对象时抽象类中按需求初始化抽象类中的字段以及执行一些初始化代码。其实并不是一定要生成某个类的实例才调用构造方法,子类也需要调用父类构造方法。
    而生成实例也并不一定会调用构造方法,在某些特殊实现中或者特殊情况下,生成实例不会调用构造方法。而调用了构造方法也不一定就生成了一个实例,但是那一定是一个实例调用的,就像一个普通的实例方法一样。

     



    如果您觉得阅读本文对您有帮助,请点一下�?推荐”按钮,您的“推荐�?将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利�?
    posted @ 2016-04-10 11:41 超超boy 阅读(2923) 评论(0编辑 收藏

    展开全文
  • 既然要用到静态函数做回调函数,我们知道静态方法只能调用的静态成员。那如果我们要回调函数emit QT的信号呢? 我们可以定义一个静态的本类的对象myipdata。比如Ipdata类msg_callback()函数为静态回调...

    QT:类中静态方法(回调函数)调用类中的信号

    • 对于回调函数一般类型都应当是void(* 类型)来定义。这时候如果要给类型附实参函数的话,函数必须要有地址。但普通的成员函数需要实例化对象后才能够有地址(具体我也不知道,实例化对象后有一个this指针啥的。)
    • 既然要用到静态函数做回调函数,我们知道静态方法只能调用类中的静态成员。那如果我们要在回调函数中emit QT中的信号呢?
    • 我们可以定义一个静态的本类的对象myipdata。比如Ipdata类中msg_callback()函数为静态回调函数,signalList()为一个信号。
    static IPdata * myipdata;
    void IPdata::msg_callback(void *msg_data, char *msg_topic, char *msg_type)
    signals:
         void  signalList();
    
    
    • 静态变量必须要初始化。
    IPdata * IPdata::myipdata  = nullptr;
    

    然后再初始化类时要定义myipdata,connect可以忽略。

    IPdata::IPdata(QObject *parent) : QObject(parent)
    {
        myipdata = this;
        connect(this,SIGNAL(signalList()),this,SLOT(emitqmlsignal()));
    
    }
    
    • 然后我们在回调函数直接调用这个静态对象的信号就是类的信号了
            emit myipdata->signalList();
    
    展开全文
  • 通过new关键字调用构造器时,虽然返回了该类的对象,但是这个对象并不是完全由构造器创建。实际上,当我们调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了——构造...

    通过new关键字调用构造器时,确实返回了该类的对象,但是这个对象并不是完全由构造器创建。实际上,当我们调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了——在构造器执行之前就完成了!也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这个对象还不能被外部程序访问,只能在构造器之中通过this引用。当构造器执行体执行完成之后,这个对象作为引用的返回值被返回,从而让外部程序可以访问改对象。

    展开全文
  • 类方法和类实例区别

    千次阅读 2012-07-26 22:07:14
    在类方法中只能调用本类的类方法 D.在类方法中绝对不能调用实例方法   曾经我做过两次,都没做正确,一:第一次做的时候 没有回来查找答案,二:当时确实不理解什么是类方法。   ******************欢乐的...
  • 因为shotter关键SaveTaskdoInBackground()能后台进行,故截屏是能完成。但由于onPostExecute()只能于UI线程跑,导致onPostExecute()失效,所作资源释放、callback工作都直接忽略了...
  • 关于类方法的笔试题目

    千次阅读 2017-07-05 21:10:30
    下列说法错误的有( ) ...在类方法中只能调用本类的类方法 在类方法中绝对不能调用实例方法 成员方法又称为实例方法 静态方法又称为类方法 其次: a,静态方法中没有this
  • **想使用image.FromStream方法显示存储数据库中的图片。 但是发现FromStream不能被顺利调用 ,说image.exe文件缺失?用版本是2010C# 使用了命名空间using System.Drawing.Imaging; 不知道有什么方法可以...
  • this关键字还可以访问本类其他构造方法 this(); //访问本类无参构造方法 this([实参列表]);...当使用this访问本类构造方法时,则只能编写构造方法中,而且是第一个语句 构造方法不能出现递归调用 ...
  • 重载是相对于本类的方法名相同,参数列表不同;而重写对象是具有继承关系的两个子父类之间共有的public方法的重新编码。 方法的重写用在类与类的继承之间的,区别于方法的重载,方法重载是方法名相同,参数或
  • this();//访问本类无参构造方法 this([实参列表]); 当使用this访问本类构造方法时,则只能编写构造方法中,并且是第一条语句 构造方法不能出现递归调用 案例: ...
  • 笔试踩坑记,论我怎么把一道送分题给送回去了。。。 下列说法错误的有() A. 在类方法中可用this来调用本类的类方法 ... 在类方法中只能调用本类中的类方法 D. 在类方法中绝对不能调用实例方法 解答:ACD
  • ** 注释1 **:首先static无规定private还是...而protected可以在本类和子类下跨包, default可以实现同一个包内可以访问。 还有此处静态idCounter的调用方法注意一下 public class Student { private int id;...
  • this可以调用本类中对象属性和方法,而super可以调用父类中对象属性和方法,可以简化代码,对象用this或者super替代。关于类和对象关系,有一点不得不提,一个类中只能使用一个对象,如果创建并使用多个类会...
  • 3、只能用对象调用(那静态方法中的非静态类呢,猜测,也一起被加载到内存) 类是封装好,像一个模型对象是由类实例化,像一个具体样本类中只有静态方法可以使用 类方法(静态方法)是直接可以...
  • java文件选中类名称--右键--perferece--project ...显示结果是类的哪个方法调用过需要查找的类。(不要给我说ctrl + alt + h ,这个只能查看方法调用情况,不能看完整类调用情况,期间的便于不便自行体会)
  • Thread类的run方法和start方法 start方法是Thread类方法,用于启动新的线程。...使用start方法才能算是真正开启了新的线程,而只使用run方法不能算是开辟一个新的线程,只能算是某一个单线程的顺序执行,
  • 被private修饰成员,只能在本类中进行访问。 this关键字 this修饰变量用于指代成员变量,作用区分局部变量和成员变量重命名问题。 构造方法 如果没有定义构造方法,系统会给出默认无参构造方法。 定义了就...
  • 构造方法内就是代本类对象,this代表它所在方法所属对象引用。 2.构造函数之间进行调用时,this语句只能出现第一行,构造方法要先执行,如果构造方 法还有初始化,那就执行更细节初始化。*/class Student...
  • OC-类方法和对象方法

    千次阅读 2015-08-27 17:05:36
    禁忌1、在类方法中使用了成员变量 如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法, 在类方法中可以调用其他类方法 1) 可以直接使用本类类名(或者其他类名...
  • Java7,接口只能有公有抽象方法, 不能有方法实现。 Java8新增了接口的默认方法和静态方法: ...以前,接口里的方法要求全部是抽象方法,...默认方法可以通过实现接口的类实例化的对象来调用,而类方法只能在本
  • 不能修饰私有方法:因为私有方法只能在本类中被访问,子类虽然会继承到此方法,但是访问不到,就是不能被重写(其实就是隐式final修饰的方法) 不能修饰static修饰的方法:因为静态方法表示可以直接用类名调用方法,...
  • **内部:**/接口里定义 方法内部 成员内部 静态内部 匿名内部 方法内部方法内部进行定义 可以定义所有非静态信息以及静态常量—方法...只能获取本方法中的常量,方法中的如果有内部
  • 外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。...静态方法在访问本类的成员时,只允许访问静态变量和静态方法,而不允许访问实例变量和实例方法;实例方法则无此限制。
  • 如果你的DLL里全是C++的类的话,你无法DEF(后边讲)里指定导出的函数,只能用__declspec(dllexport)导出类被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。C和C++对函数的处理方式是不同的.extern "C"是...
  • java编程直接用方法名来调用方法本类中static修饰的方法,即静态方法可直接用方内法名来容调用方法意思。 java中的方法分为: (1)静态方法 。间接使用类名,方法名和调用等。 (2)普通方法。 用new功能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,257
精华内容 502
关键字:

在类方法中只能调用本类的类方法