面向对象进阶5:类和泛型

内部类

在一个类的内部定义的类,内部类可以访问外部类的成员变量和成员方法,包括私有成员,内部类可以分为成员内部类,局部内部类,静态内部类和匿名内部类

public class InnerClass {
    class InnerC{
        
    }
}

1,成员内部类

定义在类中方法外的类,可以访问外部类的所有成员变量和方法,包括私有的

当一个类只为外部类服务,且在不需要在外部类之外被访问时,可以定义为成员内部类

eg:订单类中的商品,可以单独设置为一个类作为订单中的商品

创建内部类对象:

外部类名.内部类名 对象名 = 外部类对象.new 内部类构造方法

eg:

public class Test {
    public static void main(String[] args) {
        InnerClass test = new InnerClass();
        InnerClass.InnerC testInner = test.new InnerC(1);
    }
}

内部类中隐含了一个外部类的对象:外部类名.this

2,静态内部类

在类中方法外且以static关键字修饰的内部类,可以直接通过外部类的类名访问,并不依赖于外部类的对象

只能访问外部类的静态属性

当一个类只需要访问外部类的静态成员时,可以将其定义为静态的内部类

public class InnerClass {
    public static int s;
    public int b;
    class InnerC {
        public int a;
        public InnerC(int a) {
            this.a = a;
            System.out.println(this.a);
        }

    }
    static class InnerS {
        public static void main(String[] args) {
            System.out.println(s);
        }
    }
}
创建静态内部类对象

格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造方法

public static void main(String[] args) {
    InnerClass test = new InnerClass();
    InnerClass.InnerS tests = new InnerClass.InnerS(11);
}

3,局部内部类

定义在方法中的内部类,只能在方法内部被使用,不能被方法之外的代码访问

public static void main(String[] args) {
    class Innerf{
        int a;
        public void showa(){
            System.out.println(a);
        }
    }
    Innerf innerf = new Innerf();
    innerf.showa();
}
创建局部内部类对象

直接在类之后正常创建对象即可

4,匿名内部类

一种特殊的内部类,没有名字且只能在声明的地方实例化一次

通常用于创建实现某个接口或者继承某个类的对象

创建接口实现类时直接new 接口名(){}即可

一般一个类只需要使用一次时使用

回调方法:一个函数的参数部分传入一个回调接口,当这个函数执行中满足某种条件时候,去调用接口中所实例的方法

eg:

public class Innerclass_test {
    public static void main(String[] args) {
        test1(new Test() {
            @Override
            public void test() {
                
            }
        });
    }

    public static void test1(Test t){
        t.test();
    }
}
interface Test{
    abstract void test();
}

eg:实现一个按钮的点击事件监听器

Object obj = new InnerClass(){
    
};

枚举

枚举是一种特殊的类,默认被final修饰,继承于java.lang.Enum

用于定义一组常量(枚举项),默认被static final修饰

枚举项声明时都是唯一的,且可以通过枚举名访问,

枚举项被定义为枚举类的实例.

枚举类有且仅有一个构造方法,所以如果创建了带参构造方法,必须要给枚举项添加参数

枚举的作用

1,限制变量的取值范围

2,提高代码的可读性和可维护性

3,代替常量集合

4,实现单例模式

eg:

public enum Day {

// 枚举项 : 被定义为枚举类的实例,原理就是⾃定义常量

MONDAY,

TUESDAY,

WEDNESDAY,THURSDAY,

FRIDAY,

SATURDAY,

SUNDAY

}

枚举默认继承Enum类,本质为被final修饰的类

默认被public static final修饰

第一行只能为枚举项,均为常量,且每个常量记住的都是枚举类的一个对象

构造函数只能私有

泛型

一种编程语言特性,允许在定义类和接口或者方法时使用参数化类型

通过使用泛型可以在编译时就检测类型,避免运行时类型错误

通常用在Java的集合类里指定集合中元素类型,提高代码的类型安全性

注意:泛型不支持多态,必须传入完全相同类型

泛型类和泛型接口

在类名后添加<类型参数>,可以在类的成员变量或者方法等地使用

eg: class Test< T >{

​ public test(T input){

}

}

接口同理

泛型方法

在修饰符和返回值类型中间添加<类型参数>

可以在方法的各处使用

通配符

一种特殊的类型参数: ? 表示一种未知的类型

用以处理不确定的类型或者未知类型的情况,让我们的代码更加灵活,处理不同类型的对象和集合

同时提供一定安全性

1,无界通配符:?

匹配任意类型的参数

List<?> list

2,有界通配符:
? extends T

上界通配符:限制在T及T的子类类型

将T作为类型的上界

? super T

下界通配符:限制在T及T的父类类型

将T作为类型的下界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值