开发者学堂课程【Scala 核心编程-基础:内部类的基本使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/9003
内部类的基本使用
内容介绍
一、嵌套类
二、Java 内部类的简单回顾
三、Java 内部类基本语法
四、Java 内部类的分类
五、Java 内部类回顾案例
六、Scala 嵌套类的使用1
一、嵌套类
1、基本介绍
在 Scala 中,你几乎可以在任何语法结构中内嵌任何语法结构,可以嵌套写,如在类中可以再定义一个类,这样的类是嵌套类,其他语法结构也是一样。嵌套类类似于 Java 中的内部类。
2、面试题:Java 中,类共有五大成员,请说明是哪五大成员?
(1)属性
(2)方法
(3)内部类
(4)构造器
(5)代码块
二、Java 内部类的简单回顾
在 Java 中,一个类的内部又完整的嵌套了另一个完整的类结构。被嵌套的类称为内部类(inner class), 嵌套其他类的类称为外部类。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
三、Java 内部类基本语法
class Outer{ //外部类
class Inner{ //内部类
}
}
class Other{//外部其他类
}
四、Java 内部类的分类
1、从定义在外部类的成员位置上来看,
(1)成员内部类( 没用 static 修饰)
(2)静态内部类( 使用 static 修饰)
2、定义在外部类局部位置上(比如方法内)来看:
(1)分为局部内部类(有类名)
(2)匿名内部类(没有类名)
五、Java 内部类回顾案例
之后要跟 Scala 的嵌套类做比较
新建一个包,innerclass。
创建 JavaInnerClass。
package com. atguigu.JavaInnerClass;
public class TestJavaClass {
public static void main(String[] args) {
//使用
//创建一个外部类对象
OuterClass outer1 = new OuterClass();
//创建一个外部类对象
OuterClass outer2 = new OuterClass();
//创建 Java 成员内部类
//说明在 Java 中,将成员内部类当做一个属性,因此使用下面的方式来创建 outer1 .new InnerClass().
OuterClass .InnerClass inner1 = outer1.new InnerClass();在 java 内部类中创建一个内部类的语法比较特别,new 写在点后面,因为在 Java 中,将成员内部类当做一个属性。
OuterClass. InnerClass inner2 = outer2 new InnerClass();
//下面的方法调用说明在 java 中,内部类只和类型相关,也就是说,只要是
//OuterClass.InnerClass 类型的对象就可以传给形参 InnerClass ic
inner1.test(inner2); 用 inner1调 inner2
inner2. test(inner1); 用 inner2调 inner1
但是在 Scala 中这么写会报错,Scala 内部类默认是跟外部对象关联。
//创建 java 静态内部类
//因为在 java 中静态内部类是和类相关的,使用 new OuterClass. StaticnnerClass()
OuterClass StaticlnnerClass staticlnner = new OuterClass StaticInnerClass();
静态内部类和 java 内部类几乎是一样的。
}
}
class OuterClass (//外部类
class InnerClass { //成员内部类
//test 方法可以接收 InnerClas 实例
public void test( InnerClass ic ) {
System out. println(ic);
}
}
static class StaticInnerClass //静态内部类
}
}
内部类有很多作用,比如本身内部类是不能访问私有的东西,但是内部类可以访问外部类的私有属性,涉及到加载时机的问题,如果是一个静态代码块,它实际上可以做延迟加载的作用。
运行之后没问题。
六、Scala 嵌套类的使用1
请编写程序,定义 Scala 的成员内部类和静态内部类,并创建相应的对象实例。没有 static 关键字,它的静态内部类就要放在伴生对象中。成员内部类仍然跟之前一样。
class ScalaOuterClass {
class ScalalnnerClass { //成员内部类
}
}
object ScalaOuterClass{//伴生对象
class ScalaStaticInnerClass { //静态内部类
}
}
创建两个外部实例。
val outer1 : ScalaOuterClass = new ScalaOuterClass();
val outer2 : ScalaOuterClass = new ScalaOuterClass();
// Scala 创建内部类的方式和 Java 不一样,将 new 关键字放
置在前,使用对象.内部类的方式创建
val inner1 = new outer1 ScalalnnerClass()
val inner2 = new outer2. ScalalnnerClass()
从语法上看,它的内部类其实是由外部对象进行创建的。内部类的类型其实不单单是看里面的类,而是跟外部对象相关。
创建内类的语法格式跟java是一样的。
//创建静态内部类对象
val staticInner = new
ScalaOuterClass. ScalaStaticInnerClass()
println(staticInner)
创建 ScalaInnerClass,选择 object。
package com. atguigu. chapter08.innerclass
object ScalaInnerClassDemo {
def main(args: Array[String]): Unit = {
//测试1,创建两个外部类的实例
val outer1 : ScalaOuterClass = new ScalaOuterClass();
val outer2 : ScalaOuterClass = new ScalaOuterClass();
//在 scala 中,创建成员内部类的语法是
//对象内部类的方式创建,这里语法可以看出在 scala 中,默认情况下内部类实例和外部对象关联
就是用 outer1创建出的内部类和 outer2创建出的内部类不是同一个类型。
Val inner1 new outer1. ScalaInperClass 从这里可以看出,创建语法跟 java 不一样
Val inner2 new outer2. ScalaInperClass
//创建静态内部类实例
val staticInner= new Scal aOuterclass . ScalastaticInnerClass()
}
}
//外部类
class SçalaOuterClass {
class ScalaInnerclass {//成员内部类
}
}
object ScalaOuterClass {//伴生对象
class ScalaStaticInnerclass {//静态内部类,注意要写在伴生对象里面,否则它就不是一个静态内部类
}
}