17_Scala面向对象高阶功能

文章目录

1.继承

--和Java一样,权限protected , public.父类定义子类用 , 仅单继承(防止钻石问题歧义)

1.1 构造对象时,父类对象优于子类对象

复制代码
object Solution01 {
  def main(args: Array[String]): Unit = {

//    1.1 构造对象时,父类对象优于子类对象
    val s  = new Stu      //

    /**
     * person
     * stu
     */

  }

}

class Person{
  var name :String =_
  println("person")


}
class Stu extends Person {
  println("stu")


}

--创建子类实例,scala会先加载父类构造器 得到person后执行子类构造器,得到stu

--构造对象时,父类对象优于子类对象。且每创建一个实例,父类会初始化一次

1.2父类主构造有参数,子类必须要显示地调用父类主构造器并传值

复制代码
class Animal(name:String){}
class Cat extends Animal("cat"){}
class Cat1(name:String) extends Animal(name){}

传值方式如上述两种

2.封装

封装就是将数据和数据操作放在一起

复制代码
Bean规范:属性私有化提供set/get方法

3.抽象

和Java一致,抽象方法就是被子类重写的,因此不需要定义方法体;

3.1抽象定义

复制代码
abstract class AbstractDemo{
  def test():Unit
}

3.2子类继承抽象类

复制代码
    abstract class AbstractDemo{
      def test():Unit
    }

//    子类继承抽象类
    class yy extends AbstractDemo{
      override def test():Unit={

      }
    }

3.3抽象属性

scala中抽象属性

--抽象类中所有属性都可以不初始化值;

--如果初始化值,var类型在子类直接修改,val类型在子类进行override重写即可重新赋值

--var没有重写操作

--子类一旦继承,必须对其属性进行赋值操作

var,val变量可以在抽象类中不进行初始化,但是继承抽象类的类必须进行初始化赋值操作,必须;

4.伴生对象

4.1创建类和伴生对象

复制代码
class User{
//  def apply(): User = new User()
  println("class user")

}
object User{

  def apply(): User = new User()

  println("object user")

}

4.2调用

复制代码
val user1 = new User()        //执行类的构造方法,直接完成类的初始化操作
val user11 = new User         //简化原则
println("===========================")
val suer2 = User              //伴生对象访问方法
println("===========================")
val user3 = User.apply        //apply由编译器动态识别,不论apply写入到class 或是object中,最终调用的都是User类
println("===========================")
val user4 = User()            //因为是动态识别,因此apply可省

结果

小结:

--有得有失,得到了抽象方法的能力,失去了创建对象的能力;

--抽象方法省略方法体

--子类重写父类方法,前面加override修饰符,非上面

--调用方法遵循就近原则

--var,val变量可以在抽象类中不进行初始化,但是继承抽象类的类必须进行初始化赋值操作,必须

--占位符???

--抽象类中所有属性都可以不初始化值;

--如果初始化值,var类型在子类直接修改,val类型在子类进行override重写即可重新赋值

--var没有重写操作

--子类一旦继承,必须对其属性进行赋值操作

--对象伴生对象访问区别仅在于有没有new

相关推荐
EmbedLinX18 分钟前
C语言标准库stdlib.h
c语言·开发语言·笔记
百锦再40 分钟前
Java中的日期时间API详解:从Date、Calendar到现代时间体系
java·开发语言·spring boot·struts·spring cloud·junit·kafka
A懿轩A1 小时前
【Java 基础编程】Java 枚举与注解从零到一:Enum 用法 + 常用注解 + 自定义注解实战
java·开发语言·python
等....1 小时前
MobaXterm操作虚拟机
后端
mjhcsp1 小时前
C++ 树形 DP解析
开发语言·c++·动态规划·代理模式
yaoxin5211232 小时前
328. Java Stream API - 使用 Optional 的正确姿势:为何、何时、如何使用
java·开发语言
岱宗夫up2 小时前
从代码模式到智能模式:AI时代的设计模式进化论
开发语言·python·深度学习·神经网络·自然语言处理·知识图谱
我命由我123452 小时前
Visual Studio 文件的编码格式不一致问题:错误 C2001 常量中有换行符
c语言·开发语言·c++·ide·学习·学习方法·visual studio
MR_Promethus2 小时前
【C++类型转换】static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
再难也得平2 小时前
[LeetCode刷题]49.字母异位词分组(通俗易懂的java题解)
java·开发语言·leetcode