发表于: 2018-03-19 23:14:11
1 492
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
昨天本来想继续做任务,但是回顾了一下忽然发现脑子里一片空白,只知道大概要怎么做,却不知道具体该怎么做,前面学的知识点有点忘记了,所以决定这两天先复习,结合日报回顾下已经学过的知识,有时间再看看基础里面剩下的还没学的,任务的继续前进就等到线下去再继续吧。
一、复习
二、内部类
1.成员内部类,即非静态内部类
a.定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法,如果被static修饰,就变成静态内部类了。
b.在内部类中可以随意使用外部类的成员方法以及成员变量,即使这些类成员被修饰为private。在成员内部类中访问外部类的成员方法和属性时使用:外部类名.this.成员方法/属性。
c.而外部类不可以直接访问内部类成员变量,只能使用内部类对象引用调用,因为内部类的成员只有在内部类的范围内是可知的。
d.成员内部类中不能存在static关键字,即,不能声明静态属性、静态方法、静态代码块等。【非静态内部类也可以定义静态成员但需要同时有final关键词修饰,静态方法鉴于无法用final修饰,仍必须是在静态内部类 或者非内部类中定义。】
e.内部类的对象实例化操作必须在外部类或外部类的非静态方法中实现。否则得先有一个实例化的外部类对象,创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数),可以理解为隐式地保存了一个引用,指向创建它的外部类对象。
f.内部类在编译之后生成一个单独的class文件,里面包含该类的定义,所以内部类中定义的方法和变量可以跟父类的方法和变量相同。
2.静态内部类
a.在一个类里面使用static声明一个静态内部类
b.与非静态内部类不同,静态内部类的实例化 不需要一个外部类的实例为基础,可以直接实例化,语法:new 外部类.静态内部类();
c.因为没有一个外部类的实例,所以在静态内部类里面不可以访问外部类的实例属性和方法
d.除了可以访问外部类的私有静态成员外,静态内部类和普通类没什么大的区别
e.与成员内部类对比如下
说明 | 成员内部类 | 静态内部类 |
静态成员 | 静态成员需同时有final关键词修饰 | 可以 |
静态方法 | 不可定义 | 可以 |
访问外部类非static属性/方法 | 外部类名.this.成员方法/属性 | 不可以 |
外部类访问内部类 | 需要通过内部类的一个实例来访问 | 需要通过内部类的一个实例来访问 |
创建实例 | 外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数) | 外部类名.内部类名 实例名 = new 外部类名.内部类名(参数) |
编译后的class文件 | 单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class | 单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class |
其他 | 与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)” | 无 |
3.局部内部类
a.定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。
b.局部内部类只能在代码代码块、方法体内和作用域中使用(如创建对象和使用类对象等)
c.局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰。
d.可以使用abstract修饰,声明为抽象类。
4.匿名内部类
a.定义格式
new 父类构造方法(参数){
//注:该方法名必须在父类中已经存在
修饰符 返回参数类型 方法名(参数列表){
...
}
}
b.只能使用一次,创建实例之后,类定义会立即消失(想要多次使用就要用到反射的知识了)
c.必须继承一个类(抽象的、非抽象的都可以)或者实现一个接口。如果父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。在实现了抽象方法后本来应该是一个新的类,但是因为没有命名,所以称为匿名类。(和匿名对象的目的有点像)
d.不能是抽象类,因为匿名内部类在定义之后,会立即创建一个实例。
e.不能定义构造方法,匿名内部类没有类名,无法定义构造方法,但是,匿名内部类拥有与父类相同的所有构造方法。
f.可以定义代码块,用于实例的初始化,但是不能定义静态代码块。
g.可以定义新的方法和属性(不能使用static修饰),但是无法显式的通过“实例名.方法名(参数)”的形式调用,因为使用new创建的是“上转型对象”(即父类声明指向子类对象)。
h.是局部内部类,所以要符合局部内部类的要求
说明 | 成员内部类 | 匿名内部类 |
静态成员 | 静态成员需同时有final关键词修饰 | 不可定义 |
静态方法 | 不可定义 | 不可定义 |
访问外部类非static属性/方法 | 外部类名.this.成员方法/属性 | 外部类名.this.成员方法/属性 |
外部类访con问内部类 | 需要通过内部类的一个实例来访问 | 需要通过内部类的一个实例来访问 |
创建实例 | 外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数) | 如上:父类 实例名 = new 父类(){} |
编译后的class文件 | 单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class | 单独的class文件,使用类$数字.class |
其他 | 与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)” | 无 |
5.本地类
a.可以理解为有名字的匿名类,与内部类不一样的是内部类必须声明在成员的位置,即与属性和方法平等的位置。
b.本地类与匿名类一样,直接声明在代码块里面,可以是主方法,for循环里等地方。
明天计划的事情:(一定要写非常细致的内容)
不出意外明天就去线下了,感觉自己自习效率还是比较低
遇到的问题:(遇到什么困难,怎么解决的)
关于内部类,从下午看到现在,感觉还是理解的不够,可能还是平时用的太少了
收获:(通过今天的学习,学到了什么知识)
复习了之前的日报中的知识点,了解了内部类
评论