观看老韩的java教程做的笔记,谢谢老韩和观看的你。
类的五大类成员:属性、方法、构造器、代码块、内部类
1.局部内部类
(1)可直接访问外部类的所有成员,包括私有成员
(2)它的地位相当于一个局部变量,只能添加final访问修饰符
(3)外部类要使用局部内部类的方法,需要创建该类的对象,然后调用方法
(4)外部其他类不能访问局部内部类
(5)外部类和局部内部类的属性重名时,遵循就近原则, 若想使用外部类,就要用外部类名.this.属性(外部类名.this的本质是外部类的对象)
package innerclass;
public class InnerClass01 {
public static void main(String[] args) {
Outer02 outer02 = new Outer02();
outer02.m1();
}
}
class Outer02 {
private int n1 = 100;
private void m2() {
System.out.println("m2()");
}
public void m1(){
//它的地位相当于一个局部变量,只能添加final访问修饰符或不添加
final class Inner02{
private int n1 = 100;
public void f1(){
//可直接访问外部类的所有成员,包括私有成员
//外部类和局部内部类的属性重名时,遵循就近原则
//若想使用外部类,就要用外部类名.this.属性(外部类名.this的本质是外部类的对象)
System.out.println("n1 = " + n1 + " 外部类的n1 = " + Outer02.this.n1);
m2();
}
}
//外部类要使用局部内部类的方法,需要创建该类的对象,然后调用方法
Inner02 inner02 = new Inner02();
inner02.f1();
}
}
*2.匿名内部类
(1)匿名内部类是一个类的定义,也是一个对象。
(2)可以直接访问外部类的所有成员,包括私有成员
(3) 外部其他类不能访问匿名内部类
(4)外部类和局部内部类的属性重名时,遵循就近原则, 若想使用外部类,就要用外部类名.this.属性(外部类名.this的本质是外部类的对象)
package innerclass;
public class AnonymousInnerClassDetail {
public static void main(String[] args) {
Outer05 outer05 = new Outer05();
outer05.f1();
}
}
class Outer05{
private int n1 = 99;
public void f1(){
Person p = new Person(){
public void hi(){
System.out.println("匿名内部类重写" + n1);
}
};
p.hi();
new Person(){
@Override
public void hi(){
System.out.println("匿名内部类重写hi");
}
@Override
public void ok(String str) {
super.ok(str);
}
}.ok("myh");
}
}
class Person{
public void hi(){
System.out.println("Person hi()");
}
public void ok(String str){
System.out.println("Person ok()" + str);
}
}
package innerclass;
public class InnerClassExercise02 {
public static void main(String[] args) {
new Cellphone().alarmClock(new Bell() {
@Override
public void ring() {
System.out.println("懒猪起床了");
}
});
Cellphone cellphone = new Cellphone();
cellphone.alarmClock(new Bell(){
@Override
public void ring(){
System.out.println("小伙伴上课了");
}
});
}
}
interface Bell {
void ring();
}
class Cellphone{
public void alarmClock(Bell bell){
bell.ring();
}
}
3.成员内部类
(1)可以直接访问外部类的所有成员,包括私有成员
(2)可添加public、private、默认、protected等修饰符(本质是成员,和局部变量不同)
(3)外部类、外部其他类使用内部类时,需要新建一个内部类的对象
package innerclass;
public class MemberInnerClass {
public static void main(String[] args) {
Outer08 outer08 = new Outer08();
outer08.t1();
Outer08.Inner08 inner08 = outer08.new Inner08();
inner08.say();
Outer08.Inner08 inner08Instance = outer08.getInner08Instance();
inner08Instance.say();
}
}
class Outer08 {
private int n1 = 10;
public String name = "张三";
private void hi(){
System.out.println("hi方法");
}
public class Inner08 { //成员内部类
public double sal = 99.8;
private int n1 = 66;
public void say() {
System.out.println("n1 = " + n1 + " name = " + name + " 外部类的n1 = " + Outer08.this.n1);
hi();
}
}
public Inner08 getInner08Instance(){
return new Inner08();
}
public void t1(){
Inner08 inner08 = new Inner08();
inner08.say();
System.out.println(inner08.sal);
}
}
4.静态内部类
(1)不能访问非静态成员
(2)可任意添加访问修饰符
package innerclass;
public class StaticInnerClass {
public static void main(String[] args) {
Outer10 outer10 = new Outer10();
outer10.m1();
Outer10.Inner10 inner10 = new Outer10.Inner10();
inner10.say();
Outer10.Inner10 inner101 = outer10.getInner10();
inner101.say();
Outer10.Inner10 inner11 = outer10.getInner11();
inner11.say();
}
}
class Outer10{
private int n1 = 10;
private static String name = "张三";
static class Inner10{
private static String name = "韩顺平教育";
public void say(){
System.out.println(name + " " + Outer10.name);
}
}
public void m1(){
Inner10 inner10 = new Inner10();
inner10.say();
}
public Inner10 getInner10(){
return new Inner10();
}
public static Inner10 getInner11(){
return new Inner10();
}
}



