13.面向对象高级三

一、内部类

类的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。

场景:当一个类的内部,包含了一个完整事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

public class Car{
   //内部类
   public class Engine{
  }
}

1.成员内部类

就是类中的一个普通成员,类似于前面学到的普通成员变量、成员方法。

public class Outer{
   //成员内部类
   public class Inner{
  }
}

成员内部类如何创建对象

Outer.Inner in = new Outer().new Inner();//先new外部类对象,再new内部类对象
in.test();

成员内部类中访问其他成员的特点

1.和前面学到的实例方法一样,成员内部类的实例方法中,同样可以直接访问外部类的实例成员、静态成员。

2.可以在成员内部类的实例方法中,拿到当前外部类对象,格式为:外部类名.this

2.静态内部类

有static修饰的内部类,属于外部类自己持有

public class Outer{
   //静态内部类
   public static class Inner{
  }
}

静态内部类如何创建对象

Outer.Inner in = new Outer.Inner();

静态内部类中访问其他成员的特点

可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。

3.局部内部类(了解即可)

定义在方法中、代码块中、构造器等执行体中

4.匿名内部类(重点)

一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。

new 类或接口(参数值…){
  类体(一般是方法重写);
};
//匿名内部类:把这个匿名内部类先编译成一个子类,然后回立即创建一个子类对象
Animal a = new Animal(){
   @Override
   public void cry() {
     System.out.println("猫喵喵喵的叫");
  }
};
a.cry();

匿名内部类的特点:

匿名内部类本质就是一个子类,并会立即创建出一个子类对象。

匿名内部类有啥作用,应用场景:

可以更方便的创建出一个子类对象;匿名内部类通常作为一个参数传递给方法。

二、枚举

枚举是一种特殊类

修饰符 enum 枚举类名{
   名称1,名称2,名称3,……;
   其他成员……;
}

public enum A{
   X,Y,Z;
   ……;
}

注意:

枚举中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。

这些名称,本质是常量,每个常量都会记住枚举类的一个对象。

枚举的特点

1.枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。

2.枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。

3.枚举都是最终类(final),不可以被继承。

4.枚举类中,从第二行开始,可以定义类的其他各种成员。

5.编译器为枚举类新增了几个方法,并且枚举都是继承类。

抽象枚举:

public enum B {
X(){
   @Override
   public void go() {
   }
},
Y(){
   @Override
   public void go(){
   }
};

//有参、无参构造器;get、set方法……

三、泛型

定义类、接口、方法时,同时声明了一个或者多个类型变量(如<E>),称为泛型类、泛型接口、泛型方法,统称泛型。

//泛型类
public class ArrayList<E>{
……
}

//泛型接口
public interface A<E>{
……
}

//泛型方法
public static <T> T test(T t){
……
}

作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力,这样可以避免强制类型转换,及其可能出现的异常。

泛型的本质:把具体的数据类型作为参数传给类型变量。

//通配符(?):在使用泛型的时候可以代表一切类型
public static void go(ArrayList<?> cars){
……
}

//上限:(? extends Car):?能接收的必须是Car或者其子类
public static void go(ArrayList<? extends Car> cars){
……
}

//下限:(? super Car):?能接收的必须是Car或者其父类
public static void go(ArrayList<? super Car> cars){
……
}

泛型的注意事项

1.泛型只在编译阶段显示,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。

2.泛型不支持基本数据类型,只能支持对象类型(引用数据类型)

int—Integer、double—Double

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值