面向对象:继承、抽象类、抽象方法、虚方法

1、继承
什么是继承?
目的:代码重用
public class 子类:父类
{

}
父类 基类 被继承的类
子类 派生类 需要继承的类

父类构造函数的继承
创建子类对象时,先调用父类构造函数,再调用子类构造函数
默认调用父类无参构造函数
如果子类有无参构造函数,要求父类也有无参构造函数
如果调用父类的有参构造函数,显式用base调用

public 子类(参数列表)base(实参)
实参:要调用的父类的有参构造函数的参数列表{}

base:父类对象(父类实例)

2.抽象
abstract

抽象方法:访问修饰符 abstract 返回类型 方法名(参数);

抽象方法只是行为的声明,没有方法体,没有具体实现
抽象方法必须在抽象类中定义
抽象方法必须在非抽象子类中实现

抽象类:访问修饰符 abstract class 类名{}

抽象类可以包含抽象方法,和非抽象方法(实现方法,虚方法)
抽象类不能实例化
抽象类中的抽象方法必须在非抽象子类中实现
抽象类通常会被继承(通常在抽象类中写抽象方法只是为了声明一下子类中要实现的方法,方法体写在子类中的重写的方法中)

重写方法:访问修饰符 override 返回类型 方法名(参数){方法体}
子类对父类方法的改写
当重写父类中的方法时要保证方法的签名必须保持一致

3.虚方法:
virtual

继承 重写 定义的位置

实现方法 可以继承 不能重写 任何地方
抽象方法 可以继承 必须重写 抽象类中
虚方法 可以继承 可以重写 除静态类、密封类之外

3.装箱与拆箱

装箱:值类型转换成Object类型或者此值类型所实现的任何接口类型的隐式转换(一定能成功)
操作:在堆中分配一个对象实例,将该值复制到新的对象中(会多占用内存,影响性能)
例子:int i=10;

隐式装箱(可以是隐式的也可以是显式的)
object obj=i;
显示装箱
obj=(obj)i

拆箱:从Object类型到值类型或者此值类型实现的接口类型的隐式转换(不一定成功)
例子:隐式拆箱
int n=(int)obj

装箱拆箱规则:任何值类型都能装箱/拆箱不一定成功
装箱拆箱缺点:影响程序性能

练习:定义形状类,包含计算面积的方法,分别定义一个圆类和矩形类,添加需要的属性和构造函数

代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 继承抽象类和装箱拆箱
{
public abstract class Shapcs//父类
{
public abstract double Sum();
}
public class Yuan : Shapcs
{
public double r;
public Yuan(double r)
{
this.r = r;
}
public Yuan() { }
public override double Sum()
{
return Math.PI * r * r;
}
}
public class Ju : Shapcs
{
public double sid;
public double hid;

public Ju(double sid,double hid)
{
this.sid = sid;
this.hid = hid;
}
public Ju() { }
public override double Sum() {

return sid * hid;
}

}
}

Main方法中调用的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 继承抽象类和装箱拆箱
{
class Program
{
static void Main(string[] args)
{
#region 重写 抽象方法 计算圆和矩形的面积
Yuan y = new Yuan(2.6);
Console.WriteLine(y.Sum());
Ju j = new Ju(5, 6);
Console.WriteLine(j.Sum());
Console.ReadKey();

//Cat ca = new Cat();
//ca.Eat();
//ca.Sleep();
//Console.ReadKey();
//#endregion
}

}
}

时间: 2024-04-13 20:09:29

面向对象:继承、抽象类、抽象方法、虚方法的相关文章

抽象类、虚方法、接口的区别

接口 1.接口只提供方法规约,不提供方法体: 2.接口中的方法不能用关键字修饰: 3.接口里不能有接口和变量: 4.接口里的方法在子类中必须全部实现: 5.接口可以实现多重继承: 抽象类 1.抽象类可以从接口继承: 2.抽象类中的实体方法在子类中不可以重写,只可以被引用: 3.抽象类中的抽象方法不可以有方法体,抽象类中的抽象方法在子类中必须重写: 4.抽象类中的虚方法在子类中可以选择性的重写: 虚方法 1.可以在子类选择性的重写: 2.不重写也可被子类调用: 接口与抽象类的异同 1.抽象类的抽象

