回顾:IDEA直接生成默认返回值是unit,导致没有返回值:
def main(args: Array[String]) :unit = {
}
Scala03
val属性 = _ _表示占位符,占个坑
例如 var name = _ ,出现如下报错
未指定name的类型:unbound placeholder parameter
进行如下修改:var name:String = _

链式编程:
val conf = new SparkConf
conf.setAppName("").setMaster("")..........

原生代码使用Scala链接MySQL

1)MySQL的驱动
2)获取Connection 重量级的获取过程,借助于POOL连接池
3)Statement
4)ResultSet 结果集
5)Close 释放资源
POOL连接池先创建一批,初始化的时候初始化进去,用的时候直接在里面拿,比如有1000个请求,直接在池子里用,性能比1000个请求高

IO编程:打开资源、业务处理、释放资源

package com.ruozedata.bigdata

import java.sql.DriverManager

object ScalaJDBCApp  {
  def main(args: Array[String]): Unit = {

    var url = "jdbc:mysql://hadoop004:3306/ruoze_g6"
    var user = "root"
    val password = "960210"
    val sql = "select DB_LOCATION_URI,DB_ID,NAME from dbs;"

    classOf[com.mysql.jdbc.Driver]
    val connection = DriverManager.getConnection(url,user,password)
    val stmt = connection.createStatement()
    val rs = stmt.executeQuery(sql)
    while (rs.next){
      val location = rs.getLong(1)
      val dbid = rs.getString(2)
      val name = rs.getString(3)
    }
  }

}

主构造器和附属构造器都是在一个类里面的:
伪代码:
Class(xx:Int){
field
method/funcrion
def this(xx:Int,yy:String) //附属构造器
this(xx)

}

父类和子类:两个类之间

子类extends父类

如下是子类:
package com.ruozedata.bigdata

import com.ruozedata.bigdata.FunctionApp.People

object ExtendsApp {

  def main(args: Array[String]): Unit = {
    //new子类()会先触发new父类()
    val bt1 = new BigTree("大树","北京",100000.0f)
	println("bt1.money")
	println("bt1.age")
  }
}
  class BigTree(name:String,city:String,Money:Float)
    extends People(name,city){
    println("john here")

    def toString() = "bigtree to string"         //method toString needs override modifier,override是在子类中重写父类的方法或者属性
    money = 100
    age = 30

    println("john leave")

  }
  输出如下:
person laizi here
person here
john here
john leave
  如下是父类:
  package com.ruozedata.bigdata

object FunctionApp {
  def main(args: Array[String]): Unit = {
//    val people = new People("ruoze","北京")
//    println(people.name + ":" + people.city )

    val people = new People("黄帆","苏州",30)
    println(people.name + ":" + people.city + ":" + people.age)
  }

  //主构造器、跟在class后面的
  class People(val name:String, val city:String){
      println("person laizi here")

    var age:Int = _
    var money = 100000

    //附属构造器,第一行必须调用主构造器或者其他附属构造器
    def this(name:String,city:String,age:Int){
      this(name,city)
      this.age = age
    }
      println("person here")
  }
}

//override def toString() = “bigtree to string” 这段话注释掉后输出的是[email protected]
在object.java中去找:
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
默认的toString方法返回的是:完整的报名@+此对象哈希码的无符号十六进制
println(bt1.toString) 默认走的是父类的方法,如果子类重写了,那么调用的就是子类的方法。

假设定义了一个父类Animal:定义了一个吃的方法
Dog	eat	
Cat	eat
pig	eat
.....
Dog类是从animal中继承过来的,对于猫狗来说他们的爱好是不同的,只需要用override把eat方法重写即可,override出来的走的是自己的方法。
在框架中定义一些接口或者抽象类,具体实现是由子类来实现的.
记住一句话:override可以重写父类的方法,属性指的是 class People(val name:String, val wife:String)
scala中有两种赋值:var 和val,var在生命周期中可以被多次赋值,val就不能再赋值了。
当一个类extends另外一个类的时候:override的基本规则如下:
1、子类中的方法要覆盖父类中的方法,必须写override
2、子类中的属性val要覆盖父类中的属性时,要override
3、父类中的变量不可以覆盖

MenoryManager.scala 父类
StaticMemoryManager.scala 子类
spark中的内存管理

抽象类

1、object AbstractApp{
def main(args: Array[String]): Unit = {
	def speak()        //函数的定义但没有实现,此时只能被修饰为一个抽象类	
	val name:String	//	没有赋值的属性
	val a = new B()
	a.speak()		//	调用B中的speak
}
}
2、abstract class A {
  def speak()  //函数的定义但没有具体的实现
  val name:String   //没有具体实现的方法,没有具体赋值的属性
}
3、class B extends A{
	override def speak(): Unit = {
	println("people here")
	}		//B继承A后需要重写这个方法
}
抽象类不能直接new,而是通过子类来new(且子类不能还是抽象类),一定是要通过底层的能具体实现的子类来new
上述代码的A和B也是一个父子关系。

相关文章:

猜你喜欢
  • 2022-12-23
  • 2021-10-28
相关资源
相似解决方案