搜尋
首頁Javajava教程Java和Scala如何實現物件導向編程

Scala套件:

基本語法:

package 套件名稱.類別名稱

Scala套件的三大作用:

#區分相同名字的類別

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

控制存取範圍

套件名稱的命名規格:

一般是小寫字母小圓點

com.公司名稱.專案名稱.業務模組名稱

寫入套件的好處:

在maven中可以將自己寫的套件透過maven導入到項目中

在Scala中獨有的包的寫法 和資料夾不對應 可以獨立存在

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

Java和Scala如何實現物件導向編程

套件是可以嵌套的

内层调用外层 不需要导包  atguigu包在techer下
外层调用内层 对象 需要导包

 如下程式碼:

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")
      //外层调用内层 对象 需要导包
          //Inner.main是下边那个包中的
      Inner.main(args)
    }
  }
  package atguigu {
    object Inner {
      def main(args: Array[String]): Unit = {
        println("Inner")
        //内层调用外层 不需要导包  atguigu包在techer下
        test01t.main(args)
      }
    }
  }
}

套件物件:

在Scala中套件也是面向物件的,只要在套件的內部(只要在內部都可以,內層的嵌套也可以),都可以直接呼叫套件物件的屬性和方法

如果套件有嵌套,會出現覆蓋的情況,則會調用距離最近的套件的屬性與方法(包距離最近則會後調用,會覆蓋先前調用的)

導包說明:

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

Scala 中的三個預設導入分別是
import java.lang._
import scala._
import scala .Predef._

類別與物件:

類別:可以看成一個模板
物件:表示具體的事物
我們在使用物件的時候,會以類別為範本建立物件

定義類別:

在Java中一個檔案中只能有一個public    

在Scala中預設的是public 但是它在一個文件中可以建立多個伴生類別和伴生物件

封裝:

在Scala中屬性只有兩種 可變(var)與不可變(val)(分離了讀寫權限-- --類似與物件導向中的封裝(封裝get  set  方法 是為了分離讀取和寫入權限))

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

在Scala中屬性的類型已經封裝成   var----private       val----private final         

且get  set方法也已封裝(封裝成了註解,使用get  set方法的時候則需要先引入已引入(封裝---Bean----- -不過此註解的作用域只有一個屬性 意思是 一個屬性需要設定一個註解)

建構器:

物件導向的語言基本上都有建構器(建構方法),如果在類別中不寫構造方法 預設建構器為空參構造方法

在Scala中也有構造器,與Java不同,

Scala的構造器是在類別名稱上加個()是主構造器(主構造器無參的時候可以省略()  表示預設是可以無參構造的 類同Java)

有主構造器就一定有從構造器

在主建構器的內部可以定義輔助建構器定義的格式是固定的,在從建構器的內部第一行程式碼必須是直接或間接的呼叫主建構器

class Person03(name:String){
  var name1:String=name
def this()
  {
    this("唐不唐")
    println("hello world")
  }
}
主從建構器的載入機制:

在Scala中沒有類別載入機制,所以在程式碼直接呼叫輔助建構器的時候它是不知道類別中的內容的, 所以上邊要求(從建構器的內部第一行程式碼必須是直接或間接的呼叫主建構器),這就是原因所在,取得類別資訊(載入一遍),調用完後才會回傳從建構器繼續執行

根據main方法中你的參數決定你呼叫那個建構器

從建構器是有先後順序的,後邊的只能呼叫前面的(所呼叫的建構器必須在本建構器之前)

從建構器的名稱統一為this(根基底參數的個數來區分)

主建構器是可以傳參的參數可以當作屬性來使用(參數型別如果省略,預設val)

繼承:

繼承關鍵字:extends

基礎語法:

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

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

scala 是單繼承

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

在建立子類別的對象時,Scala會先建立父類別的物件讓後在外層建立子類別物件(同Java)

Scala繼承的本質就是繼承父類別的一個建構器(繼承那個建構器(參數個數來區別)就會呼叫那個)

抽象屬性:

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

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

在重写抽象类中的非抽象方法的时候需要在重写的方法前面加上    override   关键字

子类调用父类的方法的时候使用关键字super  

子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;

子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
因为 var 修饰的为可变变量,子类继承之后就可以直接使用(可以直接进行修改),没有必要重写    

多态:

父类的引用指向子类的实例

Java中的多态测试

:在父子共有的属性和方法调用的是父类还是子类:

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");
        }
}
 
}

属性是调用父类   方法是调用子类   

