java基础 内部类 很重要 接口作为变量 方法参数

 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中运行的工具。对于轻量级的编程有用,无法保存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值