欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Scala之面向?qū)ο?/h1>
 更新時間:2023年04月13日 10:37:15   作者:小唐同學(xué)(?>?<?)  
Scala是一門面向?qū)ο蟮恼Z言。在Scala中,一切皆為對象函數(shù)是對象,數(shù)字也是對象,本文詳細介紹了Scala面向?qū)ο蟮脑砗徒榻B,感興趣的小伙伴可以參考一下

Scala的面向?qū)ο笏枷牒蚃ava是一致的

Scala包:

基礎(chǔ)語法:

package 包名.類名

Scala包的三大作用:

區(qū)分相同名字的類

當類很多時,可以很好的管理類

控制訪問范圍

包名的命名規(guī)范:

一般是小寫字母+小圓點

com.公司名.項目名.業(yè)務(wù)模塊名

寫包的好處:

在maven中可以將自己寫的包通過maven導(dǎo)入到項目中

在Scala中獨有的包的寫法  和文件夾不對應(yīng)  可以獨立存在

下圖是我在類下邊建的包,和正常的包一樣使用 

包是可以嵌套的

內(nèi)層調(diào)用外層 不需要導(dǎo)包  atguigu包在techer下
外層調(diào)用內(nèi)層 對象 需要導(dǎo)包

 如下代碼:

package chapter04
object Test_01_package {
  def main(args: Array[String]): Unit = {
  }
}
//Scala獨有的
package techer {
  import chapter04.techer.atguigu.Inner
  object test01t {
    def main(args: Array[String]): Unit = {
      println("hello  我是大哥 pack")
      //外層調(diào)用內(nèi)層 對象 需要導(dǎo)包
          //Inner.main是下邊那個包中的
      Inner.main(args)
    }
  }
  package atguigu {
    object Inner {
      def main(args: Array[String]): Unit = {
        println("Inner")
        //內(nèi)層調(diào)用外層 不需要導(dǎo)包  atguigu包在techer下
        test01t.main(args)
      }
    }
  }
}
 
 

包對象:

在Scala中包也是面向?qū)ο蟮?,只要在包的?nèi)部(只要在內(nèi)部都可以,內(nèi)層的嵌套也可以),都可以直接調(diào)用包對象的屬性和方法

如果包有嵌套,會出現(xiàn)覆蓋的情況,則會調(diào)用距離最近的包的屬性與方法(包距離最近則會后調(diào)用,會覆蓋先前調(diào)用的)

導(dǎo)包說明:

導(dǎo)包是不支持嵌套的(導(dǎo)包后只能用它下邊的類和對象,不能再用它下邊的包,如果想使用它下邊包中的方法,就需要使用   .   但是當我們導(dǎo)包直接導(dǎo)入它下邊的包  就可以直接調(diào)用,不需要用  .     來使用)

Scala 中的三個默認導(dǎo)入分別是
import java.lang._
import scala._
import scala.Predef._

類和對象:

類:可以看成一個模板
對象:表示具體的事物
我們在使用對象的時候,會以類為模板創(chuàng)建對象

定義類:

在Java中一個文件中只能有一個public    

在Scala中 默認的是public 但是它在一個文件中可以創(chuàng)建多個伴生類和伴生對象

封裝:

在Scala中屬性只有兩種  可變(var)與不可變(val)(分離了讀寫權(quán)限----類似與面向?qū)ο笾械姆庋b(封裝get  set  方法  是為了分離讀寫權(quán)限))

在Scala直接通過屬性的類型來分離

在Scala中屬性的類型已經(jīng)封裝成    var----private       val----private final         

并且get  set方法也已經(jīng)封裝(封裝成了注解,在使用get  set方法的時候需要 先引入注解@BeanProperty----不過該注解的作用域只有一個屬性  意思是  一個屬性需要設(shè)置一個注解)

構(gòu)造器:

面向?qū)ο蟮恼Z言基本都有構(gòu)造器(構(gòu)造方法),如果在類中不寫構(gòu)造方法  默認構(gòu)造器為空參構(gòu)造方法

在Scala中也有構(gòu)造器,與Java不同,

Scala的構(gòu)造器是在類名上加個()   是主構(gòu)造器(主構(gòu)造器無參的時候可以省略()  表示默認是可以無參構(gòu)造的  類同Java)

有主構(gòu)造器就一定有從構(gòu)造器

在主構(gòu)造器的內(nèi)部可以定義輔助構(gòu)造器 定義的格式是固定的,在從構(gòu)造器的內(nèi)部第一行代碼必須是直接或者間接的調(diào)用主構(gòu)造器

