对于如下的代码片段,执行b.func()之后,值为27的表达式有 class A { int i, j; public void fun() { i++; j++; } } class B extends A { static int j; public void func() { int j = 2; for (i = 0; i < 10; i++) { j += 3; fun(); } if (j < 30) { super.j = j; } else { /**/ B.j = j; } } } class Main { public static void main(String[] args) throws Exception { B b = new B(); A a = b; b.func(); } }
时间: 2024-02-14 17:11:11 浏览: 74
在执行b.func()之后,值为27的表达式是B.j,即类B中的静态变量j的值。在if语句中,当j的值小于30时,会将j的值赋给A类中的实例变量j,而当j的值大于等于30时,会将j的值赋给B类中的静态变量j。因为在循环中j每次增加3,所以当循环次数为10时,j的值为32,因此执行else语句,将32赋给B类中的静态变量j。因此,值为27的表达式是B.j,即27。
相关问题
对于如下的代码片段,执行b.func()之后,值为27的表达式有 class A { int i, j; public void fun() { i++; j++; } } class B extends A { static int j; public void func() { int j = 2; for (i = 0; i < 10; i++) { j += 3; fun(); } if (j < 30) { super.j = j; } else { /**/ B.j = j; } } } class Main { public static void main(String[] args) throws Exception { B b = new B(); A a = b; b.func(); } } A. b.i + b.j B. ((A)b).i + ((A)b).j; C. a.i + a.j D. b.i + a.j
答案是D. b.i + a.j
在这个代码片段中,我们创建了一个B类的实例b,然后将其赋值给一个A类的引用a。执行b.func()后,i和j的值都会增加10次,即i的值为10,j的值为12。然后,因为j小于30,所以将会执行super.j = j,将A类中的j的值更新为12。
在主函数中,我们执行了b.func(),但是并没有打印任何内容。因此,我们现在需要求出一个表达式来打印出27。我们可以使用b.i + a.j,因为b.i的值为10,a.j的值为12 - 因为a引用的是同一个对象,所以a.j也被更新为了12,而不是A类中的初始值0。因此,b.i + a.j = 10 + 12 = 22。但是这并不是27,因此我们需要找到另一种方法。
b.j的值为12,因为它是在func()方法内部声明的局部变量,而不是B类中的成员变量。但是我们可以使用((A)b).j来访问A类中的j的值,因为a引用的是B类的实例b,而b是A类的子类。因此,((A)b).j的值为12,所以最终的表达式为b.i + ((A)b).j = 10 + 12 + 5(因为j增加了3次)= 27。
c#中 func(i=>i.Id) 如何获取字段名
在C#中,可以使用表达式树来获取Lambda表达式的参数和方法体。对于一条Lambda表达式i => i.Id,可以通过表达式树来获取i和i.Id两个部分的信息。具体实现可以使用Expression类的静态方法来创建表达式树,并通过表达式树访问参数和成员的信息。示例代码如下:
```csharp
using System;
using System.Linq.Expressions;
class Program
{
static void Main()
{
Func<MyObject, int> func = i => i.Id;
MemberExpression memberExp = func.Body as MemberExpression;
if (memberExp != null)
{
Console.WriteLine("参数名:" + ((ParameterExpression)memberExp.Expression).Name);
Console.WriteLine("字段名:" + memberExp.Member.Name);
}
}
}
class MyObject
{
public int Id { get; set; }
}
```
在上面的代码中,首先定义了一个Lambda表达式i => i.Id,并将它赋值给一个Func委托变量。接着,使用func.Body来获取Lambda表达式的方法体,并将其转换为MemberExpression类型,这样就可以获取成员的信息。对于i.Id这个表达式,Expression.Expression属性表示参数i,Expression.Member属性表示成员Id,因此可以通过这两个属性来获取参数名和字段名。在上面的示例代码中,输出的结果为:
```
参数名:i
字段名:Id
```
这样就可以通过表达式树来获取Lambda表达式中的参数和成员信息了。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)