构造方法 (1)

/*

构造方法:

作用: 对实例对象的内容进行初始化

Swift要求类或者结构体中的存储属性(非lazy在)在对象构造完毕后要有初始化值

语法:

init(参数列表){ 初始化代码 }

注意: 1.在Swift中类/结果提/枚举都需要构造方法;

2.构造方法的作用仅仅是用语初始化属性, 而不是分配内容, 分配内存是系统帮我们做的;

3.构造方法是隐式调用的, 通过 类名称() 形成创建一个对象就会隐式调用 init() 构造方法;

4.如果所有的存储属性都有默认值, 可以不提供构造方法, 系统会提供一个隐式的构造方法;

5.如果存储属性可以提供缺省, 那么提倡大家使用设置缺省值的方法, 这样可以简化代码(不用自定义构造方法, 不用写存储属性类型)

*/

class Person {

var name: String = "hjq"

//    var age: Int = 20

var age:Int

func description() -> String {

return "name = \(name) age = \(age)"

}

init() {

print("init")

age = 30

}

}

// 1.分配内存; 2.初始化name和age; 3.构造方法是隐式调用的

var p = Person()

var descripString: String = p.description() //显示调用

print(p.age)

print("================================")

/** 带有参数的构造方法 **/

class Person2 {

var name:String

var age:Int

func description() -> String {

return "name = \(name) age = \(age)"

}

//1.构造方法的内部参数, 默认也是外部参数;

//2.而函数的内部参数默认不会当做外部参数;

//3.而方法的内部参数, 从第二个开始才会当做外部参数;

//4.构造方法对属性的顺序没有要求, 只要保证对象构造完时所有存储属性被初始化即可.

init(age:Int, name:String)

{

self.name = name

self.age = age

}

func setName(name:String, age:Int)

{

self.name = name

self.age = age

}

}

var p2 = Person2(age: 25, name: "hjq")

p2.setName(name: "hjq", age: 30)

print(p2.description())

p2.setName(name: "hjq", age: 23)

print(p2.description())

print("================================")

/*

常量存储属性与构造方法

常量存储属性只能通过缺省值或在构造方法中被修改, 其它任何地方都不能修改

*/

class Person3 {

var name:String = "hjq"

var age:Int

init(age:Int, name:String)

{

self.name = name

self.age = age

}

func description() -> String {

return "name = \(name) age = \(age)"

}

}

var p3 = Person3(age: 30, name: "jq")

print(p3.description())

//p3.name = "hello" //常量存储属性初始化之后不允许被修改! 虽没报错,但是不允许,这一点在后面开发中挖掘验证!

print("================================")

/** 可选属性与构造方法 **/

class Car {

let name:String

init(name:String)

{

self.name = name

}

}

class Person4 {

let name:String

var age:Int

var car:Car?

//1.可选值存储属性可以不再构造方法中初始化;

//2.也就是说可选值在对象构造完毕后不用初始化;

//3.其实如果不对可选存储属性进行初始化, 默认就是nil

init(age:Int, name:String)

{

self.age = age

self.name = name

}

func description() -> String {

return "name = \(name) age = \(age)"

}

}

/** 结构体与构造方法 **/

struct Rect {

//此时既没有提供缺省值, 也没有提供构造方法, 但是编译通过

//因为默认情况下, 结构体会给结构体提供一个默认的成员逐一构造器

var width:Double = 0.0

var height:Double = 0.0

/*

// 系统默认会提供一个类似的方法

init(width:Double, height:Double)

{

self.width = width

self.height = height

}

*/

/*

init() {

self.width = 0.0

self.height = 0.0

}

*/

}

// 注意: 1.在类中默认是没有逐一构造器的

// 2.如果在结构体中自定义了构造方法, 那么系统不会生成默认的逐一构造器

// 3.如果给存储属性提供了缺省值, 系统还是会提供默认的逐一构造器

//var r = Rect(width: 1.0, heigth: 1.0)

// 4.如果给存储属性提供了缺省值, 可以使用不带参数的方法初始化结构体

var r = Rect()

/*

"值类型"的构造器代理

构造器代理: 构造方法之间的相互调用

构造方法可以调用其他构造方法来完成实例的构造, 称之为构造器代理

好处: 减少构造方法之间的重复代码

*/

struct Rect2 {

var width:Double, height:Double

init(width:Double, height:Double)

{

self.width = width

self.height = height

}

init()

{

//        self.width = 0.0

//        self.height = 0.0

//构造器代理

self.init(width: 0, height: 0)

}

func show()

{

print("width = \(width) height = \(height)")

}

}

var r2 = Rect2()

r2.show()

var r3 = Rect2(width: 100, height: 100)

r3.show()

print("================================")

/*

通过闭包或者全局函数/类方法 设置存储属性的缺省值

如果需要经过计算, 或者需要进行一些额外的操作才能确定初始值时就可以通过闭包或全局函数设置存储属性的缺省值

*/

func getValue() ->Int

{

print("getValue")

return 55

}

