内部类有什么用,内部类的应用场景Demo

内部类大概有四种:

1.方法里面定义的局部内部类

2.成员变量级别的内部类

3.静态内部类

4.匿名内部类

应用:

1.方法内部的局部内部类
 

   public void test(String str){ //已经不需要final修饰符了
        int i = 10; //Java 8更加智能:如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰。
        class testClass{
            //static int ss = 2; 非静态类不能有静态变量
            private int name = 10;
            void test(String s){
                System.out.println(name);
                System.out.println(s);
                System.out.println(i);
            }
        }

        new testClass().test(str);
    }
从上面的例程我们可以看出定义在方法内部的内部类的可见性更小,它只在方法内部
可见,在外部类(及外部类的其它方法中)中都不可见了。同时,它有一个特点,就是方法
内的内部类连本方法的成员变量都不可访问,它只能访问本方法的final型成员。同时另一个
需引起注意的是方法内部定义成员,只允许final修饰或不加修饰符,其它像static等均不可用。
用法还没找到经典的,猜测如下调用:
public interface FunClassInteface {
    String getRet();
    String getRetMsg();
}

public class FunClass {

    public FunClassInteface test2(){
        String str = "001";
        String str2 = "002";
        class FunCImpl implements FunClassInteface{
            @Override
            public String getRet() {
                return str;
            }
            @Override
            public String getRetMsg() {
                return str2;
            }
        }
        return new FunCImpl();
    }

    public static void main(String[] args) {
        FunClass funClass = new FunClass();
        funClass.test("123");

        FunClassInteface test2 = funClass.test2();
        System.out.println(test2.getRet());
        System.out.println(test2.getRetMsg());
    }
}

2.成员变量级别的内部类


java中的Iterate都是这种应用,写个Demo理解下:

//定义一个简单的迭代器接口
public interface MyIterate {
    Object next();
    boolean hasNext();
}


//简单的保存数据
public class MyList {

    int max = 0;

    private Object[] objects;

    public MyList(Object... objects) {
        this.objects = objects;
        max = objects.length;

    }

    public MyIterate getIterate(){
        return new MyIterateImpl();
    }

    //内部类实现迭代器
    private class MyIterateImpl implements MyIterate{
        private int i = 0;
        @Override
        public Object next() {
            return objects[i++];
        }

        @Override
        public boolean hasNext() {
            return i < max;
        }
    }
}

   
    //使用Demo
    public static void main(String[] args) {
        MyList myList = new MyList("你好","我好","大家好!");
        MyIterate myIterate = myList.getIterate();
        while(myIterate.hasNext()){
            System.out.println(myIterate.next());
        }
    }

3.静态内部类

感觉和正常的类差不多,除了不能有非静态变量 ,还没搞清楚

 

有可能为了更高的内部聚合,访问最严格性,HashEntry既然是一个工具类不需要访问

//ConcurrentHashMap的一些信息,使它的访问域最小就可以用上静态内部类
如果内部类不会引用到外部类东西的话,强烈建议使用静态内部类,因为这样更节省资源,
减少内部类其中的一个指向外部类的引用,详见 effective java

4.匿名内部类

众所周知,匿名内部类的作用一般在java8之前进行回调,比如说:

        File file = new File("xxx");
        file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return ".xml".equals(name);
            }
        });

3.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
访问者模式是一种行为型设计模式,用于处理复杂对象结构中的元素,同时保持类型安全性。它将算法与对象结构分离,使得算法可以独立于对象结构而变化。 应用场景: 1. 需要对一个复杂对象结构中的元素进行复杂的操作,并且这些操作需要访问对象的内部状态。 2. 对象结构中的元素类经常发生变化,而需要在不影响其他类的情况下增加或修改操作。 3. 对象结构中的元素类之间的耦合度很高,而且不希望在它们之间增加任何依赖关系。 Java Demo演示: 我们以一个简单的电商系统为例,演示访问者模式的应用。假设该系统有以下几类商品: 1. 书籍(Book) 2. 食品(Food) 3. 数码产品(DigitalProduct) 4. 家具(Furniture) 现在需要统计不同种类商品的总价值。定义一个Visitor接口,声明了对不同商品类的visit方法。 ```java public interface Visitor { void visit(Book book); void visit(Food food); void visit(DigitalProduct digitalProduct); void visit(Furniture furniture); } ``` 定义一个抽象商品类Product,包含accept方法接受Visitor对象的访问。 ```java public abstract class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } public abstract void accept(Visitor visitor); } ``` 具体商品类继承自Product,实现accept方法。 ```java public class Book extends Product { public Book(String name, double price) { super(name, price); } @Override public void accept(Visitor visitor) { visitor.visit(this); } } public class Food extends Product { public Food(String name, double price) { super(name, price); } @Override public void accept(Visitor visitor) { visitor.visit(this); } } public class DigitalProduct extends Product { public DigitalProduct(String name, double price) { super(name, price); } @Override public void accept(Visitor visitor) { visitor.visit(this); } } public class Furniture extends Product { public Furniture(String name, double price) { super(name, price); } @Override public void accept(Visitor visitor) { visitor.visit(this); } } ``` 实现Visitor接口的具体类,用于统计不同种类商品的总价值。 ```java public class PriceVisitor implements Visitor { private double bookPrice; private double foodPrice; private double digitalPrice; private double furniturePrice; @Override public void visit(Book book) { bookPrice += book.getPrice(); } @Override public void visit(Food food) { foodPrice += food.getPrice(); } @Override public void visit(DigitalProduct digitalProduct) { digitalPrice += digitalProduct.getPrice(); } @Override public void visit(Furniture furniture) { furniturePrice += furniture.getPrice(); } public double getBookPrice() { return bookPrice; } public double getFoodPrice() { return foodPrice; } public double getDigitalPrice() { return digitalPrice; } public double getFurniturePrice() { return furniturePrice; } } ``` 客户端代码如下: ```java public class Client { public static void main(String[] args) { List<Product> productList = new ArrayList<>(); productList.add(new Book("Java编程思想", 99.9)); productList.add(new Food("牛肉干", 20.0)); productList.add(new DigitalProduct("iPhone", 5000.0)); productList.add(new Furniture("床", 2000.0)); PriceVisitor priceVisitor = new PriceVisitor(); for (Product product : productList) { product.accept(priceVisitor); } System.out.println("书籍总价值:" + priceVisitor.getBookPrice()); System.out.println("食品总价值:" + priceVisitor.getFoodPrice()); System.out.println("数码产品总价值:" + priceVisitor.getDigitalPrice()); System.out.println("家具总价值:" + priceVisitor.getFurniturePrice()); } } ``` 运行结果如下: ``` 书籍总价值:99.9 食品总价值:20.0 数码产品总价值:5000.0 家具总价值:2000.0 ``` 以上就是访问者模式的一个简单应用,通过统一的Visitor接口和accept方法,实现了不同商品类的访问和操作,从而避免了代码的冗余和重复。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值