接口、值类型与引用类型
复习... 1
01. 静态和非静态:... 1
02 工厂... 2
本堂内容... 3
一、接口... 3
01 接口的定义:... 3
02 接口的存在就是为了实现多态... 4
03 接口的多继承性... 5
二、接口与抽象类... 5
三、面试题:... 6
四、值类型和引用类型(重点)... 6
五、装箱和拆箱... 7
六、引用传递和值传递... 8
七、异常处理... 9
=============================================================
复习:
01. 静态和非静态:
定义:
有static修饰的为静态 静态类,静态方法,静态字段 等
调用:
静态为共有成员,都可以访问,
非静态为私有的实例成员
class TextClass
{
public int index;
public static int num;
//数字初始赋值为0, 字符\0,字符串 null bool false
public TextClass(int i)
{
index=i;
}
//得到静态的num
public int getNum()
{
return num;
}
//修改静态字段
public void setNum(int i)
{
num=i;
}
}
main 函数中写入:
TextClass t1 = new TextClass(1);
TextClass t2 = new TextClass(2);
Console.WriteLine("t1.index={0},t2.index={1}",t1.index,t2.index);
t1.setNum(100);
Console.WriteLine("t1={0},t2={1}",t1.getnum,t2.getnum);
得到 t1=100,t2=100;
02 工厂
工厂的特征就是根据需求生产(对象)
1. 生产的这个东西干嘛用的
2. 由于生产的东西不同需要考虑统一调用的问题
语法:
class Base
{
}
class Sub:Base
{
}
static class Factory
{
public static Base(返回值) ShengChan(string oper(条件))
{
switch(oper)
{
case"+":return new Sub();
default:return new Sub();
}
}
}
===================================================================
本堂内容
一、接口
01 接口的定义:
interface 接口名
{
接口成员:
只能定义抽象的成员
1.方法
只定义抽象方法
返回类型 方法名(参数列表);
例:string Func(int num);
2.属性
属性的本质就是方法,
返回值 属性名 {选择器}
接口中属性具有 只读属性和只写属性之分
只读:
int Num1
{
get;
}
只写:
int Num2
{
set;
}
3.索引
4.事件声明
}
方法:
class MyTestClass:接口名
{
和抽象类的使用一样,必须要实现这个接口中的方法
与正常方法一样的写
public string Func(int num)
{
return DateTime.Now.Year;
}
}
如果这个类为抽象类,则方法可以写为抽象方法
abstract class MyTestClass:接口名
{
也可:写为抽象方法
public abstract string Func(int num);
}
接口的属性:
interface IProperity
{
int num;
public int Num
{
get{ return num;}
set{num = value;}
}
抽象属性:
abstract int Num
{
get;
set;
}
}
使用:
class MyTestClass:IProperity
{
public int Num
{
get{ return num;}
set{num = value;}
}
}
-------------------------------------------------------------
02 接口的存在就是为了实现多态
写方法是为了被重写的
写属性是为了被继承的
03 接口的多继承性
显示实现接口的语法:
void 接口名.方法名(参数)
{
方法体
}
可以知道显示实现接口方法没有访问修饰符
如何调用?
显示实现接口只能通过接口进行调用
interface IF1
{
void Function();
}
interface IF2
{
void Function();
}
class MyTest:IF1,IF2
{
void IF1.Function()
{
}
}
调用:
MyTest mytest=new MyTest();
IF1 f1 = mytest;
f1.Function();
IF2 f2 = mytest;
f2.Function();
------------------------------------------------------------------------
二、接口与抽象类
编程选择的级别:面向抽象编程 使用抽象数据,不使用具体数据
接口>抽象类>父类>子类
避免定义体积庞大和功能齐全的接口
->单一性
->接口组合使用
-------------------------------------------------------------------------
三、面试题:
1. 如何使用virtual和override?
Person per = new Student();
per.SayHI()调用的子类重写的SayHi方法
2. 如何使用abstract和override?
3. “方法重载overload” 、 “方法重写override"、 "隐藏new"是同一个概念吗?
方法重载 是 函数名一样 参数不一样
4.抽象类和接口的区别?见备注1.
抽象类适用于同一系列,并且有需要继承的成员。
接口适用于不同系列的类具有相同的动作。
对于不是相同的系列,但具有相同的行为,这个就考虑使用接口。
==========================================================================
四、值类型和引用类型(重点)
结构(struct)和类(class)的区别
结构独享数据
类共享数据
类类型是引用类型
结构类型是值类型
应用类型:
class MYpoint
{}
main 函数中:
Mypoint m1=new Mypoint ();
m1.x=100;
m1.y=200;
Mypoint m2=m1;
引用类型为"复制快捷方式"
相当于 m1 和 m2 为指向同一文件的快捷方式
改变其中之一的数据 将使两者的数据都改变
即 m1 和m2 指向同一内存;
若 m1.x=10; m2.y=20;
则 m2.x=10; m1.y=20;
struct MYpoint
{}
main 函数中:
Mypoint m1=new Mypoint ();
m1.x=100;
m1.y=200;
Mypoint m2=m1;
值类型为"复制文件"
m1 m2 为不相关的两个独立文件,指向不同的内存,两者的数据不相影响,
即 m2 的 属性 和 m1 的属性各自独立
-------------------------------------------------------------------
五、装箱和拆箱
装箱的目的就是为了统一调用
装箱: int num = 10;
object o = num;
拆箱: int num1 = (int)o;
得到: num1 = 10;
装箱: int num = 10;
object o = num;
num = 100;
拆箱: int num1 = (int)o;
得到: num1 = 10;
即:再次赋值不影响装箱的数据;
-------------------------------------------------------------
六、引用传递和值传递
ref out
main 函数中:
int num1 = 10;
int num2 = 5;
Func(ref num1,ref num2);
ConSole.WriteLine("num1 = {0}, num2 = {1}",num1,num2);
Func1(out num1,out num2);
ConSole.WriteLine("num1 = {0}, num2 = {1}",num1,num2);
console.readkey();
public static void Func(ref int n1, ref int n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
}
public static void Func1(out int n1,out int n2)
{
n1 = 10000;
n2 = -1234;
}
该例中num1 和 num2 为值类型 所以 用 ref 或 out
ref 和 out 的区别
ref 在使用前要赋值
out 在使用时要赋值
=============================================================
字符串转换为数字类型:
int.Parse:
string str="123";
int num = int.parse(str);
int.TryParse:
int num;
if(int.TryParse(str,out num))
{
console.writeline(num+1);
}
else
{
console.writeline("不成功");
}
Convert.Toint32
雷同有:
double.Parse double.Tryparse
char.Parse char.TryParse
-----------------------------------------------------------------
七、异常处理
try - catch
try - catch - finally
try - finally (*)
int num;
ConSole.WriteLIne("请输入一个数字");
string str = ConSole.ReadLine();
try
{
num = int.Parse(str);
ConSole.WriteLine(num + 1);
}
catch(Exception ex)
{
ConSole.WriteLine(ex.Message);
}
finally
{
//无论如何在捕捉异常结构时都会执行这里的代码
ConSole.WriteLine("销毁");
}
ConSole.ReadKey();
当出现异常时,try中的所有代码都将停在出现异常的地方,其后代码不再执行
直接调至 catch 进行处理
无论 try 和 catch 中什么语句,即使是 break 或 return 都不影响继续执行 finally 里的语句, 但 finally 里不能有 return ;
浙公网安备 33010602011771号