class Person5 {

var name:String

//系统在初始化的时候会隐式执行闭包, 将闭包的执行结果赋值给存储属性

//注意: 闭包后面一定要有(), 代表执行闭包

var age:Int = {

() -> Int in  // 这一行可以省略, 返回值是可以省略的,默认返回值的类型就是存储属性的类型

print("age 闭包")

return 30

}()

lazy var height:Double = {

print("lzay 闭包")

return 180.0

}()

var age2:Int = getValue()

var age3:Int = Person5.getValue2()

//1.不能这么写, 因为调用方法时对象还没有初始化完毕;

//2.self只有当所有的存储属性都初始化完毕之后才可以用.

//    var age3:Int = Person5.getValue3()

init(name:String) {

self.name = name

}

class func getValue2() ->Int {

print("class getValue2")

return 100

}

func getValue3() -> Int {

return 99

}

}

var p5 = Person5(name: "hjq")

//懒加载是用到才执行, 而闭包赋值是初始化时就会执行

print(p5.height)

时间: 2024-11-12 16:45:46

构造方法 (1)的相关文章

构造方法中使用泛型

------------siwuxie095 构造方法中使用泛型: 构造方法可以为类中的属性初始化,如果类中的属性通过泛型指定,而又需要 通过构造方法设置属性内容的时候,构造方法的定义与之前并无不同,不需要 像声明类那样指定泛型 package com.siwuxie095.generic; class Context<T>{ private T value; public Context(T value) { this.value=value; } public T getValue() {

构造方法使用及注意事项

构造方法:构造方法是为类中的属性初始化的. 1构造方法的特征:与类名称相同.不含返回值类型的定义.不能在方法中使用return返回一个值 2通过构造方法为属性初始化的时候,最好也经过setter方法完成. eg: class Car{ private String a;//进行了封装 private int b; Car(String s,int n){ this.setA(s);//通过构造方法为属性初始化时,最好使用setter方法完成 this.setB(n); } public Stri

构造方法

特点: 方法名称和类名系统 没有返回值类型,连void也没有 没有具体的返回值 作用: 对数据进行初始化的 注意事项: 构造方法也是有return语句的,格式是return; 如果我们没有给出构造方法,那么系统会提供一个无参的构造方法 如果我们给出了构造方法,那么系统就不会系统无参的构造方法

java构造方法

1.使用new+构造方法,创建一个新的对象 2.构造方法是定义在Java类中的一个用来初始化对象的方法,构造方法与类同名且没有返回值. 3.无参构造方法的使用 4.有参构造方法的使用 5.当没有指定构造方法时,系统会自动添加无参的构造方法 6.当有指定构造方法,无论是有参.无参的构造方法,都不会自动添加无参的构造方法. 7 构造方法的重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法. 8.构造方法不但可以给对象的属性赋值,还可以保证给对象的属性附一个合理的值

构造方法简析

 构造方法,又叫构造器,是在一个类被实例的时候自动执行的一个方法. 1.相比较一般方法来说它的区别: 1.作用:用来给被实例的类进行初始化的, 而不是用于描述某一事物的具 体功能: 2.调用方式:不许要被对象调用,还是在该类被实例的时候自动执行,且 只能执行一次: 3.其他:构造方法可以调用构造方法和一般方法,但是一般方法只能调用 一般方法却不能调用构造方法: 2.构造方法的特点: 1.名字与类名一致: 2.没有返回值,即不需要写返回类型, 包括void: 3.在一个类中也可以有多个构造函数

C#基础[4] 类的构造方法

构造方法用来创建对象,并且可以在构造函数中对对象进行初始化.构造函数是用来创建对象的特殊方法,方法名和类名一样,没有返回值,连void都不用.构造函数可以有参数,new对象的时候传递函数参数即可 如果不指定构造函数,则类有一个默认的无参构造函数.如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写. 构造函数可以重载,也就是有多个参数不同的构造函数.

构造方法和方法的重载。

---恢复内容开始--- 构造器,又称为构造方法.constructor 构造器用于构造该类的实例. 格式: [修饰符] 类名(形参列表){ //n条语句 } 是一种特殊的方法: 1.通过new关键字调用 2.构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类),不能字啊构造器里调用return. 3.如果我们没有定义构造器,则系统u会自动定义一个无参的构造函数.如果已定义则编译器不会添加! 4.构造器的方法名必须和类名一致! 5.构造该类的对象,经常也用来初始化对象的属性. --

java反射-反射实例化对象-反射获得构造方法-反射获得普通方法-获得属性

链接:https://www.zhihu.com/question/24304289/answer/38218810来源:知乎著作权归作者所有,转载请联系作者获得授权. Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象 第一步:获得对象,构造方法,普通方法,属性 Object obj = cls.newInstance() Constructor<?> cons = cls.get

java-分支重载以及构造方法

1:方法的签名: 方法名+参数列表就是一个方法的签名 2.方法的重载(Overload): 1)发生在同一个类中,方法名称相同,参数列表不同 2)编译器在编译时会根据方法的签名自动绑定方法 3.构造方法: 1)常常用于给成员变量赋初值 2)与类同名,没有返回值类型 3)在创建(new)对象时被自动调用 4)构造方法可以重载 5)若自己不写构造方法,则编译器默认一个无参构造方法 若自己写了构造方法,则不再默认提供 4.this:指代当前对象,哪个对象调用方法指的就是哪个对象只能用在方法中,方法中访

继承中的自定义构造方法

1.继承中的自定义构造方法 不能在子类访问父类私有变量 @interface Person : NSObject @property int age; - (id)initWithAge:(int)age; @end @interface Student : Person @property NSString *name; - (id)initWithAge:(int)age andName:(NSString *)name; @end @implementation Student - (id