songboyao-java-多态和泛型

本文深入探讨了面向对象的三大特性——继承、封装和多态,特别是多态的概念、实现及其优缺点。强调了多态在提高代码扩展性方面的价值,同时也指出其限制了对子类特有内容的访问。此外,文章还介绍了泛型的重要性,解释了泛型如何确保集合类型的类型安全,并通过示例展示了泛型在类、方法和接口中的应用。泛型提高了代码的类型安全性,允许在编译时进行类型检查,减少了运行时错误。
摘要由CSDN通过智能技术生成

多态

面向对象三大特性: 继承, 封装, 多态

定义
多态: 是指同一行为,对于不同的对象具有多个不同表现形式。
程序中多态: 是指同一方法,对于不同的对象具有不同的实现

前提条件【重点】

  • 继承或者实现【二选一】
  • 父类引用指向子类对象\接口引用指向实现类对象【格式体现】
  • 方法的重写【意义体现:不重写,无意义】

多态的体现:父类的引用指向它的子类的对象:

父类类型 变量名 = new 子类对象;
变量名.方法名();

父类类型:指子类对象继承的父类类型,或者实现的父接口类型。
多态的好处和弊端
好处

提高了代码的扩展性
弊端

多态的情况下,只能调用父类的共性内容,不能调用子类的特有内容。
无法访问子类独有的方法或者成员变量,因为多态成员访问的特点是,编译看父类

引用类型转换
向上转型
  • 子类类型向父类类型向上转换的过程,这个过程是默认的。
 Aniaml anl = new Cat(); 
向下转型
  • 父类类型向子类类型向下转换的过程,这个过程是强制的。
 Aniaml anl = new Cat();  
 Cat c = (Cat)anl;//向下转型

泛型

为什么要使用泛型?
集合不使用泛型的时候,存的时候什么类型都能存(Object)。但是取的时候(Object)就懵逼了。取出来啥也不是。
使用泛型在编译期直接对类型作出了控制,只能存储泛型定义的数据
泛型: 定义的时候表示一种未知的数据类型,在使用的时候确定其具体的数据类型。
泛型的作用是在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

定义和使用含有泛型的类

定义格式:

修饰符 class 类名<代表泛型的变量> {  }
代表泛型的变量: 可以是任意字母  例如: T,E...

泛型在定义的时候不具体类型,使用的时候才具体类型。在使用的时候确定泛型的具体数据类型。

// 泛型类
class ArrayList<E>{ 
	// 参数是泛型
    public boolean add(E e){ }
	// 返回值是泛型
    public E get(int index){ }
   	....
}
确定泛型具体类型

在创建对象的时候确定泛型
例如,ArrayList<String> list = new ArrayList<String>();

此时,变量E的值就是String类型,那么我们的类型就可以理解为

class ArrayList<String>{ 
     public boolean add(String e){ }

     public String get(int index){  }
     ...
}

定义含有泛型的类


public class MyList<E>{
    E e;
    public E func(E e){
        return e;
    }

    public static void main(String[] args) {
        MyList<String> myList = new MyList<>();
        // 属性赋值
        myList.e = "哈哈";
        System.out.println(myList.e );
        System.out.println(myList.func("呵呵"));
        MyList<Integer> myList2 = new MyList<>();
        // 属性赋值
        myList2.e = 666;
        System.out.println(myList2.e );
        System.out.println(myList2.func(888));
    }
}

定义和使用含有泛型的方法

格式

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }
  • 调用方法时,确定泛型的类型
public class Test {
    // 修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }

    public static <T> T func1(T t){
        return t;
    }

    public static void main(String[] args) {
       Integer i =  func1(100);
        System.out.println(i);
        String s =  func1("2222");
        System.out.println(s);

    }
}
定义含有泛型的接口
修饰符 interface接口名<代表泛型的变量> {  }
public interface IA <E>{
    public abstract void m1(E e);
    public default E m2(E e){
        return e;
    }
}
public class ImplA<E> implements IA<E>{

    @Override
    public void m1(E e) {

    }

    @Override
    public E m2(E e) {
        return e;
    }

    public static void main(String[] args) {
        // 使用时确定泛型
        ImplA<String> implA = new ImplA<>();
        implA.m1("哈哈");
        System.out.println(implA.m2("嘻嘻"));
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值