目錄
Scala包:
基礎(chǔ)語(yǔ)法:
Scala包的三大作用:
包名的命名規(guī)范:
寫包的好處:
包對(duì)象:
導(dǎo)包說(shuō)明:
類和對(duì)象:
定義類:
封裝:
構(gòu)造器:
?主從構(gòu)造器的加載機(jī)制:
繼承:
基礎(chǔ)語(yǔ)法:
抽象屬性:
多態(tài):
Java中的多態(tài)測(cè)試
Scala測(cè)試如下:
Scala的面向?qū)ο笏枷牒蚃ava是一致的
Scala包:
基礎(chǔ)語(yǔ)法:
????????package 包名.類名
Scala包的三大作用:
? ? ? ? 區(qū)分相同名字的類
? ? ? ? 當(dāng)類很多時(shí),可以很好的管理類
? ? ? ? 控制訪問(wèn)范圍
包名的命名規(guī)范:
? ? ? ? ? ? ?一般是小寫字母+小圓點(diǎn)
? ?com.公司名.項(xiàng)目名.業(yè)務(wù)模塊名
寫包的好處:
在maven中可以將自己寫的包通過(guò)maven導(dǎo)入到項(xiàng)目中
在Scala中獨(dú)有的包的寫法? 和文件夾不對(duì)應(yīng)? 可以獨(dú)立存在
下圖是我在類下邊建的包,和正常的包一樣使用?
?包是可以嵌套的
內(nèi)層調(diào)用外層 不需要導(dǎo)包 atguigu包在techer下
外層調(diào)用內(nèi)層 對(duì)象 需要導(dǎo)包
如下代碼:
package chapter04
object Test_01_package {
def main(args: Array[String]): Unit = {
}
}
//Scala獨(dú)有的
package techer {
import chapter04.techer.atguigu.Inner
object test01t {
def main(args: Array[String]): Unit = {
println("hello 我是大哥 pack")
//外層調(diào)用內(nèi)層 對(duì)象 需要導(dǎo)包
//Inner.main是下邊那個(gè)包中的
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)
}
}
}
}
包對(duì)象:
在Scala中包也是面向?qū)ο蟮?,只要在包的?nèi)部(只要在內(nèi)部都可以,內(nèi)層的嵌套也可以),都可以直接調(diào)用包對(duì)象的屬性和方法
如果包有嵌套,會(huì)出現(xiàn)覆蓋的情況,則會(huì)調(diào)用距離最近的包的屬性與方法(包距離最近則會(huì)后調(diào)用,會(huì)覆蓋先前調(diào)用的)
導(dǎo)包說(shuō)明:
導(dǎo)包是不支持嵌套的(導(dǎo)包后只能用它下邊的類和對(duì)象,不能再用它下邊的包,如果想使用它下邊包中的方法,就需要使用? ?.? ?但是當(dāng)我們導(dǎo)包直接導(dǎo)入它下邊的包? 就可以直接調(diào)用,不需要用? .? ? ?來(lái)使用)
類和對(duì)象:
我們?cè)谑褂脤?duì)象的時(shí)候,會(huì)以類為模板創(chuàng)建對(duì)象
定義類:
在Java中一個(gè)文件中只能有一個(gè)public? ??
在Scala中 默認(rèn)的是public 但是它在一個(gè)文件中可以創(chuàng)建多個(gè)伴生類和伴生對(duì)象
封裝:
在Scala中屬性只有兩種? 可變(var)與不可變(val)(分離了讀寫權(quán)限----類似與面向?qū)ο笾械姆庋b(封裝get? set? 方法? 是為了分離讀寫權(quán)限))
在Scala直接通過(guò)屬性的類型來(lái)分離
在Scala中屬性的類型已經(jīng)封裝成? ? var----private? ? ? ?val----private final? ? ? ? ?
并且get? set方法也已經(jīng)封裝(封裝成了注解,在使用get? set方法的時(shí)候需要 先引入注解@BeanProperty----不過(guò)該注解的作用域只有一個(gè)屬性? 意思是? 一個(gè)屬性需要設(shè)置一個(gè)注解)
構(gòu)造器:
面向?qū)ο蟮恼Z(yǔ)言基本都有構(gòu)造器(構(gòu)造方法),如果在類中不寫構(gòu)造方法? 默認(rèn)構(gòu)造器為空參構(gòu)造方法
在Scala中也有構(gòu)造器,與Java不同,
Scala的構(gòu)造器是在類名上加個(gè)()? ?是主構(gòu)造器(主構(gòu)造器無(wú)參的時(shí)候可以省略()? 表示默認(rèn)是可以無(wú)參構(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)造器的加載機(jī)制:
在Scala中沒(méi)有類加載機(jī)制,所以在代碼直接調(diào)用輔助構(gòu)造器的時(shí)候它是不知道類中的內(nèi)容的, 所以上邊要求(從構(gòu)造器的內(nèi)部第一行代碼必須是直接或者間接的調(diào)用主構(gòu)造器),這就是原因所在,獲取類信息(加載一遍),調(diào)用完后才會(huì)返回從構(gòu)造器繼續(xù)執(zhí)行
根據(jù)main方法中你的參數(shù)決定你調(diào)用那個(gè)構(gòu)造器
從構(gòu)造器是有先后順序的,后邊的只能調(diào)用前面的(所調(diào)用的構(gòu)造器必須在本構(gòu)造器之前)
從構(gòu)造器的名稱統(tǒng)一為this(根基參數(shù)的個(gè)數(shù)來(lái)區(qū)分)
主構(gòu)造器是可以傳參的 參數(shù)可以當(dāng)作屬性來(lái)使用(參數(shù)類型如果省略,默認(rèn)val)
繼承:
繼承關(guān)鍵字:extends
基礎(chǔ)語(yǔ)法:
子類繼承父類的屬性和方法
繼承的本質(zhì):其實(shí)與Java是完全不一樣的
在創(chuàng)建子類的對(duì)象時(shí),Scala會(huì)先創(chuàng)建父類的對(duì)象讓后在外層創(chuàng)建子類對(duì)象(同Java)
Scala繼承的本質(zhì)就是繼承父類的一個(gè)構(gòu)造器(繼承那個(gè)構(gòu)造器(參數(shù)個(gè)數(shù)來(lái)區(qū)別)就會(huì)調(diào)用那個(gè))
抽象屬性:
就是不寫等號(hào),寫抽象方法需要把類改成抽象類
抽象屬性在使用的時(shí)候需要繼承它? ?讓后需要重寫屬性和方法(在Java中是不需要重寫屬性的,因?yàn)镾cala底層是對(duì)屬性進(jìn)行封裝,自帶方法)
在重寫抽象類中的非抽象方法的時(shí)候需要在重寫的方法前面加上? ? override? ?關(guān)鍵字
子類調(diào)用父類的方法的時(shí)候使用關(guān)鍵字super??
子類對(duì)抽象屬性進(jìn)行實(shí)現(xiàn),父類抽象屬性可以用 var 修飾;
多態(tài):
父類的引用指向子類的實(shí)例
Java中的多態(tài)測(cè)試
:在父子共有的屬性和方法調(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)用子類? ?
在進(jìn)行多態(tài)的時(shí)候是先將整個(gè)內(nèi)存先把父類寫入里面,再把子類嵌套到外邊
引用是使用棧 把地址值是先指向父類的? ?指向誰(shuí)就調(diào)用誰(shuí)的屬性,但是調(diào)用方法是一層一層的調(diào)用,是不斷的被重寫的,所以方法是調(diào)用子類
而Scala與Java不同 都是調(diào)用的子類的
Scala測(cè)試如下:
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這個(gè)抽象子類
匿名子類是自動(dòng)使用多態(tài)的文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-414151.html
多態(tài)無(wú)法調(diào)用子類獨(dú)有的屬性和方法,外部無(wú)法使用匿名子類中特有的(它自己的)方法和屬性文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-414151.html
到了這里,關(guān)于Scala之面向?qū)ο蟮奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!