接口和父类具有同名属性、方法重载

本文探讨了Java中接口与父类属性冲突的解决办法、方法重载的规则及特殊情况,特别是泛型方法在参数类型擦除后的处理方式。通过实例说明了如何正确实现方法重载以及在使用泛型时可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.ArrayList;
import java.util.List;

/**1.当接口和父类中具有相同的属性名,而自己没有这个变量又需要使用时,需要指定具体使用父类中的成员变量还是接口中的成员变量
 * 2.方法前面只考虑方法的名称、参数类型、参数个数、参数顺序, 不考虑方法的返回类型。 也就是说不能用返回类型来区分重载方法
 * 3. 泛型作为方法的参数时,会进行类型的擦除。 例如 List<String> 和 List<Integer>对方法计算签名来说,其和List是一样的作用
 * 4. 重载的两个方法参数一个类型父类类型,一个为子类类型, 则在方法调用时传入声明类型和实际类型都为子类类型的实参时,会抱编译错误,
 *    因为两个重载的方法都能匹配这个调用。 也就是说调用重载方法时,实参可以自动匹配形参为父类类型的方法。
 * Created by liaoqianwen on 2016/7/6.
 */
public class InterfaceExtendsTest {
    public static void main(String[] args){
        List list = new ArrayList<>();
        ArrayList list2 = new ArrayList<>();
        FanXingTest obj = new FanXingTest();
        obj.func(list);
//        obj.func(list2);  
    }
}


interface Jiekou{
    static final int a =100;

    public void func1();
}

class Class2 {
    static final int a =1000;
    static {
        int c = 2;
        bb =200;
    }
    static int b = 1;
    static int bb =2;
}
class Class1 extends Class2 implements Jiekou{

    public void func1(){
        System.out.println(Class2.a);
    }
}

// 泛型测试
class FanXingTest{
    public String func(List<String> list){
        System.out.println("String");
        return "liao";

    }

    public boolean func(ArrayList<Integer> list){
        System.out.println("boolean");
        return true;

    }
}

### 方法重载与继承的关系及用法 #### 1. 方法重载的概念 方法重载是指在一个中定义多个同名方法,但这些方法的参数列表(包括参数的数量、型或顺序)必须有所不同。这种方法允许多种操作具有相同的名称,从而提高代码的可读性灵活性[^3]。 #### 2. 继承的概念 继承是一种机制,允许一个(子)从另一个父类)派生属性行为。通过继承,子可以获得父类的所有公共成员,并可以选择性地覆盖某些方法以提供特定的功能实现[^2]。 #### 3. 方法重载与继承的关系 在继承体系中,方法重载继承可以共同作用于同一个层次结构中。虽然方法重载发生在单个内部,但它也可以被子继承并扩展。如果子需要在其上下文中支持更多变体的操作,则可以通过新增重载版本来增强功能而不影响原有逻辑。 #### 4. 使用场景分析 以下是几种典型的应用场景: - **数据处理多样化需求** 当某个基提供了基本的数据计算能力时,其衍生出来的具体业务可能会要求针对不同型输入做相应调整。此时利用方法重载可以让接口保持一致的同时满足不同型的运算请求。 - **UI组件定制化开发** 假设有一个通用按钮控件Button,在实际项目里往往希望给开发者提供更多选项去初始化实例比如颜色配置字体大小等等。那么就可以借助构造器或者设置函数的形式来进行多重签名的设计以便适应各种情况下的创建需求。 #### 5. 示例代码展示 下面给出一段基于上述理论的实际编码例子说明两者配合使用的技巧: ```csharp // 定义基础数学工具库 public class BaseMath { // 提供简单的加法操作作为默认实现 public virtual double Calculate(double num){ return num * 2; } } // 扩展高级版计算器 支持额外算法 public class AdvancedMath : BaseMath{ // 对Calculate 进行覆写 添加新的逻辑流程 override public double Calculate(double num){ Console.WriteLine("Using advanced calculation..."); return base.Calculate(num)+num/2 ; } // 同时引入方法重载 来适配更复杂的入参情形 public double Calculate(double numA,double numB ){ return (this.Calculate(numA)* this.Calculate(numB))/100; } } ``` 在这个案例里面我们先建立了一个名为`BaseMath`的基础抽象层用于表达最基本的数值变换规则;随后又构建起它的后代——即更加智能化也更具针对性解决复杂问题导向型实体对象 `AdvancedMath`. 不仅如此还巧妙运用到了虚方法以及最终达成目的的关键技术点就是那个神奇而又强大的**method overloading**, 让整个解决方案既简洁明了又能很好地应对未来可能出现的变化趋势. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值