scala(对象)-第三天

1、面向对象概述
    java:
        封装:属性、方法封装到类中
            User:int id,String name,Date birthday
        继承:
        多态:
2、类的定义与使用
    def main(args:Array[String]):Unit={
        val person = new People()

        person.name = "Messi"
        //person.age=30 //会报错,因为是val,没有setter方法,只有getter方法
        println(person.name + " .. " +person.age)

        person.eat

        person.watchFootbal("barcelona")

        person.printInfo
        //println(person.gender) 会报错,因为gender被private【this】修饰

    }
    class People{
        var name:String = ""
        val age:Int = 10

        private [this] val gender = "male"
        def printInfo():Unit = {
            println("gender: "+ gender)
        }

        def eat():String = {
            name + "eating"
        }

        def watchFootball(teamName: String): Unit={
            println(name + " is watching match of " + teamName)

        }
    }
3、构造器
    object ConstructorApp{
        main{
            val person = new Person("zhangsan",30)

            val person2 = new Person("ting",18,"M")
        }
    }

    //主构造器,跟在类名后面的(val name:String, val age:Int)叫做主构造器
    class Person(val name:String, val age:Int){
        println("Person enter...")
        val gender:String = _
        //附属构造器,
        def this(name:String,age:Int,gender:String){
            this(name,age)    //附属构造器的第一行代码必须要调用主构造器或者其他附属构造器
            this.gender = gender
        }
        def eat()="eat"
    }
4、继承与重写
    main{
        val student = new Student("messi",18,"Math")
    }
    class Student(name:String, age:Int,val major:String) extends Person(name,age){
        //子类特有的参数必须写val或var,不然会报错
        //先调用父类构造器,再调用子类构造器
        override def eat()="override def eat"
    }

5、抽象类
    类的一个或者多个方法没有完整的实现(只有定义,没有实现)
    main{
        val student = new Student2()
        println(student.name+student.age)
    }
    abstract class Person2{
        def speak

        val name:String
        val age:Int
    }
    class Student2 extends Person2{
        override def speak: Unit={
            println("speak")
        }
        override val name:String = "messi"
        override val age:Int = 18
    }


6、伴生类与伴生对象
    //如果有一个class,还有一个与class同名的object
    //那么就称这个objcet是class的伴生对象,class是object的伴生类

    //伴生类
    class ApplyTest{

    }
    //伴生对象
    object ApplyTest{

    }


7、apply
    object{
        main{
            for(i<-1 to 10){
                ApplyTest.incr
            }
            println(AppkyTest.count)    //10, 说明object本身就是一个单例对象

            val b = ApplyTest()    //==>Object.apply

            val c = new ApplyTest() //
            c()    // ===>class.apply

            //类名() ==> Object.apply
            //对象() ==> Class.apply
        }
        
    }
        
    //伴生类
    class ApplyTest{
        def apply()={
            在objcet中的apply中new class
            new ApplyTest
        }
    }
    //伴生对象
    object ApplyTest{
        var count = 0
        def incr = {
            count+=1
        }
        //最佳实践,在Object的apply方法中去new Class
        def apply():ApplyTest={
            在objcet中的apply中new class
            new ApplyTest
        }
    }

8、case class
    //通常用在模式匹配
    main{
        pintln(Dog("wangcai").name)
    }
    //case class 不用new
    case class Dog(name:String)

9、trait
    相当于接口
    xxx extends ATrait with BTrait with ...

猜你喜欢

转载自blog.csdn.net/weixin_42898914/article/details/85533436
今日推荐