Java基础学习-类
内部类
一个类内部包含另一个类。编译文件格式:xx$内部类名称.class
成员内部类
修饰符 class 类名称 { 修饰符 class 内部类名称{ }
}
- 1
- 2
- 3
- 4
- 5
内用外,随意访问,外用内,需要内部类对象。
使用成员内部类
间接:通过外部类的读写,调用外部类的方法,里面间接使用内部类方法。
直接:类名称 对象名 = new 类名称();
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
内部类调用重名的外部类成员变量,外部类名称.this.外部类成员变量名。
局部内部类(包含匿名内部类)
只有当前所属方法才使用它。
修饰符 class 类名称 { 修饰符 返回值类型 外部类方法名称(参数列表) { class 内部类名称 { } }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
类的权限修饰符
public > protected > (default) > private
- 外部类:public / (default)
- 成员内部类:public / (default) / protected / private
- 局部内部类:什么都不能写
private 是本类内部使用,protected 没有外边的
final
局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效的(final)
只要局部办理事实不变,final关键字可以使用。
new出来的对象在堆内存中。局部变量是更着方法走的,在栈内存当中。方法结束会立即消失,但对象还在,解决生命周期问题。
匿名内部类
接口的实现类(或者父类的子类)只需要唯一的一次,可以省略掉该类定义。
接口名称 对象名 = new 接口名称( ){
@Override
覆写重写接口中的所有抽象方法
};
格式:(new 接口名称(){ 匿名内部类内容 })进行解析:
1.匿名内部类,在创建的时候使用唯一一次。
2.匿名内部类+匿名对象:
new 接口名称( ){
@Override
**覆写重写**接口中的所有抽象方法
}. 方法名;
- 1
- 2
- 3
- 4
注意:
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 为接口
文章来源: blog.csdn.net,作者:αβγθ,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_38022166/article/details/115319912
- 点赞
- 收藏
- 关注作者
评论(0)