《.NET程序员面试秘笈》----面试题12 访问关键字this和base有什么作用

简介: 【考点】this的理解,base的理解。

本节书摘来自异步社区《.NET程序员面试秘笈》一书中的第1章,面试题12,作者: 张云翯, 更多章节内容可以访问云栖社区“异步社区”公众号查看。

面试题12 访问关键字this和base有什么作用

.NET程序员面试秘笈
【考点】this的理解,base的理解。

【出现频率】

【解答】

this关键字用于引用类的当前实例。base关键字用于派生类访问基类成员。

为了说明this和base在类中的具体应用,在ch01目录下新建一个程序文件,并命名为This.cs,编写代码如程序1.13所示。

程序1.13 this和base示例:This.cs

  using System;

  class This
  {
    static void Main()
    {
      Console.WriteLine("请输入书名:");
      string inputA = Console.ReadLine();
      Console.WriteLine("请输入作者:");
      string inputB = Console.ReadLine();
      //将用户输入的2个字符串传递给构造函数,创建Book类的实例bk
      Book bk = new Book(inputA, inputB);     
      //调用bk实例的getbook方法,并输出
      Console.WriteLine(bk.getbook());
      //创建PCBook类的实例pcbk
      PCBook pcbk = new PCBook();
      //调用pcbk实例的words方法
      pcbk.words();
    }
  }

  class Book              //声明Book类
  {
    private string _name;
    private string _author;
    internal Book()          //编写默认构造函数
    {
      Console.WriteLine("\n书是人类进步的阶梯!");
    }
    internal Book(string n, string a)   //编写重载构造函数
    {
      this._name = n;
      this._author = a;
    }
    internal string getbook()      //定义getbook方法
    {
       //拼接字符串,访问当前实例的Name属性,并调用Tool类的静态add方法,当前实例作为参数
      string booktxt = "\n【BookName】" + this.Name + "【Author】"+ Tool.add(this);    
      return booktxt;
    }
    internal string Name
    {
      get
      {
        return _name;
      }
    }
    internal string Author
    {
      get
      {
        return _author;
      }
    }
    internal virtual void words()     //定义words虚方法
    {
      Console.WriteLine("\n知识就是力量!");
    }
  }
  static class Tool
  {
    internal static string add(Book b)  //定义静态方法add,接收参数为Book类型
    {
      return b.Author;    
    }
  }
  class PCBook : Book         //声明PCBook类,继承Book类
  {
    internal PCBook() : base()    //默认构造函数预先调用基类默认构造函数
    {
      Console.WriteLine("来买计算机书籍吧!");
    }
    internal override void words()
    {
      base.words();        //调用基类的words虚方法 
      Console.WriteLine("计算机知识也是力量!");
    }
  }

在命令行下编译This.cs后,执行This程序,其效果如图1.19所示。


dffbc23959f0905c96ab636ef4dfcbd2fd755f41

本例展示了this和base在类中的应用,其程序工作步骤如下所示。

(1)主程序中接收了用户输入的两个值(书名和作者),然后将这两个值传递给Book类的构造函数,创建实例bk。这个步骤中,bk对象的_name字段和_author字段被赋予了新值,可见,this的作用即引用当前的实例对象,其代码如下:

this._name = n;         //n为构造函数接收的第1个字符串参数
this._author = a;        //a为构造函数接收的第2个字符串参数

(2)调用bk对象的getbook方法,其方法体调用了Tool类的静态方法add静态方法,并通过this向其传递当前实例。getbook方法实际执行代码如下:

//Tool.add(this)返回当前实例的Author属性
string booktxt = "\n【BookName】" + this.Name + "【Author】"+ this.Author; 
//本方法最终返回booktxt变量
return booktxt;

(3)创建PCBook类的实例pcbk,由于其默认构造函数将通过base调用基类的默认构造函数,所以创建pcbk的实例将执行以下代码:

Console.WriteLine("\n书是人类进步的阶梯!");    //通过base()调用基类的默认构造函数
Console.WriteLine("来买计算机书籍吧!");      //PCBook类的默认构造函数的函数体

