您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java Scala面向對象怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
package 包名.類名
區分相同名字的類
當類很多時,可以很好的管理類
控制訪問范圍
一般是小寫字母+小圓點
com.公司名.項目名.業務模塊名
在maven中可以將自己寫的包通過maven導入到項目中
在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方法的時候需要 先引入注解@BeanProperty----不過該注解的作用域只有一個屬性 意思是 一個屬性需要設置一個注解)
面向對象的語言基本都有構造器(構造方法),如果在類中不寫構造方法 默認構造器為空參構造方法
在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 修飾的為可變變量,子類繼承之后就可以直接使用(可以直接進行修改),沒有必要重寫
父類的引用指向子類的實例
:在父子共有的屬性和方法調用的是父類還是子類:
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"); } } }
屬性是調用父類 方法是調用子類
在進行多態的時候是先將整個內存先把父類寫入里面,再把子類嵌套到外邊
引用是使用棧 把地址值是先指向父類的 指向誰就調用誰的屬性,但是調用方法是一層一層的調用,是不斷的被重寫的,所以方法是調用子類
而Scala與Java不同 都是調用的子類的
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") } }
匿名子類:
可以使用匿名子類直接調用抽象類
也可以直接new這個抽象子類
匿名子類是自動使用多態的
多態無法調用子類獨有的屬性和方法,外部無法使用匿名子類中特有的(它自己的)方法和屬性
以上就是“Java Scala面向對象怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。