问题一 :是否可以从一个static方法内部发出对非static方法的调用?
不行,
可以这样理解
static修饰的方法可以直接用类名调用
非static修饰的方法必须用类new出对象才能调用
当我们用类名直接调用时,可能这个类的对象并没有new。
如果这时候static方法里调用非static的方法就会出现空指针异常,
当然这种错误编译时就不会通过。
错误代码演示:
1 class Program 2 { 3 4 public int fact(int n) 5 { 6 if (n <= 1) 7 return 1; 8 else 9 return n * fact(n-1); 10 } 11 12 static void Main(string[] args) 13 { 14 //利用递归来计算阶乘 15 fact //看到了吗?fact是根本打不出来的。 16 17 } 18 }
正确代码演示:
1 class Program 2 { 3 4 static int fact(int n) 5 { 6 if (n <= 1) 7 return 1; 8 else 9 return n * fact(n-1); 10 } 11 12 static void Main(string[] args) 13 { 14 //利用递归来计算阶乘 15 Console.WriteLine(fact(3)); 16 17 } 18 }
问题二:继承接口之后必须要全部继承接口里面的内容吗?
是的,必须全部继承。
我写一个接口:
1 namespace 结构测试 2 { 3 interface Interface1 4 { 5 void first(); 6 void second(); 7 } 8 }
我在控制台去实现这个接口的第一个方法,看看情况:
1 namespace 结构测试 2 { 3 class Program:Interface1 4 { 5 static void Main(string[] args) 6 { 7 8 } 9 10 public void first() 11 { 12 Console.WriteLine("我只想实现这一个方法"); 13 } 14 15 16 } 17 }
运行,结果报错:
问题三:抽象类到底是怎么用的?
为什么要写抽象类?所谓抽象不就是把某些物体的共同特点集合起来吗?比如你可以吃饭,睡觉,学习。你的同学也可以吃饭,睡觉,学习。好了,你们都具有这些共同的特征,不只是你们,所有的人都这样,这就可以抽象出一个类--Person。那么抽象类该怎么用呢?
抽象类Class1:
1 namespace 抽象类 2 { 3 abstract class Class1 4 { 5 public abstract void start(); 6 public void update() 7 { 8 Console.WriteLine("我是抽象类里面的不抽象方法"); 9 } 10 } 11 }
Class1这个抽象的类我给他写了两个方法,一个是抽象方法start,一个是非抽象方法update.注意到了没,抽象方法是不允许有方法体的。
下面我们再来写一个普通的类Class2来继承抽象类Class1:
1 namespace 抽象类 2 { 3 class Class2:Class1 4 { 5 public override void start() 6 { 7 Console.WriteLine("我继承了抽象方法"); 8 } 9 public void strt() 10 { 11 update(); 12 } 13 } 14 }
可以看到,抽象类Class1里面的抽象方法start被继承并重构了方法体,而且非抽象方法update也可以直接继承。
下面来控制台应用程序:
1 namespace 抽象类 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Class2 jj =new Class2(); 8 jj.start(); 9 jj.strt(); 10 } 11 } 12 }
普通类Class2实例化了一个对象jj,然后jj可以调用start方法和strt方法。
注意事项:抽象类不能实例化。抽象方法不能有方法体。
问题四:string类型创建的字符串的内容是不可变的
先上图,咱们看图说话。
比如我最初定义了一个字符串s,初始值为 "蜀云泉" 。
1 string s = "蜀云泉";
我们可以看到这个字符串s的内容是存放在堆里面的,而s存放在栈里面只是起一个引用的作用。可以看到我在图上s画了一条虚线指向 “蜀云泉” 。现在我执行新的操作:
1 s = s + "喜欢写博客";
好了,s并没有直接在蜀云泉那块内存增加我写的字符串,而是新开辟了一块内存去重新存储。这时s指向了那块新的存储空间。而那个旧的存储空间“蜀云泉”过一段时间之后系统会自动把它清理掉。
问题五:字符串怎么写成多行?
有时候字符串实在是太长了,全部写在一行吧,既不美观也不方便查看,所以怎么写成多行呢?有两种方法:
方法一:
string Str="字符串1"+ "字符串2";
方法二:
string Str=@"字符串1 字符串2";
问题6:输入日期怎么判断是周几?
int days = (int)Convert.ToDateTime("时间").DayOfWeek;
周日是0,其它的数字对应。