scala学习五 继承的实现

  在定义一个最简单的scala对象作为起点,进行继承方面的记录:

class Person(val firstName:String, val lastName:String, val age:Int)
{
  def toString = "[Person: firstName="+firstName+" lastName="+lastName+
                         " age="+age+"]"
}
注意:虽然在类的代码中你没有看见显示的age变量,这些都是scala的编译器决定的(下面的调用是可以实现的)

 val p = new Person("Jennifer", "Aloi", 28)
    println("p.age:"+p.age);

作为一个人,总会有些要做的事,所以可以创建子类的定义:

 class Person(val firstName:String, val lastName:String, val age:Int)
{
  override def toString = "[Person: firstName="+firstName+" lastName="+lastName+
                          " age="+age+"]"

  def doSomething; // note the semicolon, which is still optional
                   // but stylistically I like having it here
}

class Student(firstName:String, lastName:String, age:Int)   ///在类的定义的时候就完成了构造函数
  extends Person(firstName, lastName, age)</span>
{
  def doSomething =
  {
    System.out.println("I'm studying hard, Ma, I swear! (Pass the beer, guys!)")
  }
}

此外,函数也可以当作一种类型(对象和函数     作用与前面说匿名函数的时候差不多):

// This is Scala    
class Person(val firstName:String, val lastName:String, val age:Int)
{
     var doSomething : (Person) => Unit =       //注意
    (p:Person) => System.out.println("I'm " + p + " and I don't do anything yet!");
    
     def work() =
        doSomething(this)
    
  override def toString = "[Person: firstName="+firstName+" lastName="+lastName+
                          " age="+age+"]"
}

object App
{
  def main(args : Array[String]) =
  {
    val bindi = new Person("Tabinda", "Khan", 38)
    System.out.println(bindi)
    
    bindi.work()
    
    bindi.doSomething =
      (p:Person) => System.out.println("I edit textbooks")
      
    bindi.work()
    
    bindi.doSomething =
      (p:Person) => System.out.println("I write HTML books")
      
    bindi.work()
  }
}


与Java的一点语法差异(def很灵活,这种差异也隐藏了字段与方法的差异(你调用的时候可以 a.xx    那这是函数还是字段呢?   其实都无所谓,函数也是属性了)):

// This is Scala
abstract class Person(val firstName:String, val lastName:String, val age:Int)
{
  def doSomething
  
  def weight : Int
    
  override def toString = "[Person: firstName="+firstName+" lastName="+lastName+
                          " age="+age+"]"
}

class Student(firstName:String, lastName:String, age:Int, val subject:String)
  extends Person(firstName, lastName, age)
{
  def weight : Int =
    age // students are notoriously skinny

  def doSomething =
  {
    System.out.println("I'm studying hard, Ma, I swear! (Pass the beer, guys!)")
  }
}

class Employee(firstName:String, lastName:String, age:Int)
  extends Person(firstName, lastName, age)
{
  val weight : Int = age * 4 // Employees are not skinny at all

  def doSomething =
  {
    System.out.println("I'm working hard, hon, I swear! (Pass the beer, guys!)")
  }
}


从 @Override 到 override    (不得不说的就是IED了,唉)

// This is Scala
class Student(firstName:String, lastName:String, age:Int, val subject:String)
  extends Person(firstName, lastName, age)
{
  def weight : Int =
    age // students are notoriously skinny

  def doSomething =
  {
    System.out.println("I'm studying hard, Ma, I swear! (Pass the beer, guys!)")
  }
  
  override def toString = "[Student: firstName="+firstName+
                          " lastName="+lastName+" age="+age+
                          " subject="+subject+"]"
}


同样,在scala的  final的用法与Java中完全一样,当然了,在编程的时候,val生成的就是final的属性


scala和Java的混合是,在scala 中的Java对象同样支持Any类型的指派(Java中的Object类)代码:

package scaj;

public class JavaPerson {
	public JavaPerson(String firstName, String lastName, int age) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;
	}

	public String getFirstName() {
		return this.firstName;
	}

	public void setFirstName(String value) {
		this.firstName = value;
	}

	public String getLastName() {
		return this.lastName;
	}

	public void setLastName(String value) {
		this.lastName = value;
	}

	public int getAge() {
		return this.age;
	}

	public void setAge(int value) {
		this.age = value;
	}

	public String toString() {
		return "[Person: firstName" + firstName + " lastName:" + lastName
				+ " age:" + age + " ]";
	}

	private String firstName;
	private String lastName;
	private int age;
}

package scaj

class ScalaJavaPerson(firstName: String, lastName: String, age: Int)
  extends JavaPerson(firstName, lastName, age) {
  val weight: Int = age * 2 // Who knows what Scala/Java people weigh?

  override def toString = "[SJPerson: firstName=" + firstName +
    " lastName=" + lastName + " age=" + age + "]"
}

object xx extends Application {
  val richard = new ScalaJavaPerson("Richard", "Campbell", 45)
  System.out.println(richard)
  val host: Any = richard
  System.out.println(host)
  println("**********************")
  val carl = new JavaPerson("Carl", "Franklin", 35)
  System.out.println(carl)
  val host2: Any = carl
  System.out.println(host2)
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值