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)文章
-
Java數(shù)據(jù)結(jié)構(gòu)之平衡二叉樹的原理與實現(xiàn)
平衡樹(Balance Tree,BT) 指的是,任意節(jié)點的子樹的高度差都小于等于1。常見的符合平衡樹的有,B樹(多路平衡搜索樹)、AVL樹(二叉平衡搜索樹)等。本文將詳細介紹平衡二叉樹的概念和實現(xiàn)原理以及它的實現(xiàn) 2022-01-01
-
SpringBoot項目的配置文件中設(shè)置server.port不生效問題
這篇文章主要介紹了SpringBoot項目的配置文件中設(shè)置server.port不生效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教 2022-11-11
-
MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式(實例代碼)
本文通過實例代碼給大家分享了MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式,非常不錯,具有參考借鑒價值,需要的朋友參考下吧 2017-09-09
-
Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解
本篇文章主要介紹了Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
2017-05-05
-
springboot+springsecurity如何實現(xiàn)動態(tài)url細粒度權(quán)限認證
這篇文章主要介紹了springboot+springsecurity如何實現(xiàn)動態(tài)url細粒度權(quán)限認證的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教 2021-06-06
-
基于ThreadLocal 的用法及內(nèi)存泄露(內(nèi)存溢出)
這篇文章主要介紹了基于ThreadLocal 的用法及內(nèi)存泄露(內(nèi)存溢出),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教 2021-10-10
最新評論
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)文章
Java數(shù)據(jù)結(jié)構(gòu)之平衡二叉樹的原理與實現(xiàn)
平衡樹(Balance Tree,BT) 指的是,任意節(jié)點的子樹的高度差都小于等于1。常見的符合平衡樹的有,B樹(多路平衡搜索樹)、AVL樹(二叉平衡搜索樹)等。本文將詳細介紹平衡二叉樹的概念和實現(xiàn)原理以及它的實現(xiàn)2022-01-01SpringBoot項目的配置文件中設(shè)置server.port不生效問題
這篇文章主要介紹了SpringBoot項目的配置文件中設(shè)置server.port不生效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式(實例代碼)
本文通過實例代碼給大家分享了MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-09-09Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解
本篇文章主要介紹了Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05springboot+springsecurity如何實現(xiàn)動態(tài)url細粒度權(quán)限認證
這篇文章主要介紹了springboot+springsecurity如何實現(xiàn)動態(tài)url細粒度權(quán)限認證的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06基于ThreadLocal 的用法及內(nèi)存泄露(內(nèi)存溢出)
這篇文章主要介紹了基于ThreadLocal 的用法及內(nèi)存泄露(內(nèi)存溢出),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10