1定义:一个类内部包含另一个类。 其中有1成员内部类和2局部内部类(包含匿名内部类)
2成员内部类格式:修饰符 class 外部类名称 { 修饰符 class 内部类名称 { } }。
注:内用外,随意;外用内一定要创建内部类对象。在pakage文件中会以
外部类名称 $ 内部类名称.class存在
3成员内部类的使用:
1间接方式:先在外部类方法中使用内部类,然后main方法调用外部方法。
2直接方法:格式:外部类名称.内部类名称 对象名=new外部类名称().new 内部类名称();
在main方法中直接新建一个内部类对象
4重名情况下,内部类方法使用:1局部变量:变量名(直接用)
2内部类成员变量:this.变量名
3外部类成员变量:外部类名称.this.变量名
5局部内部类的定义:格式:class 局部类名称{ } 定义在方法内部的类,只有当前所属的方法
新建对象后才能调用它。
6局部内部类的final问题:内部类如果想要访问所在方法的局部变量,那么这个变量必须是
有效final的,即,该变量的值是不能改变的。因为new出来的内部类对像
是存在于堆内存中,存在时间很长,而局部变量会跟着成员方法进栈执
行后消失。而常量就不会。
7匿名内部类:格式:接口名称(父类名称 )对象名=new 接口名称(){
覆盖重写所有抽象方法 }
如果接口的实现类,或父类的子类,只需使用唯一的一次,那么这种情况下就
可以省略掉该类的定义,在main方法中将这个实现类或子类改为匿名内部类,
并将接口或父类的方法全部覆盖重写
8匿名内部类的使用注意事项:
1创建匿名内部类所新建的对象,必须和创建匿名内部类绑定(有新建就得有方法)
2匿名内部类是有对象名的,注意区分 匿名对象.匿名内部类和匿名内部类
不过两者都适用于只使用一次的情况
9类作为成员变量使用:同类之间,或在主方法中使用都可以(219课)
10接口作为成员变量:220课
父类和接口都可以作为成员变量,如下图:在“hero” 类里面,Skill接口作为属性。

此时的小写skill就可以视为是接口的一个实现类,可以在下面的方法里面直接使用skill.use
其实使用的就是接口的实现类重写的方法。
如果主程序想要对“hero”里面的Skill进行赋值,有几种方法:
1、新建接口的实现类,然后将这个实现类作为参数传递进hero里面

主方法中传入接口的实现类

2,直接在主程序中新建一个匿名实现类,在类中重写接口的抽象方法。然后将这个
匿名实现类传入接口中

3,使用匿名对象+匿名内部类,就是不要上面那个小写的skill了

4、再仔细一想,setSkill是一个成员方法,它里面传入的参数Skill就是一个接口,
接口里面又只有一个抽象方法

所以可以使用lambda表达式

11接口或类也可以作为方法的参数或返回值
案例1: 发红包 抢红包(群主也有)
注意事项:在程序里面涉及到钱的变量,都用整数进行代替 1元=100分,因为浮点运算不精确
代码主要方法
package FaHongBao;
import HongBao.OpenMode;
public class fahongbao {
public static void main(String[] args) {
/*因为RedPacketFrame是抽象类,所以要新建一个子类(framedelei),然后新建对象,
然后在其中的title构造方法中写上标题和调用SetOwnerName方法*/
framedelei framedelei =new framedelei("发红包");
framedelei.setOwnerName("bed");
/*//平均分法
OpenMode average=new Averagemode();//新建多态对象average
framedelei.setOpenWay(average);*/
OpenMode randomMode=new RandomMode();
framedelei.setOpenWay(randomMode);
}
}
运算接口的子类
package FaHongBao;
import HongBao.OpenMode;
import java.util.ArrayList;
import java.util.Random;
public class RandomMode implements OpenMode {
@Override
public ArrayList<Integer> divide(int totalMoney, int totalCount) {
ArrayList<Integer> list=new ArrayList<>();
Random r=new Random();//随机数生成器
int leftMoney=totalMoney;
int leftCount=totalCount;
for(int i=0;i<totalCount-1;i++){
int money=r.nextInt(leftMoney/leftCount*2)+1;
list.add(money);
leftMoney-=money;
leftCount--;
}
list.add(leftMoney);
return list;
}
}
12 jshell脚本工具:直接在cmd中运行的工具。对于轻量级的编程有用,无法保存

被折叠的 条评论
为什么被折叠?



