Java基础学习-类

内部类

一个类内部包含另一个类。编译文件格式:xx$内部类名称.class

成员内部类

修饰符  class  类名称 {   

		修饰符  class  内部类名称{     }

}

内用外,随意访问,外用内,需要内部类对象。

使用成员内部类

间接:通过外部类的读写,调用外部类的方法,里面间接使用内部类方法。

直接:类名称 对象名 = new 类名称();

外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

内部类调用重名的外部类成员变量,外部类名称.this.外部类成员变量名。

局部内部类(包含匿名内部类)

只有当前所属方法才使用它。

修饰符  class  类名称 {   

		修饰符 返回值类型  外部类方法名称(参数列表)

		{    class  内部类名称 {   }

         }

}

类的权限修饰符

public > protected > (default) > private

  • 外部类:public / (default)
  • 成员内部类:public / (default) / protected / private
  • 局部内部类:什么都不能写

private 是本类内部使用,protected 没有外边的

final

局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效的(final)

只要局部办理事实不变,final关键字可以使用。

new出来的对象在堆内存中。局部变量是更着方法走的,在栈内存当中。方法结束会立即消失,但对象还在,解决生命周期问题。

匿名内部类

接口的实现类(或者父类的子类)只需要唯一的一次,可以省略掉该类定义。

接口名称 对象名 = new 接口名称( ){

​ @Override

覆写重写接口中的所有抽象方法

};

格式:(new 接口名称(){ 匿名内部类内容 })进行解析:

1.匿名内部类,在创建的时候使用唯一一次。

2.匿名内部类+匿名对象:

new  接口名称( ){
		@Override
		**覆写重写**接口中的所有抽象方法
}. 方法名;

注意:

XX.A().B(); 两个.是用A返回值作为对象来调用B方法。

3.匿名内部类省略了实现类/子类名称,但是匿名对象是省略了对象名称。

成员变量

使用类作为成员变量:

调用时使用 类名称.方法名称 进行获取传递的变量信息

使用接口作为成员变量:

因为参数时接口类型,但是接口的方法不能直接使用,因此:

使用实现类/匿名内部类 对接口方法进行实现调用。

Skill为接口,Hero类的接口成员变量为private Skill skill;

Hero类里面使用内部类方法为skill.use

但是,接口不能直接使用,因此将skill对象重写定义为一个接口实现类SkillImpl

Hero hero = new Hero;

hero.setSkill( new SkillImpl( ) );

或者为

Skill skill = new Skill { @Override 接口方法 };

hero.setSkill(skill);

或者:匿名对象+匿名内部类

hero.setSkill ( new Skill ( ) { @Override 接口方法 } );

接口作为方法的参数和返回值

可以返回接口,接口虽然不能被实例化,但是接口的实现类都可以向上转型为接口。

public static 接口类型 方法名 (接口类型 参数名){

​ 参数名.接口方法;

​ return 参数名;

}

Smoking s = smoking(); //相当于Smoking s = new Student(); Smoking 为接口

posted @ 2021-03-30 10:47  Tonka  阅读(75)  评论(0)    收藏  举报