您的问题似乎不完整,将对C可能是指对某个概念、技术或问题的解释或讨论。请提供更多的上下文或具体信息,这样我才能更好地理解和回答您的问题。
- 内容介绍
- 文章标签
- 相关推荐
本文共计1420个文字,预计阅读时间需要6分钟。
面向对象三要素:封装、继承、多态。封装和继承相对容易理解,但多态的概念稍显复杂。今天,我们就来讲解多态的理解。
多态是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。简单来说,就是同一个方法名对应不同的方法实现。
在Java中,多态的实现主要依靠继承和接口。当一个子类继承了父类,并且重写了父类的方法时,这个方法在子类中就具有了多态性。
例如,有一个动物类Animal,它有一个方法叫makeSound()。现在我们有两个子类,分别是Dog和Cat,它们都继承了Animal类,并且都重写了makeSound()方法。
class Animal { public void makeSound() { System.out.println(动物叫); }}
class Dog extends Animal { @Override public void makeSound() { System.out.println(狗叫); }}
class Cat extends Animal { @Override public void makeSound() { System.out.println(猫叫); }}
public class Main { public static void main(String[] args) { Animal dog=new Dog(); Animal cat=new Cat();
dog.makeSound(); // 输出:狗叫 cat.makeSound(); // 输出:猫叫 }}
在这个例子中,我们创建了两个Animal对象,分别是dog和cat。虽然它们都是Animal类型,但调用makeSound()方法时,会根据对象的实际类型调用对应的方法,从而实现多态。
总结一下,多态使得我们可以在不知道具体对象类型的情况下,通过对象类型来调用方法,提高了代码的灵活性和可扩展性。
面向对象三要素:封装、继承、多态。
封装和继承,这两个比较好理解,但要理解多态的话,可就稍微有点难度了。今天,我们就来讲讲多态的理解。
我们应该经常会看到面试题目:请谈谈对多态的理解。
其实呢,多态非常简单,就一句话:调用同一种方法产生了不同的结果。
具体实现方式有三种。
一、重载
重载很简单。
public string GetValue(string x) { return x; } public string GetValue(string x, string y) { return x+y; } //调用 string myValue=GetValue("测试"); string myValue2=GetValue("测试","方法");//调用了GetValue同一种方法,只是多了个参数,但还是算得上“同一种方法”。
二、重写父类中的虚方法
public class BaseClass { public virtual void GetValue() //virtual关键字,供后面的子类重写该方法 { Console.WriteLine("这是个虚方法"); } } public class MyClass: BaseClass { public override void GetValue() { Console.WriteLine("MyClass重写了基类的虚方法"); } } public class NewClass: BaseClass { public override void GetValue() { Console.WriteLine("NewClass重写了基类的方法"); } } public class Program { static void Main() { BaseClass baseClass=new BaseClass(); MyClass myClass=new MyClass(); NewClass newClass=new NewClass(); //在这里你会无意间想到一句很经典的话:不同的对象调用了同一种方法产生了不同的行为 baseClass.GetValue();//这是个虚方法 myClass.GetValue();//MyClass重写了基类的虚方法 newClass.GetValue();//NewClass重写了基类的方法 } }
关于继承,还是要谈一下is和as运算符的
我们都知道,所有的类都是默认继承System.Object这个类的,也就是说所有的类都可以转化为Object。子类可以转换为父类,毕竟子类就属于父类。
在上面这个例子,MyClass类是继承BaseClass类的,也就是说MyClass可以转为BaseClass。可能,我们会想到强制转换 baseClass=(BaseClass)myClass,这样做是可以的,但如果myClass继承的不是BaseClass则会抛出异常,这样不好。这时,应该用as与is运算符,BaseClass baseClass = myClass as BaseClass,这句话,如果运行出错的话,会将null赋值给baseClass,也就是说,在使用baseClass这个对象之前,我们只需判断是否为空就行了。
MyClass myClass = new MyClass(); BaseClass baseClass = myClass as BaseClass;//即使转换的不会,只会将null赋值给baseClass,不会抛出异常。 if (baseClass != null)//只需判断一下是否为空即可 { baseClass.GetValue(); } if(myClass is baseClass) { Console.WriteLine("myClass是属于baseClass的"); }
三、实现抽象类中的方法,也是使用的override关键字
老生常谈,抽象类是不可以实例化的,抽象类的目的就是为了让其他类继承,而且只能继承一个类,如果想要实现多重继承,便诞生了接口。
public abstract class BaseClass { public abstract void GetValue();//抽象方法,不能有方法实体 public void GetValue2() { Console.WriteLine("实体方法");//抽象类可以有实体方法,抽象类是不可以实例化的,但他的子类的实例可以调用这个方法 } } public class MyClass: BaseClass { public override void GetValue() { Console.WriteLine("MyClass重写了基类的虚方法"); } } public Class NewClass: BaseClass { public override void GetValue() { Console.WriteLine("NewClass重写了基类的方法"); } } public class Program { static void Main() { MyClass myClass=new MyClass(); NewClass newClass=new NewClass(); myClass.GetValue(); myClass.GetValue2();//子类的实例可以调用这个方法 newClass.GetValue(); } }
总结
注意点:
1、好好体会多态的实现,渐渐地会发现面向对象程序设计的魅力。
2、抽象类的目的就是为了继承,想要实现多重继承,就需要接口了。
3、抽象类不可以实例化,它是可以有实体方法的,继承这个抽象类的实例可以调用抽象类里面的实体方法。
4、会熟练使用is和as运算符,不要一味地使用强制转换
以上就是对C# 多态的理解的详细内容,更多关于C# 多态的理解的资料请关注易盾网络其它相关文章!
本文共计1420个文字,预计阅读时间需要6分钟。
面向对象三要素:封装、继承、多态。封装和继承相对容易理解,但多态的概念稍显复杂。今天,我们就来讲解多态的理解。
多态是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。简单来说,就是同一个方法名对应不同的方法实现。
在Java中,多态的实现主要依靠继承和接口。当一个子类继承了父类,并且重写了父类的方法时,这个方法在子类中就具有了多态性。
例如,有一个动物类Animal,它有一个方法叫makeSound()。现在我们有两个子类,分别是Dog和Cat,它们都继承了Animal类,并且都重写了makeSound()方法。
class Animal { public void makeSound() { System.out.println(动物叫); }}
class Dog extends Animal { @Override public void makeSound() { System.out.println(狗叫); }}
class Cat extends Animal { @Override public void makeSound() { System.out.println(猫叫); }}
public class Main { public static void main(String[] args) { Animal dog=new Dog(); Animal cat=new Cat();
dog.makeSound(); // 输出:狗叫 cat.makeSound(); // 输出:猫叫 }}
在这个例子中,我们创建了两个Animal对象,分别是dog和cat。虽然它们都是Animal类型,但调用makeSound()方法时,会根据对象的实际类型调用对应的方法,从而实现多态。
总结一下,多态使得我们可以在不知道具体对象类型的情况下,通过对象类型来调用方法,提高了代码的灵活性和可扩展性。
面向对象三要素:封装、继承、多态。
封装和继承,这两个比较好理解,但要理解多态的话,可就稍微有点难度了。今天,我们就来讲讲多态的理解。
我们应该经常会看到面试题目:请谈谈对多态的理解。
其实呢,多态非常简单,就一句话:调用同一种方法产生了不同的结果。
具体实现方式有三种。
一、重载
重载很简单。
public string GetValue(string x) { return x; } public string GetValue(string x, string y) { return x+y; } //调用 string myValue=GetValue("测试"); string myValue2=GetValue("测试","方法");//调用了GetValue同一种方法,只是多了个参数,但还是算得上“同一种方法”。
二、重写父类中的虚方法
public class BaseClass { public virtual void GetValue() //virtual关键字,供后面的子类重写该方法 { Console.WriteLine("这是个虚方法"); } } public class MyClass: BaseClass { public override void GetValue() { Console.WriteLine("MyClass重写了基类的虚方法"); } } public class NewClass: BaseClass { public override void GetValue() { Console.WriteLine("NewClass重写了基类的方法"); } } public class Program { static void Main() { BaseClass baseClass=new BaseClass(); MyClass myClass=new MyClass(); NewClass newClass=new NewClass(); //在这里你会无意间想到一句很经典的话:不同的对象调用了同一种方法产生了不同的行为 baseClass.GetValue();//这是个虚方法 myClass.GetValue();//MyClass重写了基类的虚方法 newClass.GetValue();//NewClass重写了基类的方法 } }
关于继承,还是要谈一下is和as运算符的
我们都知道,所有的类都是默认继承System.Object这个类的,也就是说所有的类都可以转化为Object。子类可以转换为父类,毕竟子类就属于父类。
在上面这个例子,MyClass类是继承BaseClass类的,也就是说MyClass可以转为BaseClass。可能,我们会想到强制转换 baseClass=(BaseClass)myClass,这样做是可以的,但如果myClass继承的不是BaseClass则会抛出异常,这样不好。这时,应该用as与is运算符,BaseClass baseClass = myClass as BaseClass,这句话,如果运行出错的话,会将null赋值给baseClass,也就是说,在使用baseClass这个对象之前,我们只需判断是否为空就行了。
MyClass myClass = new MyClass(); BaseClass baseClass = myClass as BaseClass;//即使转换的不会,只会将null赋值给baseClass,不会抛出异常。 if (baseClass != null)//只需判断一下是否为空即可 { baseClass.GetValue(); } if(myClass is baseClass) { Console.WriteLine("myClass是属于baseClass的"); }
三、实现抽象类中的方法,也是使用的override关键字
老生常谈,抽象类是不可以实例化的,抽象类的目的就是为了让其他类继承,而且只能继承一个类,如果想要实现多重继承,便诞生了接口。
public abstract class BaseClass { public abstract void GetValue();//抽象方法,不能有方法实体 public void GetValue2() { Console.WriteLine("实体方法");//抽象类可以有实体方法,抽象类是不可以实例化的,但他的子类的实例可以调用这个方法 } } public class MyClass: BaseClass { public override void GetValue() { Console.WriteLine("MyClass重写了基类的虚方法"); } } public Class NewClass: BaseClass { public override void GetValue() { Console.WriteLine("NewClass重写了基类的方法"); } } public class Program { static void Main() { MyClass myClass=new MyClass(); NewClass newClass=new NewClass(); myClass.GetValue(); myClass.GetValue2();//子类的实例可以调用这个方法 newClass.GetValue(); } }
总结
注意点:
1、好好体会多态的实现,渐渐地会发现面向对象程序设计的魅力。
2、抽象类的目的就是为了继承,想要实现多重继承,就需要接口了。
3、抽象类不可以实例化,它是可以有实体方法的,继承这个抽象类的实例可以调用抽象类里面的实体方法。
4、会熟练使用is和as运算符,不要一味地使用强制转换
以上就是对C# 多态的理解的详细内容,更多关于C# 多态的理解的资料请关注易盾网络其它相关文章!