(4)pcbk调用words方法,PCBook类的words方法继承并重写了Book类的words方法。PCBook类的words方法体中通过base.words(),调用了基类的words方法(未被重写)。所以pcbk对象的words方法实际执行代码如下:

Console.WriteLine("\n知识就是力量!");       //通过base.words()调用基类的words方法
Console.WriteLine("计算机知识也是力量!");

【分析】

在面向对象的编程中,this访问关键字使用非常频繁,其中文意思为“这个”,非常形象地描述了this关键字的作用。类通过创建实例执行具体的任务,而类体代码中的this用于引用类的当前实例。相应地,静态成员和实例无关,所以静态成员中不能使用this。

注意:
this仅限于构造函数和方法成员中使用。
base访问关键字可用于访问基类成员,即基类被重写的方法和基类的构造函数。由于派生类继承了所有的基类成员,所以一般的基类成员可直接访问,但是基类被重写的虚方法只能通过base访问。同样,如果创建派生类的实例,其构造函数可通过base访问基类的构造函数,复用基类构造函数体的代码。这两种情况下,base的使用方法如以下代码所示:

base.方法名([参数列表]);            //用于派生类访问基类被重写的方法
派生类名称([参数列表]) : base(参数列表)     //派生类构造函数预先调用基类构造函数
{
}

注意:
base关键字访问基类的成员时,必须保证基类成员有相应的访问权限。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
监控 Kubernetes Java
阿里面试:5000qps访问一个500ms的接口,如何设计线程池的核心线程数、最大线程数? 需要多少台机器?
本文由40岁老架构师尼恩撰写,针对一线互联网企业的高频面试题“如何确定系统的最佳线程数”进行系统化梳理。文章详细介绍了线程池设计的三个核心步骤:理论预估、压测验证和监控调整,并结合实际案例(5000qps、500ms响应时间、4核8G机器)给出具体参数设置建议。此外,还提供了《尼恩Java面试宝典PDF》等资源,帮助读者提升技术能力,顺利通过大厂面试。关注【技术自由圈】公众号,回复“领电子书”获取更多学习资料。
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
293 0
|
Java 程序员
面试官的加分题:super关键字全解析,轻松应对!
小米,29岁程序员,通过一个关于Animal和Dog类的故事,详细解析了Java中super关键字的多种用法,包括调用父类构造方法、访问父类成员变量及调用父类方法,帮助读者更好地理解和应用super,应对面试挑战。
281 3
|
缓存 安全 Java
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
Java的特点和优点,、Java 8的新特性、面向对象、基本数据类型和引用类型、自动拆装箱与自动装箱、==与equals()的区别、为什么重写equals()就要重写hashcode()、抽象类和接口的区别、重载和重写的区别、四种引用方式、wt()和sleep()的区别、java方法是值传递还是引用传递?访问修饰符、static、final、this和super、volatile的用法及原理
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
【Java基础面试三】、说一说你对Java访问权限的了解
这篇文章介绍了Java中的四种访问权限:private、default(无修饰符时的访问权限)、protected和public,以及它们分别在修饰成员变量/方法和类时的不同访问级别和规则。
【Java基础面试三】、说一说你对Java访问权限的了解
【Java基础面试四十一】、说一说你对static关键字的理解
这篇文章主要介绍了Java中static关键字的概念和使用规则,强调了类成员与实例成员的区别及其作用域的限制。
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
720 6
|
缓存 安全 Java
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
346 4
|
开发框架 .NET C#
【Azure Developer】C# / .NET 静态函数中this关键字的作用
在C#中,`this`关键字用于扩展方法,允许向已有类型添加功能而不修改其源代码。扩展方法必须在静态类中定义,且第一个参数使用`this`修饰,如`public static XElement AcquireElement(this XContainer container, string name, bool addFirst = false)`。这种方式增强了代码的可读性和类型的安全性,尤其在处理第三方库时。
220 2
|
安全 Java
Java面试题:解释synchronized关键字在Java内存模型中的语义
Java面试题:解释synchronized关键字在Java内存模型中的语义
196 1