对抽象类和虚方法的总结【转】

抽象类定义: 它的作用就是产生子类的同时给于子类一些特定的属性和方法.abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其他类的基类.标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现. 特性:1.抽象类不能被实例化:2.抽象类可以包含抽象方法和抽象访问器:3.不能用sealed修饰符修改抽象类,这意味着抽象类不能被继承:4.从抽象类派生的飞抽象类必须包括继承的所有抽象方法和抽象访问器的实现. 总结:~抽象方法是隐

c#多态之抽象类与虚方法的异同点~

多态之抽象类与虚方法的相似点及不同点 : 不同点 1.方法关键字不一样 虚方法的方法关键字是:virtual. 抽象类的方法关键词是:abstract 2.基类的方法是否有方法体/实现 虚方法的方法:声明并实现方法. 抽象类的方法:只作声明,无方法体/无实现. 共同点 1.子类/派生类都要重写父类的方法:关键字overcode 其他的暂时未想到,笔记先分享到这里!欢迎各位大神评论.纠错.及补充!O(∩_∩)O谢谢.

C#面向对象的基本概念 (Basic C# OOP Concept) 第三部分(多态,抽象类,虚方法,密封类,静态类,接口)

9.多态 Ploy的意思就是多于一种形式.在文章开始,方法那一章节就已经接触到了多态.多个方法名称相同,而参数不同,这就是多态的一种. 方法重载和方法覆盖就是用在了多态.多态有2中类型,一种是编译时多态,一种是运行时多态. 方法重载: 方法重载就是,多个方法拥有相同的方法名称,而参数个数或类型不同. 下面就是一个多态的例子,可以看到方法名称“BedRoom”被用到了2个方法中,就是2个方法有共同的方法名称"BedRoom",但是2个方法的参数是不同的. 1 class HouseOwn

C#基础-接口 抽象方法 虚方法

一:接口 1:类是单继承,接口是多继承. 2:接口中不能有属性,不能有方法体. 3:接口不能被实例化,只能被继承. 4:接口中的所有定义,必须在子类中全部实现. 二:抽象方法 1:含有抽象方法的类,是抽象类. 2:抽象类不能被实例化,只能被继承. 3:抽象方法不能有方法体. 4:抽象方法必须在子类中重写. 5:抽象类可以包含功能实现. 6:抽象方法是可以看成是没有实现体的虚方法 三:虚方法 1:虚方法必须有方法体,可以被重写. 2:修饰方法.属性.索引器或事件

对抽象类和虚方法的区别

抽象类定义:它的作用就是产生子类的同时给于子类一些特定的属性和方法.abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其他类的父类.标记为抽象或包含在抽象类中的成员必须通过从抽象类的子类来实现. 特性:1.抽象类不能被实例化:2.抽象类可以包含抽象方法和抽象访问器:3.不能用sealed修饰符修饰:4.从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现. 总结:~抽象方法是隐式的虚方法:~只容许在抽象类中使用抽

抽象类和虚方法、base关键字

微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members 抽象类和类成员 通过在类定义前面放置关键字 abstract,可以将类声明为抽象类. 例如: public abstract class A { // Class members here. } 抽象类不能实例化. 抽象类的

Java 面向对象编程 抽象类 抽象方法 abstract

抽象类 通过abstract定义的方法是抽象方法,它只有定义,没有实现.抽象方法定义了子类必须实现的接口规范: 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法: 如果不实现抽象方法,则该子类仍是一个抽象类: 面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现. 如果父类的方法本身不需要实现任何功能 ,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法.声明关键词abstract abstract class Pers

C#继承,重写虚方法的使用笔记

一,如下例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DemoTest { class Program { static void Main(string[] args) { B a = new B(); } } public class A { public A() { Say(); } protected virtual void Say()

继承小试牛刀:虚方法virtual

#include<iostream>using namespace std;class Point{public:    Point(double a=0,double b=0):xx(a),yy(b){}   virtual double x(){return xx;}   virtual double y(){return yy;}private:    double xx,yy;};class t_Point :public Point{public:    t_Point(double