class Person03(name:String){
  var name1:String=name
def this()
  {
    this("唐不唐")
    println("hello world")
  }
}

主從構(gòu)造器的加載機制:

在Scala中沒有類加載機制,所以在代碼直接調(diào)用輔助構(gòu)造器的時候它是不知道類中的內(nèi)容的, 所以上邊要求(從構(gòu)造器的內(nèi)部第一行代碼必須是直接或者間接的調(diào)用主構(gòu)造器),這就是原因所在,獲取類信息(加載一遍),調(diào)用完后才會返回從構(gòu)造器繼續(xù)執(zhí)行

根據(jù)main方法中你的參數(shù)決定你調(diào)用那個構(gòu)造器

從構(gòu)造器是有先后順序的,后邊的只能調(diào)用前面的(所調(diào)用的構(gòu)造器必須在本構(gòu)造器之前)

從構(gòu)造器的名稱統(tǒng)一為this(根基參數(shù)的個數(shù)來區(qū)分)

主構(gòu)造器是可以傳參的 參數(shù)可以當作屬性來使用(參數(shù)類型如果省略,默認val)

繼承:

繼承關(guān)鍵字:extends

基礎(chǔ)語法:

class 子類名 extends 父類名 { 類體 }

子類繼承父類的屬性和方法

scala 是單繼承

繼承的本質(zhì):其實與Java是完全不一樣的

在創(chuàng)建子類的對象時,Scala會先創(chuàng)建父類的對象讓后在外層創(chuàng)建子類對象(同Java)

Scala繼承的本質(zhì)就是繼承父類的一個構(gòu)造器(繼承那個構(gòu)造器(參數(shù)個數(shù)來區(qū)別)就會調(diào)用那個)

抽象屬性:

就是不寫等號,寫抽象方法需要把類改成抽象類

抽象屬性在使用的時候需要繼承它   讓后需要重寫屬性和方法(在Java中是不需要重寫屬性的,因為Scala底層是對屬性進行封裝,自帶方法)

在重寫抽象類中的非抽象方法的時候需要在重寫的方法前面加上    override   關(guān)鍵字

子類調(diào)用父類的方法的時候使用關(guān)鍵字super  

子類對抽象屬性進行實現(xiàn),父類抽象屬性可以用 var 修飾;

子類對非抽象屬性重寫,父類非抽象屬性只支持 val 類型,而不支持 var。
因為 var 修飾的為可變變量,子類繼承之后就可以直接使用(可以直接進行修改),沒有必要重寫    

多態(tài):

父類的引用指向子類的實例

Java中的多態(tài)測試

:在父子共有的屬性和方法調(diào)用的是父類還是子類:

public class Polymorphic {
    public static void main(String[] args) {
        Person person=new Student();
        System.out.println(person.name);
        person.sayhi();
    }
    public static class Person{
     String   name="Person";
     public void sayhi()
     {
         System.out.println("person  sayhi");
     }
    }
public static class Student extends Person{
        String name="Student";
        public void sayhi()
        {
            System.out.println("student sayhi");
        }
}
 
}

屬性是調(diào)用父類   方法是調(diào)用子類   

在進行多態(tài)的時候是先將整個內(nèi)存先把父類寫入里面,再把子類嵌套到外邊

引用是使用棧 把地址值是先指向父類的   指向誰就調(diào)用誰的屬性,但是調(diào)用方法是一層一層的調(diào)用,是不斷的被重寫的,所以方法是調(diào)用子類

而Scala與Java不同 都是調(diào)用的子類的

Scala測試如下:

package chapter04
 
object Test07_Polymorphic {
  def main(args: Array[String]): Unit = {
       val  per:Person07=new Student07
       per.sayhi();
    println(per.name)
  }
}
class Person07()
{
  val name:String="dsdsd"
def sayhi():Unit={
  println("hi person")
}
}
class Student07 extends Person07{
  override val name: String = "Student"
override def sayhi(): Unit =
  {
    println("Student say hi")
  }
}

匿名子類:

可以使用匿名子類直接調(diào)用抽象類

也可以直接new這個抽象子類

匿名子類是自動使用多態(tài)的

多態(tài)無法調(diào)用子類獨有的屬性和方法,外部無法使用匿名子類中特有的(它自己的)方法和屬性

以上就是Java Scala之面向?qū)ο蟮脑敿殐?nèi)容,更多關(guān)于Scala之面向?qū)ο蟮馁Y料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論