init()方法和构造方法的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了init()方法和构造方法的区别相关的知识,希望对你有一定的参考价值。

java 中 selevlet 里及有init方法 又有构造方法
他们不都是在这个类实例的时候调用的 有什么区别啊

构造方法是容器实例化selevlet 用的,init其实是构造方法调用的,
简单说,先构造方法,然后init方法

除非init()是静态的,不需要构造函数作一些初始化
参考技术A 构造方法是容器实例化selevlet 用的,init其实是构造方法调用的,简单说,先构造方法,然后init方法本回答被提问者采纳 参考技术B init()方法是Applet程序的入口,必须要有的。
而构造方法是一个类得初始化方法,比如说People people=new People("freestyleboy21")就是把people这个对象初始化为freestyleboy21,懂了吧?
希望能帮助到你……
参考技术C 你仔细看看的话,会发现,其实init方法是在构造里调用的 参考技术D 顺序不同,构造先。

swift 元类构造方法

参考技术A 一,如果是继承自NSObject,可以对父类的构造函数进行重写

//构造函数class Person: NSObject
var name : String?
var age :Int = 0
override init()
//在构造函数中,如果没有明确调用super.init(),系统会帮我们调用(仅仅只在构造函数中,其他函数中不会)
super.init()

//自定义构造函数
init(name:String, age : Int)
print("----")
self.name = name self.age = age
init(dict: [String : AnyObject])
// as? 转成可选类型
// as! 转成确定类型
self.name = dict["name"] as? String
//可选类型: 先判断等号后面的有没有值,没有值就不执行后面括号,有值就将等号后面的强制解包赋值给等号前面的// if let tempAge = dict["age"] as? Int// age = tempAge//

//相当于下面这段代码:
let tempAge = dict["age"]
let tempAge1 = tempAge as? Int
if tempAge1 != nil
age = tempAge1!

let p = Person.init(name: "ss", age: 4)let p1 = Person.init(dict: ["name" : "jack","age" : 18])

最后需要注意的点:自定义构造函数,如果没有重写默认的构造函数init(),系统会覆盖掉默认构造函数init(),如果不想覆盖掉,必须重写init()方法
二,便利构造函数
1,在OC中当需要对系统的类进行扩充时,我们通常会选择用类别,swift中同样也可以对系统的类扩展方法,

7522B840-76FD-4679-8BBD-6B0244159C95.png

2,首先新建个swift file文件,命名为:UIButton-Extension.swift,导入UIKit

import UIKitextension UIButton
///扩展类方法
class func creatBtn (image : String, bgImage : String) -> UIButton

let btn = UIButton.init()
btn.setBackgroundImage(UIImage.init(named: bgImage), forState: .Normal)
btn.setBackgroundImage(UIImage.init(named: bgImage + "_highlighted"), forState: .Highlighted)
btn.setImage(UIImage.init(named: image), forState: .Normal)
btn.setImage(UIImage.init(named: image + "_highlighted"), forState: .Highlighted)
btn.sizeToFit()
return btn

///convenience:便利构造函数
convenience init(image : String, bgImage : String )
//便利构造函数必须得调用 self.init()
self.init()
self.setBackgroundImage(UIImage.init(named: bgImage), forState: .Normal)
self.setBackgroundImage(UIImage.init(named: bgImage + "_highlighted"), forState: .Highlighted)
self.setImage(UIImage.init(named: image), forState: .Normal)
self.setImage(UIImage.init(named: image + "_highlighted"), forState: .Highlighted)
self.sizeToFit()

调用:let btn = UIButton.creatBtn("tabbar_compose_icon_add", bgImage: "tabbar_compose_button")let btn = UIButton.init(image: "tabbar_compose_icon_add", bgImage: "tabbar_compose_button")

同样的对UIBarButtonItem也可以扩充方法

import UIKitextension UIBarButtonItem

/* 第1种
convenience init(image : String)
self.init()
let btn = UIButton.init()
btn.setImage(UIImage.init(named: image), forState: .Normal)
btn.setImage(UIImage.init(named: image + "_highlighted"), forState: .Highlighted)
btn.sizeToFit()
self.customView = btn
*/

// 第2种
convenience init(image : String)

let btn = UIButton.init()
btn.setImage(UIImage.init(named: image), forState: .Normal)
btn.setImage(UIImage.init(named: image + "_highlighted"), forState: .Highlighted)
btn.sizeToFit()
self.init(customView:btn)
调用:
navigationItem.rightBarButtonItem = UIBarButtonItem.init(image: "navigationbar_pop")

以上是关于init()方法和构造方法的区别的主要内容,如果未能解决你的问题,请参考以下文章

swift 元类构造方法

Spring中构造器init-method@PostConstructafterPropertiesSet孰先孰后,自动注入发生时间以及单例多例的区别

python 构造器

Objective-C中如何创建构造函数呢?

构造方法和析构函数,重点讲解

JAVA中构造方法和普通方法的区别