Scala面向对象—类详解2(继承相关)
1、单例类
package com.zzzy
class AAA {//单例
/*//java 思路--私有化构造方法,提供公开的getAAA 行不通
private def this(){
this()
}
def getAAA():AAA={
val aaa = new AAA()
return aaa
}
*/
}
package com.zzzy
//单例类 //伴生类
class BBB private(){//1私有化构造方法 } //伴生对象
object BBB{ //不写apply
private val bbb=new BBB()//2创建一个私有对象
def getBBB:BBB={//3提供了一个公开的get方法
bbb
} }
package com.zzzy
object test {
def main(args: Array[String]): Unit = { val b1 = BBB.getBBB
val b2=BBB.getBBB
println(b1==b2)//true } }
2、object的继承和App
package com.zzzzy
abstract class Register {//定义一个抽象类
//抽象方法(没有方法体,只有方法定义)
def regist(name:String)
def unregist(name:String)
}
package com.zzzzy
//实现用extends
object User1 extends Register {
override def regist(name: String): Unit = {
println(name+"注册了") } override def unregist(name: String): Unit = {
println(name+"注销了") }
}
package com.zzzzy
class User2(n:String) extends Register {//主构造方法
override def regist(name: String): Unit = {
println(name+"注册"+n)
}
override def unregist(name: String): Unit ={
println(name+"注销"+n)
}
}
package com.zzzzy
object test extends App {//1如果一个对象继承App可以不需要main方法直接运行
/*def main(args: Array[String]): Unit = {
println("aaa")
}*/
println("bbb")
//2让一个object实现一个抽象类用关键字extends 重写未实现的方法
User1.regist("小敏")
User1.unregist("笑笑")
//3让一个class实现一个抽象类用关键字extends 重写未实现的方法可以有构造方法
new User2("白白").regist("lili")
new User2("白白").unregist("jack")
}
3、类的继承
package com.zzzzzy
class Person {
var name:String=_//必须给类型,无法推断
var age:Int=_
private var num=99
def show(): Unit ={
print("父类的方法")
}
}
package com.zzzzzy
class Student extends Person {
//不能重写被final修饰的方法 var sex:Char='男' override def show(): Unit = {
println("重写父类的方法show")
} def speak(): Unit ={
//调用了父类的属性 实测在运行中无法使用
/*println(super.age)
print(super.name)*/
//私有属性num无法通过super找到 super.show()//父类的方法
show()//子类重写的
} }
package com.zzzzzy
object test extends App {
val stu = new Student
stu.speak()
//多态的向上转型
var s:Person=new Student()
//还能得到子类特有的方法和属性吗?不能
s.show()//调用的为子类重写的方法
println(s.name)//null
println(s.age)
}
4、类型检查和类型转换
package com.zzzzzzy
class Person(name:String,age:Int){
var name1="小明"
var age1=50
def show(): Unit ={
println(name+"\t"+age)
}
}
package com.zzzzzzy //在一个scala文件中可以定义n个类 写在一行必须写; 大括号可以省略
class Emp extends Person("李四",40)
class Student extends Person("张三",30)
package com.zzzzzzy
object test extends App {
val em = new Emp
em.show()
val stu = new Student
stu.show()
println("---------------------")
//判断某个对象是否是某个类型
val ss= new Student()
//继承关系上 is a
println(ss.isInstanceOf[Person])
//转换--向上转型
val pp: Person = ss.asInstanceOf[Person]
pp.show()
}
5、protected关键字
package com.yz.extendz
class Animal {//父类 A和B都不是Animal的子类。那么属性的可使用情况如下
val a=100 //A类可用 //B类可用
protected val b=200
protected [this] val c=300
protected [extendz] val d=400//yz为包名 //A类可用
//这里四个属性,只要是Animal的子类都可以使用,无论在不在同一个包中
}
package com.yz.extendz
class Cat extends Animal{
val y=888
def show: Unit ={
println(s"$a-------$b------$c---------$d")
}
}
package com.yz.extendz
class Dog extends Animal {
val x=999
def show: Unit ={
println(s"$a-------$b------$c---------$d")
}
}
package com.yz.extendz
class A {
def show: Unit ={
val animal = new Animal
println(animal.a)
println(animal.d)
}
}
package com.yz2
import com.yz.extendz.Animal
class B {
def show: Unit ={
val animal = new Animal
println(animal.a)
}
}
6、匿名子类
package com.yz3
class Person {
def aaa="中国"
}
package com.yz3
object test extends App {
val pp= new Person {
override def aaa: String = "新中国"
}
//这个过程中产生了一个匿名子类【发生重写,子类重写父类方法但是又没有显示的定义处理----匿名】
val result = pp.aaa
println(result)
//定义方法
println("-------------------")
def show(p:Person): Unit ={
println(p.aaa)
}
//调用
show(new Person)
}
7、抽象
package com.yz4
abstract class Animal {//可以用于抽象或非抽象方法 拥有抽象字段/非抽象字段
//抽象字段(没有初始值)
val count:Int
//非抽象字段
val num=100
//抽象方法
def aaa:String
//非抽象方法
def bbb: Int ={
10
}
}
package com.yz4
class Cat extends Animal {
//重写抽象方法
override def aaa: String = {"你好"}
override val count: Int = 666
}
package com.yz4
object test extends App {
val cat = new Cat
val aaa: String = cat.aaa
val bbb: Int = cat.bbb
println(aaa+bbb)
}
8、特质(java接口)
package com.yz5
trait Log {
//非抽象方法 抽象时super调用时会出错
def showa:String={
"原始的"
}
}
package com.yz5
trait ALog extends Log {
override def showa: String = {
super.showa
println("ALog重写的方法")
"ALog"
}
}
package com.yz5
trait BLog extends Log {
override def showa: String = {
println("BLog重写的方法")
super.showa
"BLog"
}
}
package com.yz5
class CCC extends ALog with BLog {//继承两个特质
//showa()//默认应该调用最右边的特质中的同名方法【发生同名,以右边为主】
override def showa: String = {
super.showa
}
}
package com.yz5
object test extends App {
val ccc = new CCC
//条件:ALog和BLog重写方法中调用了super.showa
ccc.showa//默认把所有的都运行出来(ALog和BLog中的都运行了)没办法只运行左边的 }
Scala面向对象—类详解2(继承相关)的更多相关文章
- Scala面向对象—类详解
package com.zzy import scala.beans.BeanProperty class Aclass { @BeanProperty//生成get和set方法对于其他框架里对标准的 ...
- URLConnection类详解-转
转-http://www.cnblogs.com/shijiaqi1066/p/3753224.html 1. URLConnection概述 URLConnection是一个抽象类,表示指向URL指 ...
- QAction类详解:
先贴一段描述:Qt文档原文: Detailed Description The QAction class provides an abstract user interface action tha ...
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
- java.lang.Thread类详解
java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...
- java之Matcher类详解
在JDK 1.4中,Java增加了对正则表达式的支持. java与正则相关的工具主要在java.util.regex包中:此包中主要有两个类:Pattern.Matcher. Matcher 声明: ...
- thread 类详解
java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...
- java之AbstractStringBuilder类详解
目录 AbstractStringBuilder类 字段 构造器 方法 public abstract String toString() 扩充容量 void expandCapacity(in ...
- JAVAEE学习——struts2_01:简介、搭建、架构、配置、action类详解和练习:客户列表
一.struts2是什么 1.概念 2.struts2使用优势以及历史 二.搭建struts2框架 1.导包 (解压缩)struts2-blank.war就会看到 2.书写Action类 public ...
随机推荐
- NP问题/NP完全问题(NP-complete problem)如何判断是否是NP完全问题
在算法复杂度分析的过程中,人们常常用特定的函数来描述目标算法,随着变量n的增长,时间或者空间消耗的增长曲线,近而进一步分析算法的可行性(有效性). 引入了Big-O,Big-Ω,来描述目标算法的上限. ...
- ICPC Central Russia Regional Contest (CRRC 19)题解
题目连接:https://codeforces.com/gym/102780 寒假第二次训练赛,(某菜依旧是4个小时后咕咕咕),战况还行,个人表现极差(高级演员) A:Green tea 暴力枚举即可 ...
- 浅谈TypeScript,配置文件以及数据类型
TypeScript在javaScript基础上多了一些拓展特性,多出来的是一些类型系统以及对ES6新特性的支持最终会编译成原始的javaScript, 文件名以.ts结尾,编译过后.js结尾,在an ...
- tf.argmax(vector,axis)函数的使用
1.返回值 vector为向量,返回行或列的最大值的索引号: vector为矩阵,返回值是向量,返回每行或每列的最大值的索引号. 2.参数 vector为向量或者矩阵 axis = 0 或1 0:返回 ...
- 计算机考研复试真题 a+b(大数加法)
题目描述 实现一个加法器,使其能够输出a+b的值. 输入描述: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出描述: 可能有多组测试数据,对于每组数据, 输出a+b的值. 示例1 输入 ...
- 机器学习笔记·adaboost
一.算法简介 Adaboost算法是一种集成算法,所谓集成算法就是将多个弱的分类器组合在一起变成一个强的分类器.弱分类器通常是指分类效果比随机分类稍微好一点的分类器.就像我们在做一个重要决定的时候,通 ...
- Spring MVC 接收 LocalDate、LocalTime 和 LocalDateTime Java 8 时间类型参数
使用 Spring MVC 时,很多业务场景下 Controller 需要接收日期时间参数.一个简单的做法是使用 String 接收日期时间字符串(例如:2020-01-29),然后在代码中将其转换成 ...
- 技术实践丨React Native 项目 Web 端同构
摘要:尽管 React Native 已经进入开源的第 6 个年头,距离发布 1.0 版本依旧是遥遥无期."Learn once, write anywhere",完全不影响 Re ...
- 【TNS】listener.ora模板;tnsnames.ora模板
好多人使用监听的时候误操作,将监听弄的不好使了,这次这个模板,不光是针对大家出现的这种问题,也是给我自己留一个记录,方便他人,方便自己. listener.ora模板样例 -------------- ...
- kubernets之服务发现
一 服务与pod的发现 1.1 服务发现pod是很显而易见的事情,通过简称pod的标签是否和服务的标签一致即可,但是pod是如何发现服务的呢?这个问题其实感觉比较多余,但是接下来你就可能不这么想了 ...