精华内容
下载资源
问答
  • iOS - 分类中同名方法的调用顺序

    千次阅读 2018-04-13 17:07:39
    一个主类的两个分类同名方法调用顺序? 分类+load方法的调用顺序? 分类+initialize 方法的调用顺序? 二. 测试环境搭建 创建下面这些测试用的 加入一个pch文件方便打印 #ifdef DEBUG #de...

    主类和分类

    时间有限,可以直接看结论,或者联系我企鹅qq:549931192

    一. 需要解决的问题

    1. 主类和分类中普通方法的调用顺序?
    2. 同一个主类的两个分类中的同名方法调用顺序?
    3. 分类中+load方法的调用顺序?
    4. 分类中+initialize 方法的调用顺序?

    二. 测试环境搭建

    1. 创建下面这些测试用的类
      这里写图片描述
    2. 加入一个pch文件方便打印
    #ifdef DEBUG
    #define LGLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ## __VA_ARGS__);
    #else
    #define LGLog(...)
    #endif
    

    主要内容

    1. 主类,子类和分类中的+load方法的加载

    • 我们在主类和各分类中重写+load方法
    //Person
    + (void)load{
        LGLog();
    }
    //-------------
    //Son
    + (void)load{
        LGLog();
    }
    //-------------
    Person+A
    + (void)load{
        LGLog();
    }
    //-------------
    Person+B
    + (void)load{
        LGLog();
    }
    //-------------
    Person+C
    + (void)load{
        LGLog();
    }
    • 打印输出
      这里写图片描述
    • 调整分类的编译顺序在打印
      这里写图片描述

    2. 结论

    • +load方法的调用是在main() 函数之前,并且不需要主动调用,就是说程序启动会把所有的文件加载
    • 主类和分类的都会加载调用+load方法
    • 主类与分类的加载顺序是:主类优先于分类加载,无关编译顺序
    • 分类间的加载顺序取决于编译的顺序:编译在前则先加载,编译在后则后加载
    • 规则是父类优先于子类, 子类优先于分类(父类>子类>分类)

    1. 探究主类和分类的普通同名方法调用顺序

    • 我们在主类中加入普通的类方法(+commonClsMethod)和实例方法(-commonInstanceMethod)
    • 在分类中也重写这两个方法
    + (void)commonClsMethod{
        LGLog();
    }
    - (void)commonInstanceMethod{
       LGLog();
    }
    1. 正常结果
      这里写图片描述
    2. 分类文件警告
      这里写图片描述

    结论

    • 普通的方法中, 分类同名方法会覆盖主类的方法
    • 多个分类中的同名方法会只执行一个,即后编译的分类里面的方法会覆盖所有前面的同名方法(可以通过调换编译顺序来获得这个结论)
    • 分类中的方法名和主类方法名一样会报警告,大概就是说分类中实现的方法主类已经实现了
    • 可以把声明写在主类, 实现写在分类,这样也能调用到分类里面的代码
    • 同样可以把声明和实现写在不同的分类文件中,还是能找到的, 不过主类要相同

    探究+ initialize方法的调用

    • 调用子类的+ (void)initialize方法
        [[Son new] commonInstanceMethod];

    这里写图片描述

    结论

    • 当第一次用到类的时候, 如果重写了+ initialize方法,会去调用
    • 当调用子类的+ initialize方法时候, 先调用父类的,如果父类有分类, 那么分类的+ initialize会覆盖掉父类的, 和普通方法差不多
    • 父类的+ initialize不一定会调用, 因为分类可能重写了它
    • 普通方法的优先级:分类>子类>父类

    总结

    1. 普通方法的优先级: 分类> 子类 > 父类, 优先级高的同名方法覆盖优先级低的
    2. +load方法的优先级: 父类> 子类> 分类
    3. +load方法是在main() 函数之前调用,所有的类文件都会加载,包括分类
    4. +load方法不会被覆盖
    5. 同一主类的不同分类中的普通同名方法调用, 取决于编译的顺序, 后编译的文件中的同名方法会覆盖前面所有的,包括主类. +load方法的顺序也取决于编译顺序, 但是不会覆盖
    6. 分类中的方法名和主类方法名一样会报警告, 不会报错
    7. 声明和实现可以写在不同的分类中, 依然能找到实现
    8. 当第一次用到类的时候, 如果重写了+ initialize方法,会去调用
    9. 当调用子类的+ initialize方法时候, 先调用父类的,如果父类有分类, 那么分类的+ initialize会覆盖掉父类的, 和普通方法差不多
    10. 父类的+ initialize不一定会调用, 因为有可能父类的分类重写了它

    demo

    展开全文
  • 可以存在同名方法,但是参数类型和参数不能相同,这样的关系体现了Java的多态(重载),举例如下: package com.fatkun; /** * Overloading(重载,过载) * 方法名相同,参数类型不同或者参数类型顺序不同 * ...
    概括性声明:你后面括号里具体写哪几个参数,就调用哪个方法。
    可以存在同名的方法,但是参数类型和参数不能相同,这样的关系体现了Java中的多态(重载),举例如下:
    package com.fatkun;
    /**
     * Overloading(重载,过载)
     * 方法名相同,参数类型不同或者参数类型顺序不同
     * 返回值,访问修饰符,异常可以不一样
     * @author fatkun
     *
     */
    public class Overloading {
     
    	public int test(){
    		System.out.println("test1");
    		return 1;
    	}
     
    	public void test(int a){
    		System.out.println("test2");
    	}	
     
    	//以下两个参数类型顺序不同
    	public String test(int a,String s){
    		System.out.println("test3");
    		return "returntest3";
    	}	
     
    	public String test(String s,int a){
    		System.out.println("test4");
    		return "returntest4";
    	}	
     
    	public static void main(String[] args){
    		Overloading o = new Overloading();
    		System.out.println(o.test());
    		o.test(1);
    		System.out.println(o.test(1,"test3"));
    		System.out.println(o.test("test4",1));
    	}
    展开全文
  • php继承父类,子类和父类中都有同名方法,实例化子,在父类使用$this->function() 调用子类和父类中都的方法的时候,这时候真正调用的是子类的方法,我们容易看到$this 然后以为是调用父类的方法,这点...

    php继承父类,子类和父类中都有同名方法,实例化子类,在父类中使用$this->function() 调用子类和父类中都有的方法的时候,这个时候真正调用的是子类中的方法,我们容易看到$this 然后以为是调用父类中的方法,这点是我们看代码的时候容易出错的地方,特别是代码多的时候,特别容易出错。需要我们看代码的时候仔细一点。

    实例如下:

    <?php
    	class a {
    		public function test() {
    			echo 'aaa<br />';
    			$this->tests();
    		}
    		
    		public function tests() {
    			echo 'bbb';
    		}
    	}
    	
    	class b extends a {
    		public function tests() {
    			echo 'ccc';
    		}
    	}
    	
    	$b = new b();
    	$b->test();
    程序最后输出的结果是:

    aaa
    ccc



    展开全文
  • python继承多个父类时候,父类有同名方法的,默认继承第一个父类的同名方法,如果想想继承那几个或者所有的同名方法都想继承,那就这样: class A(object): def setup_ui(self): self.name = "xiaoming" class B...

    python继承多个父类时候,父类有同名方法的,默认继承第一个父类的同名方法,如果想想继承那几个或者所有的同名方法都想继承,那就这样:

    class A(object):
        def setup_ui(self):
            self.name = "xiaoming"
    
    
    class B(object):
        def setup_ui(self):
            self.age = 16
    
    
    class C(A, B):
        def __init__(self):
            super().setup_ui()  # 这是继承第一个父类的同名方法
            B.setup_ui(self)  # 下面依次用父类名.同名方法(self)  来继承,有多个的话下面也是这样写
        def setup_ui(self):
            print(self.name, self.age)
    
    
    obj = C()
    obj.setup_ui()
    
    展开全文
  • php同名方法

    千次阅读 2016-07-09 09:41:17
    在java中同一个类里面的方法(函数)可以有同名方法,只要方法的参数个数、参数类型、不同类型的参数顺序不一样都可以视为不同的方法。 然而,在php中同一个类里面不允许这种情况,即方法名在该类中必须唯一,...
  • java的构造方法可以很多,可以带...MethodName 的构造方法就和一个普通类方法同名而且参数列表相同。但是编译器不会建议我们这么做。它会给我们一个警告。package hello;class MethodName{ private int i; publi
  • 在写爬虫时,同一个类中需要import org.jsoup.nodes.Document与org.bson.Document这两个,但是报错了,同一个类中不能有两个同名。 解决办法 仅仅导入一个,或者不导入这两个包,需要调用时使用全部路径,即...
  • (1)方法为静态方法,接口不能有静态方法,所以只能接口为非静态方法,而父类为静态方法,此时该会编译报错,提示为静态方法与接口的抽象方法冲突。 (2)父类和接口的方法均为非静态方法时,该可以定义同名的...
  • 子类覆盖了父类同名方法,父类引用调用子类覆盖了父类中同名方法,为什么会调用父类同名方法 public abstract class Beverage{ String description = "Unknow Beverage"; public String getDescription...
  • “constructor必须与class同名,但方法不能与class同名”这句话是错误的,方法是可以和class同名的;方法可以和类名同名的,和构造方法唯一的区别就是,构造方法没有返回值。 转载于:...
  • 最近做了几次测试,在PyQt如果使用与槽函数同名的实例方法可能会导致可控的错误。 案例1:如果两个信号映射...案例2:在一个槽函数定义了一个与槽函数同名但参数多了几个的实例方法,结果在跟踪程序时发现信号...
  • java 父类子类有同名方法时如何调用

    万次阅读 多人点赞 2017-10-22 12:15:44
    如果父类的引用p指向了子类的实例,则通过这引用p访问同名方法时,调用的是子类重写的方法。 父类引用p可以指向不同的子类,调用不同子类重写的不同的同名方法,进而达到间多态的效果。 但是,父类的引用只能...
  • 假设如下两个接口: public interface IA ...他们都要求实现方法GetA,而且传入的参数都是一样的String类型,只是返回值一个是String一个是Int,现在我们要声明一个类X,这个要同时实现这两个接口
  • C++派生类中与基类同名函数的调用问题

    万次阅读 多人点赞 2016-11-11 22:26:14
    、派生,即子类的函数与基类的函数的情况以下三种。 1、不是同名函数 2、函数名相同,形参的个数或类型不同。 3、函数名相同,形参的个数和类型也相同。 二、接下来就这三种情况探讨子类调用基类函数的...
  • 浅谈在JAR中同名类冲突问题

    千次阅读 2018-08-04 11:38:22
    由于对出问题的那段代码熟悉,所有前后折腾了2个小时才定位出来,原来是服务依赖的两个JAR包中都同时出现了一个同名类(该的完全限定名一样),并且这两个中都包含了同一个方法。在公司环境执行的是正确的...
  • 子类可以访问父类的成员,继承关键字extends,可以代码的重用性,子类写了一个与父类同名方法,这个方法会覆盖父类方法. 1)重用性 2)扩展性 3)灵活性 继承 // Person.class.php class Person{ ...
  • 观察下列代码, 父类和子类中都定义 String name变量,那最终继承之后是不是只剩下1name?还是父类子类的name互相相干? 通过赋值后,最后会输出什么?见如下 public class TestTest extends son { String ...
  • Java如何访问同名方法或变量 ?

    千次阅读 2014-12-24 16:23:47
    静态方法方法属于,通过对象访问实例方法不能通过类名访问实例方法。 隐藏:B隐藏了A的变量或者方法,那么,B不能访问A被隐藏的变量或方法,但是,将B转换成A后,可以访问A被隐藏的变量或方法。 覆盖:B覆盖...
  • 看下面代码 public class T{ String str; T(String str){ this.str = str; class Temp{ ... //报错 不能引用另一方法中定义的内部中非终态变量 } } } public static void main(String[]
  • 一般函数同名:当某个函数func()在基类和派生中都定义时,派生类中的函数func()将修改从基类继承来的函数func(),如果非要从派生类中访问基类的函数func(),两种方法、定义基类指针,让基类指针...
  • Python中调用父类的同名方法

    千次阅读 2013-08-12 14:08:21
    面向对象设计时,无可避免的会涉及到父类和子类的...今天学习下python如何调用父类同名方法 PS: 如果调用的话,子类同名方法对父类方法是直接覆盖的 python 2.2以前 class FooParent: def bar(self, messa
  • file--&gt;settings--&gt;build,execution,deployment--&gt;debugger 把show alternative source switcher 勾上;...再执行debug,在编辑界面下拉选项,选择你要debug的model,完成;  ...
  • 在子类继承父类,子类重新定义父类同名方法,其实就是对父类方法的重写,所以是可以的。例如:public class a { public void x(){ System.out.println(1); } }public class b extends a { public void ...
  • 一个项目建立三个包分别为:  chapter2  pack2
  • Java向上转型时多态的体现,父类与子类有同名变量是内存的分配,向上转型时方法的覆盖
  • new一个son的对象,然后传入Map, 返回this is son new一个son的对象,然后传入HashMap, 返回this is father 如果是覆盖(override)的话,应该总是调用子类的方法,所以是重写(overloa...
  • 当C++多继承时,父类可能含有同名函数,此时子类如何调用呢?   直接贴代码: #include class B1{ public: void output(); }; class B2{ public: void output(); }; void B1::output(){ cout; } void B2::...
  • dubbo同名方法的问题及思考

    千次阅读 2018-09-07 11:52:06
    今天小伙伴问我一个问题 分析 我们系统一直存在该种实践 似乎从来都稳稳的运行,没有任何问题呢…… 比如 * * 查询客户List * @param customerCarVO * @param curPage * @return * @throws Exception...
  • 派生可以继承基类的非私有函数成员,当然也就可以继承其中非私有的被重载的函数。如下: 【参考代码】 class Base { public: void print() { cout () in Base." ; } void print(int a) { cout (int a) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 201,345
精华内容 80,538
关键字:

一个类中不能有同名的方法