首页 > 编程语言 >C#与Java的继承与实现上的差异

C#与Java的继承与实现上的差异

时间:2024-02-27 10:14:03浏览次数:27  
标签:调用 Java C# double 继承 public 构造函数

虽然 C# 和 Java 都支持继承和接口实现这两种面向对象编程的基本概念,但它们在一些细节上有一些差异。

继承(Inheritance)

  1. 单继承 vs 多继承

    • C# 支持单继承,一个类只能直接继承自一个父类。
    • Java 也支持单继承,一个类只能直接继承自一个父类。
  2. 基类构造函数的调用

    • 在 C# 中,如果子类没有显式调用基类构造函数,将自动调用基类的无参数构造函数。如果需要显式调用基类的构造函数,可以使用 base 关键字。
    • 在 Java 中,子类构造函数总是会调用父类的构造函数,如果没有显式调用,将调用父类的无参数构造函数。如果需要显式调用父类的构造函数,可以使用 super 关键字。
  3. 构造函数的调用顺序

    • 在 C# 中,构造函数的调用顺序是自底向上的,即先调用基类的构造函数,然后再调用子类的构造函数。
    • 在 Java 中,构造函数的调用顺序是自顶向下的,即先调用父类的构造函数,然后再调用子类的构造函数。

代码对比:

C# 中的继承

using System;

class Animal
{
    public virtual void Sound()
    {
        Console.WriteLine("Animal makes a sound");
    }
}

class Dog : Animal
{
    public override void Sound()
    {
        Console.WriteLine("Dog barks");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Dog dog = new Dog();
        dog.Sound(); // 输出 "Dog barks"
    }
}

Java 中的继承

class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sound(); // 输出 "Dog barks"
    }
}

接口实现(Implementation)

  1. 默认方法

    • 在 Java 8 中,接口可以包含默认方法,这是一种在接口中提供默认实现的方式,可以减少实现接口的类的代码量。
    • 在 C# 中,接口不支持默认方法,所有的接口方法都需要在实现类中提供具体的实现。
  2. 方法签名

    • 在 Java 中,接口方法默认是公共的抽象方法,实现类必须提供具体实现。
    • 在 C# 中,接口方法默认是公共的虚方法,实现类可以选择重写这些方法,也可以选择不重写。
  3. 多继承

    • 在 Java 中,类只能继承自一个类,但可以实现多个接口。
    • 在 C# 中,类只能继承自一个类,并且可以实现多个接口。

代码对比

C# 中的接口实现

using System;

interface IShape
{
    double GetArea();
}

class Rectangle : IShape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public double GetArea()
    {
        return Width * Height;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Rectangle rectangle = new Rectangle { Width = 5, Height = 10 };
        Console.WriteLine("Area of rectangle: " + rectangle.GetArea()); // 输出 "Area of rectangle: 50"
    }
}

Java 中的接口实现

interface IShape {
    double getArea();
}

class Rectangle implements IShape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }
}

public class Main {
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle(5, 10);
        System.out.println("Area of rectangle: " + rectangle.getArea()); // 输出 "Area of rectangle: 50.0"
    }
}

标签:调用,Java,C#,double,继承,public,构造函数
From: https://www.cnblogs.com/mozziemy/p/18036275

相关文章

  • CF776D(并查集思想)
    难度1em还是一道比较套路的题目。观察发现,如果当\(r_{i}=1\)时他的两把钥匙状态是相同的,当\(r_{i}=0\)时他的两把钥匙状态是不同的,对于这种相同不同的问题可以考虑并差集,状态一样就一样的并在一起,否则就把不一样的并在一起所以以后看见这些问题(a=b+k,a=!b,a=b)都可以用带权并查......
  • Leetcode 53. 最大子数组和
    题目给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。输入输出样例输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。输入:nums=[1]输出:1输入:nums......
  • C#使用sapnoc类库SAPRFC接口调用
     使用NuGet引用sapnoc程序包来进行RFC接口的连接,类库框架为framework,暂不支持.netCore框架,会提示冲突。    编写SapRfcHelper帮助类供接口的连接调用using SAP.Middleware.Connector;using System;using System.Collections.Generic;using ......
  • abc305_f (构造实现)
    首先考虑正常的怎么做,就是一遍dfs,是\(O(n)\)的,然而这题在到达每一个点时都要输出它的下一个点才能到达下一个点,同时看到这个\(2n\)觉得不对劲,自然想到走过去走回来,耗2n代码实现还是有点东西的,走过去好搞,但走回来时怎么办呢。我们想到dfs是一个栈,所以在要退出时输出就可以了#inc......
  • ABC283E (dp思想)
    难度1这题看到一点思路也没有,但是看到最小操作数想到二分,dp和贪心,二分答案的check显然不会,贪心不会。发现对于一行,前面的\(i-2\)是不会影响的,这一行也不会影响后面的\(i+2\)行,所以是dp。考虑如何设计状态因为\(i-1\)和\(i+1\)行都会影响,所以设计出来一个dp[i][0/1][0/1][0/1]的东......
  • 多线程系列(十) -ReadWriteLock用法详解
    一、摘要在上篇文章中,我们讲到ReentrantLock可以保证了只有一个线程能执行加锁的代码。但是有些时候,这种保护显的有点过头,比如下面这个方法,它仅仅就是只读取数据,不修改数据,它实际上允许多个线程同时调用的。publicclassCounter{privatefinalLocklock=newReentra......
  • 机器学习策略篇:详解单一数字评估指标(Single number evaluation metric)
    单一数字评估指标无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现,如果有一个单实数评估指标,进展会快得多,它可以快速告诉,新尝试的手段比之前的手段好还是差。所以当团队开始进行机器学习项目时,经常推荐他们为问题设置一个单实数评估指标。......
  • 【13.0】JavaScript之流程控制
    【一】if判断【1】语法//if-elseif(条件){条件成立执行的代码块}else{条件不成立时执行的代码块}//if-elseif-elseif(条件){条件成立执行的代码块}elseif(条件){条件成立执行的代码块}else{条件不成立时执行的代码块}//()条件{}执行的代码块【2】if~e......
  • CF1928C (数学思想)
    难度3其实是有点虚高的,可能是我这种数学题做的少了。在考试时式子都写出来了,但不知道怎么处理。然后注意一下细节就可以了。懒懒懒。对于xy=k(k为常数)可以直接枚举k的因子,然后看一下限制条件即可。#include<bits/stdc++.h>usingnamespacestd;longlongT,n,x,tot=0;unorde......
  • 【16.0】JavaScript之对象
    【一】对象js中的对象是无序的属性集合我们可以把js中的对象想象成键值对,其中值可以是数据或者函数特征-在对象中属性表示行为-在对象中用方法表示可以看成Python中的字典,但是在JS中的自定义对象要比Python里面的字典操作起来更方便【二】对象创建【1】对象字面量(Objec......