在进行多态的时候是先将整个内存先把父类写入里面,再把子类嵌套到外边

引用是使用栈 把地址值是先指向父类的   指向谁就调用谁的属性,但是调用方法是一层一层的调用,是不断的被重写的,所以方法是调用子类

Java和Scala如何實現物件導向編程

而Scala与Java不同 都是调用的子类的

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")
  }
}

Java和Scala如何實現物件導向編程

匿名子类:

可以使用匿名子类直接调用抽象类

也可以直接new这个抽象子类

匿名子类是自动使用多态的

多态无法调用子类独有的属性和方法,外部无法使用匿名子类中特有的(它自己的)方法和属性

以上是Java和Scala如何實現物件導向編程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
JVM如何在不同平台上管理垃圾收集?JVM如何在不同平台上管理垃圾收集?Apr 28, 2025 am 12:23 AM

JVMmanagesgarbagecollectionacrossplatformseffectivelybyusingagenerationalapproachandadaptingtoOSandhardwaredifferences.ItemploysvariouscollectorslikeSerial,Parallel,CMS,andG1,eachsuitedfordifferentscenarios.Performancecanbetunedwithflagslike-XX:NewRa

為什麼Java代碼可以在不同的操作系統上運行,而無需修改?為什麼Java代碼可以在不同的操作系統上運行,而無需修改?Apr 28, 2025 am 12:14 AM

Java代碼可以在不同操作系統上無需修改即可運行,這是因為Java的“一次編寫,到處運行”哲學,由Java虛擬機(JVM)實現。 JVM作為編譯後的Java字節碼與操作系統之間的中介,將字節碼翻譯成特定機器指令,確保程序在任何安裝了JVM的平台上都能獨立運行。

描述編譯和執行Java程序的過程,突出平台獨立性。描述編譯和執行Java程序的過程,突出平台獨立性。Apr 28, 2025 am 12:08 AM

Java程序的編譯和執行通過字節碼和JVM實現平台獨立性。 1)編寫Java源碼並編譯成字節碼。 2)使用JVM在任何平台上執行字節碼,確保代碼的跨平台運行。

基礎硬件架構如何影響Java的性能?基礎硬件架構如何影響Java的性能?Apr 28, 2025 am 12:05 AM

Java性能与硬件架构密切相关,理解这种关系可以显著提升编程能力。1)JVM通过JIT编译将Java字节码转换为机器指令,受CPU架构影响。2)内存管理和垃圾回收受RAM和内存总线速度影响。3)缓存和分支预测优化Java代码执行。4)多线程和并行处理在多核系统上提升性能。

解釋為什麼本地庫可以破壞Java的平台獨立性。解釋為什麼本地庫可以破壞Java的平台獨立性。Apr 28, 2025 am 12:02 AM

使用原生庫會破壞Java的平台獨立性,因為這些庫需要為每個操作系統單獨編譯。 1)原生庫通過JNI與Java交互,提供Java無法直接實現的功能。 2)使用原生庫增加了項目複雜性,需要為不同平台管理庫文件。 3)雖然原生庫能提高性能,但應謹慎使用並進行跨平台測試。

JVM如何處理操作系統API的差異?JVM如何處理操作系統API的差異?Apr 27, 2025 am 12:18 AM

JVM通過JavaNativeInterface(JNI)和Java標準庫處理操作系統API差異:1.JNI允許Java代碼調用本地代碼,直接與操作系統API交互。 2.Java標準庫提供統一API,內部映射到不同操作系統API,確保代碼跨平台運行。

Java 9影響平台獨立性中引入的模塊化如何?Java 9影響平台獨立性中引入的模塊化如何?Apr 27, 2025 am 12:15 AM

modularitydoesnotdirectlyaffectJava'splatformindependence.Java'splatformindependenceismaintainedbytheJVM,butmodularityinfluencesapplicationstructureandmanagement,indirectlyimpactingplatformindependence.1)Deploymentanddistributionbecomemoreefficientwi

什麼是字節碼,它與Java的平台獨立性有何關係?什麼是字節碼,它與Java的平台獨立性有何關係?Apr 27, 2025 am 12:06 AM

BytecodeinJavaistheintermediaterepresentationthatenablesplatformindependence.1)Javacodeiscompiledintobytecodestoredin.classfiles.2)TheJVMinterpretsorcompilesthisbytecodeintomachinecodeatruntime,allowingthesamebytecodetorunonanydevicewithaJVM,thusfulf

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版