精华内容
下载资源
问答
  • 可以实现一个基类,把这个基类的拷贝构造和operator=...还有一种办法:把这个类的拷贝构造和operator=赋值函数私有化,这样做完全可以,但是对于每一个类的进行更改,代码修改量比较大,所以还是建议使用上面的方法 ...

      可以实现一个基类,把这个基类的拷贝构造和operator=赋值函数私有化,那么任何这个基类继承的派生类,都不能拷贝和operator=了

    还有一种办法:把这个类的拷贝构造和operator=赋值函数私有化,这样做完全可以,但是对于每一个类的进行更改,代码修改量比较大,所以还是建议使用上面的方法

    展开全文
  • 一个类智能有一个带有指定签名的构造器,我们可以通过改变参数列表的顺序来提供两个构造器。实际上,这样会给开发人员造成困惑,永远记不住该用哪个构造器。 不必每次调用它们的时候创建一个新对象 可以返回原返回...

    对于类而言,为了让客户端获取它自身的一个实例,最常用的方法是提供一个公有的构造器,还有一个方法就是静态工厂方法。

    静态工厂方法的优势

    有名称

    一个类智能有一个带有指定签名的构造器,我们可以通过改变参数列表的顺序来提供两个构造器。实际上,这样会给开发人员造成困惑,永远记不住该用哪个构造器。

    不必每次调用它们的时候都创建一个新对象

    可以返回原返回类型的任何子类型的对象

    使代码变得更简洁

    //构造方法
    Map<String,Object> m = new HashMap<String,Object>()
    
    //静态方法
    Map<String,Object> m = HashMap.newInstance()

    转载于:https://www.cnblogs.com/bigdogjava/p/9545591.html

    展开全文
  • 构造函数

    千次阅读 2018-07-13 19:56:33
    在Java中,任何变量在被使用前必须先赋初值,因此Java就提供了一个专门为的成员就量赋初值的方法--构造方法,对构造方法的称呼是不同的,有的书籍称它为构造器,还有的书籍称它为构造函数。下面,就具体学习一下...


    Java中,任何变量在被使用前都必须先赋初值,因此Java就提供了一个专门为类的成员就量赋初值的方法--构造方法,对构造方法的称呼是不同的,有的书籍称它为构造器,还有的书籍称它为构造函数。下面,就具体学习一下如何使用构造方法。

    9.9.1  实例分析:选择合法的构造函数(面试题)

    构造方法是一种特殊的成员方法,它的定义方式与普通方法类似,其语法如下所示:

    class 类名称 {

    访问权限 类名称(类型1 参数1,类型2 参数2,…) {  // 构造方法没有返回值

    程序语句

    }

    }

    在使用构造方法的时候请注意以下几点:

    q  它具有与类名相同的名称

    q  它没有返回值,也没有返回类型。

    q  每一个类可以有多个构造方法。

    q  构造方法在创建对象时自动执行,一般不能显式地直接调用。

    也许大家有的可能会这样的疑问在以前的程序中并没有声明任何构造方法,而程序不也一样正常运行了吗?其实在执行javac编译java程序的时候,如果在程序中没有明确声明一个构造方法的话,系统会自动为类加入一个无参的且什么都不做的构造方法这个构造方法就叫做无参构造方法。类似于这个代码:public Person(){}。在创建对象时,使用这个无参的构造方法为类对象的成员变量赋数据类型的默认值,例如,int longdoublechar等。一但用户定义了自己的构造方法,这个无参构造方法就不能再被使用。

    Java里,不仅普通方法可以重载,构造方法也可以重载。只要构造方法的参数个数不同,或是参数类型不同,便可定义多个构造方法。但是值得的注意的是构造方法不能重写,也就是子类不继承父类有特定功能的构造方法。但是子类在继承父类的时候会自动调用父类的无参的构造方法,为父类的成员赋初值。

    【考题题干】请看如下代码:

    class B {

         B(String name) { }

    .  }

    如果class A.继承class B,并且class A只有一个构造函数,那么下面哪个函数是classA的合法构造函数?

    AA() { }

    BA() { super(); }

    CA() { super(fido); }

    D.在没有定义构造函数的时候,系统会提供默认的构造函数。

    【试题分析】在做这道题的时候,要抓住两个要点:继承、一个、数在整个做题的过程中,中心都要围绕着这三个要点,答案会很容易得出来的。

    因为前提以经告诉大家了,A继承B,那么A就会拥有B的所有的公有的变量和方法,也包括系统默认的不带任何参数的构造方法。Java在执行子类的构造方法之前,会先调用父类中无参的构造方法,其目的是为了对继承自父类的成员做初始化的操作。当父类有数个构造方法时,如要调用特定的构造方法,则可在子类的构造方法中,通过super()这个关键字来完成。因为父类的构造方法中传入了一个字符串变量,所以在子类调用父类的构造方法必须也得传入了一个字符串或字符串变量,因此符合以上条件的选项只有C,故C是正确的。

    B是不符合父类的构造方法的条件,没有传入参数。那AD错在哪里呢?如果你不知道错在哪的话,那么就错在你没有仔细的看清题意,“class A只有一个构造函数”。AD本身是正确的,可是放在这就错了,就是因为受到了此题意的限制。

    【参考答案】C

    展开全文
  • 1. 结构体和类对比 共同点,两者可以: 定义属性用于存储值 定义方法用于提供功能 定义下标操作用于通过下标语法访问它们的值 定义构造器用于设置初始值 ...析构器允许一个类实例释放任何其所被分...

    1. 结构体和类对比

    • 共同点,两者都可以:
      • 定义属性用于存储值
      • 定义方法用于提供功能
      • 定义下标操作用于通过下标语法访问它们的值
      • 定义构造器用于设置初始值
      • 通过扩展以增加默认实现之外的功能
      • 遵循协议以提供某种标准功能
    • 与结构体相比,类还有如下的附加功能:
      • 继承允许一个类继承另一个类的特征
      • 类型转换允许在运行时检查和解释一个类实例的类型
      • 析构器允许一个类实例释放任何其所被分配的资源
      • 引用计数允许对一个类的多次引用
    1. 类支持的附加功能是以增加复杂性为代价的。
    2. 一般准则,优先使用结构体,因为它们更容易理解,仅在适当或必要时才使用类
    3. 实际上,这意味着你的大多数自定义数据类型都会是结构体和枚举。

    2. 类型定义的语法

    • 通过 struct 关键字引入结构体
    • 通过 class 关键字引入类

    将它们的具体定义放在一对大括号中:

    struct SomeStructure {
        // 在这里定义结构体
    }
    class SomeClass {
        // 在这里定义类
    }
    

    示例:

    struct Resolution {
        var width = 0
        var height = 0
    }
    class VideoMode {
        var resolution = Resolution()
        var interlaced = false
        var frameRate = 0.0
        var name: String?
    }
    

    定义了一个名为 Resolution 的结构体,用来描述基于像素的分辨率。
    这个结构体包含了名为 width 和 height 的两个存储属性。
    存储属性是与结构体或者类绑定的,并存储在其中的常量或变量。当这两个属性被初始化为整数 0 的时候,它们会被推断为 Int 类型。

    定义了一个名为 VideoMode 的类,用来描述视频显示器的某个特定视频模式。
    这个类包含了四个可变的存储属性:

    resolution:被初始化为一个新的 Resolution 结构体的实例,属性类型被推断为 Resolution。
    初始值为 false 的 interlaced(意为“非隔行视频”)
    初始值为 0.0 的 frameRate
    以及值为可选 String 的 name。
    因为 name 是一个可选类型,它会被自动赋予一个默认值 nil,意为“没有 name 值”。

    3. 结构体和类的实例

    • 创建结构体和类实例的语法非常相似:
    let someResolution = Resolution()
    let someVideoMode = VideoMode()
    

    通过这种方式所创建的类或者结构体实例,其属性均会被初始化为默认值。

    4. 属性访问

    • 使用点语法访问实例的属性。
    print("The width of someResolution is \(someResolution.width)") // 打印 "The width of someResolution is 0"
    
    • 可以访问子属性,如 VideoMode 中 resolution 属性的 width 属性:
    print("The width of someVideoMode is \(someVideoMode.resolution.width)")
    // 打印 "The width of someVideoMode is 0"
    
    • 也可以使用点语法为可变属性赋值:
    someVideoMode.resolution.width = 1280
    print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
    // 打印 "The width of someVideoMode is now 1280"
    

    5. 结构体类型的成员逐一构造器

    • 所有结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性。
    • 新实例中各个属性的初始值可以通过属性的名称传递到成员逐一构造器之中:
    let vga = Resolution(width: 640, height: 480)
    

    与结构体不同,类实例没有默认的成员逐一构造器。

    6. 结构体和枚举是值类型

    • 值类型是这样一种类型,当它被赋值给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。

    • Swift 中所有的基本类型:整数(integer)、浮点数(floating-point number)、布尔值(boolean)、字符串(string)、数组(array)和字典(dictionary),都是值类型,其底层也是使用结构体实现的。

    • Swift 中所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型的属性,在代码中传递的时候都会被复制。

        注意:
            1. 标准库定义的集合,例如数组,字典和字符串,都对复制进行了优化以降低性能成本。
            2. 新集合不会立即复制,而是跟原集合共享同一份内存,共享同样的元素。
            3. 在集合的某个副本要被修改前,才会复制它的元素。而你在代码中看起来就像是立即发生了复制。
      
    let hd = Resolution(width: 1920, height: 1080)
    var cinema = hd
    

    声明了一个名为 hd 的常量,其值为一个初始化为全高清视频分辨率(1920 像素宽,1080 像素高)的 Resolution 实例。
    又声明了一个名为 cinema 的变量,并将 hd 赋值给它。
    因为 Resolution 是一个结构体,所以会先创建一个现有实例的副本,然后将副本赋值给 cinema 。
    尽管 hd 和 cinema 有着相同的宽(width)和高(height),但是在幕后它们是两个完全不同的实例。

    enum CompassPoint {
        case north, south, east, west
        mutating func turnNorth() {
            self = .north
        }
    }
    var currentDirection = CompassPoint.west
    let rememberedDirection = currentDirection
    currentDirection.turnNorth()
    
    print("The current direction is \(currentDirection)")
    print("The remembered direction is \(rememberedDirection)")
    // 打印 "The current direction is north"
    // 打印 "The remembered direction is west"
    

    当 rememberedDirection 被赋予了 currentDirection 的值,实际上它被赋予的是值的一个拷贝。
    赋值过程结束后再修改 currentDirection 的值并不影响 rememberedDirection 所储存的原始值的拷贝。

    7. 类是引用类型

    • 与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。
    • 因此,使用的是已存在实例的引用,而不是其拷贝。
    let tenEighty = VideoMode()
    tenEighty.resolution = hd
    tenEighty.interlaced = true
    tenEighty.name = "1080i"
    tenEighty.frameRate = 25.0
    
    let alsoTenEighty = tenEighty
    alsoTenEighty.frameRate = 30.0
    
    print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")  // 打印 "The frameRate property of theEighty is now 30.0"
    

    因为类是引用类型,所以 tenEight 和 alsoTenEight 实际上引用的是同一个 VideoMode 实例,它们是同一个实例的两种叫法。

    7.1 恒等运算符

    • 类是引用类型,所以多个常量和变量可能在幕后同时引用同一个类实例。
    • 结构体和枚举来说,这并不成立。因为它们作为值类型,在被赋予到常量、变量或者传递到函数时,其值总是会被拷贝。
    • 判定两个常量或者变量是否引用同一个类实例有时很有用,Swift 提供了两个恒等运算符:
      • 相同(===)
      • 不相同(!==)
    if tenEighty === alsoTenEighty {
        print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
    }
    // 打印 "tenEighty and alsoTenEighty refer to the same VideoMode instance."
    

    使用这两个运算符检测两个常量或者变量是否引用了同一个实例。

    “相同”(用三个等号表示,= = =)与“等于”(用两个等号表示,= =)不同。
    “相同”表示两个类类型(class type)的常量或者变量引用同一个类实例。
    “等于”表示两个实例的值“相等”或“等价”。

    7.2 指针

    • Swift 中引用的定义方式与其它的常量或变量的一样。如果需要直接与指针交互,你可以使用标准库提供的指针和缓冲区类型。
    展开全文
  • JAVA学习(对象构造与初始化)

    千次阅读 2019-02-19 15:54:49
    我们的任何一个对象,需要通过constructor构造。 这里还有一个值得注意的点,抽象也可以有构造方法,只是不能通过构造方法实例化一个对象。这个构造方法可以在子类中通过super()来调用,如下面例子。 pack...
  • 考虑用静态工厂方法代替构造器 优势:名称方便区分不必每次创建对象返回原返回类型的任何子类型的对象在创建参数化对象的时候,它使代码更加简洁化 缺点: 无公有的或者protected构造器不能被子化 与其他...
  • 但是如果返回的两个值并没有任何关联关系,或者说每一个方法返回的参数不同,那么我们就得为每一个方法的返回类型去创建对应的来取包装,或许还有其他的解决方式,比如说返回一个map,返回一个List,返回一个...
  • 类的声明 class 类名 用类产生对象 new 类名 对象名=new 类名() 1,有static修饰的方法叫做静态方法,没有...还有internal本程序集、protected(本类和子类) 5,函数重载:在同一个类中,方
  • Swift-和结构体

    2019-08-07 10:44:27
    1. 结构体和类对比 共同点,两者可以: 定义属性用于存储值 定义方法用于提供功能 定义下标操作用于通过下标语法访问它们的值 定义构造器用于设置初始...析构器允许一个类实例释放任何其所被分配的资源 引用计数...
  • 子类继承抽象后,必须把父类中的所有抽象成员重写(除非子类也是一个抽象,则可以不重写) 抽象成员的访问修饰符不能是private 私有的 因为你定义了抽象方法 就是为了让子类重写 那定义了私有抽象方法 还有...
  • 在C++中,类的拷贝主要是通过拷贝构造函数和赋值函数,还有就是为拷贝专门实现的成员方法。 拷贝构造函数和赋值函数在用户没有提供的情况下是由...下面提供一个简单的基类,任何从此类继承的派生类都不可被拷贝。 ...
  • 可能你已经注意到,变量一个美元符号($)的前缀。所有变量是局部变量,为了使得定义的函数中可以使用外部变量,使用global语句。而你要将该变量的作用范围限制在该函数之内,使用static语句。 $g_var = 1 ; /...
  • 这个方法能够判断一个对象是否是一个Array类型或者其派生类型。 <pre><code>js class MyArray extends Array {} const arr1 = []; const arr2 = new MyArray(); console.log(Array.isArray(arr1), Array....
  • java常用工具的使用

    热门讨论 2012-03-19 20:11:37
    而Date的其他构造方法和普通方法的API不容易实现国际化,因此目前Date的大多数方法被标识为过时,表示更灵活的时间请参考java.util.Calendar。 Date的输出结果是按照国际通用格式输出的,而中国更习惯于...
  • 任何一个实现了IHidingPlace接口的Location子类可以让对手藏身。只需要一个描述藏身地点的字符串(比如“衣橱里”,“床底下”等等)★给这个字符串一个get访问器,但是不要有set访问器--我们会在构造方法里面给它...
  • Java中反射的意思是是在运行状态中,对于任何一个类,我们能够知道这个类有哪些方法和属性。对于任何一个对象,我们能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射...
  • 任何一个类里面,只要有构造函数依赖的,可以注入 服务提供者里面,registry方法是注册容器,boot方法是启动的时候进行的初始化工作,还有map方法,把服务提供者做一个映射 第一段 下面我做一个测试实现...
  • 春运时去买火车票,大家排队排着好好的,这时来了一个美女:“可否让我排在你前面?”这可不得了,后面的人像蠕虫一样,全部得退后一步。 3.5.1获得元素操作 50 3.5.2插入操作 51 3.5.3删除操作 52 3.5.4线性表...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定...
  • 《你必须知道的495C语言问题》

    热门讨论 2010-03-20 16:41:18
    可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法? 50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52....
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由...
  •  Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...
  • java 面试题 总结

    2009-09-16 08:45:34
    Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...
  • 你必须知道的495C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    4.4 我有个函数,它应该接受并初始化一个指针void f(int *ip) f static int dummy = 5; ip = &dummy;g 但是当我如下调用时: int *ip; f(ip); 调用者的指针却没有任何变化。. . . . . . . . . . . . . . . 18 4.5 我...
  • 声明方法的存在而不去实现它的被叫做抽象(abstract class),它用于要创建一个体现某些基本行为的,并为该声明方法,但不能在该中实现该的情况。不能创建abstract 的实例。然而可以创建一个变量,其...
  • Java:枚举

    2021-01-30 20:53:23
    例如:想定义一个Color,它只能有Red,Green,Blue3个值,其他的任何是非法的,如果采用传统的构造是极其麻烦的,另外还有一些不安全的问题。引入枚举(Enum)就能避免这些问题。 1.1,使用简单程序完成枚举...
  • c#学习笔记.txt

    热门讨论 2008-12-15 14:01:21
    一个结构不能从另一个结构或类继承,而且不能作为一个类的基。但是,结构从基类 Object 继承。结构可实现接口,其方式同类完全一样。 [c ] 与 C 不同,无法使用 struct 关键字声明类。在 C# 中,类与结构在语义上是...

空空如也

空空如也

1 2 3 4 5
收藏数 85
精华内容 34
关键字:

任何一个类都还有构造方法