关于Unity3D的一些笔试题(1)

1.abstract与vitual的区别?


一、Virtual方法(虚方法)
     virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
     情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
     情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
二、Abstract方法(抽象方法)
     abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现


2.写一个Person索引器,要求用字符作为索引,返回int类型?
3.接口的定义与实现以及与抽象类之间的区别?
(1).类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类   
接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”
抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中    


(2).接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法; 
      
(3).一个类一次可以实现若干个接口,但是只能扩展一个父类  
     
(4).接口可以用于支持回调,而继承并不具备这个特点. 
      
(5).抽象类不能被密封。    


(6).抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非       虚的,当然您也可以声明为虚的。  
     
(7).(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。   
  
(8)抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。
     
(9)     好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。   
  
(10)     尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知. 
    
(11)     如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法     
如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。       
如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
    
4.string str=null与string str=“”丶string.Equals与str1=str3之间的区别?


string str = null 没有创建内存空间,str中存放的是空引用指针; 
string str = ""  创建了内存空间,str中存放的是指向堆中的指针。 
当变量为int 型的时候,默认是"",而字符串类型的,默认的是null
string.Empty就相当于"" 一般用于字符串的初始化。


5.StringBuilder对比string,StringBuilder的优势?


String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都是String类的对象。字符串是常量;它们的值在创建之后不能改变。所以可以共享它们。StringBuffer是字符串缓存区,它的内容可以被修改,长度也可以改变,StringBuffer类是线程安全的,也就是说多个线程可以安全的访问StringBuffer对象。StringBuilder与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,如果你只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。值得注意的是StringBuilder是在JDK1.5版本中增加的。以前版本的JDK不能使用该类。


6.C#中的委托是什么?事件是不是一种委托;委托的声明与定义。
委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。


有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。
using System;


namespace 委托
{
     delegate int NumOpe(int a,int b); //第一步:委托声明
     class Class1
     {
         static void Main(string[] args)
         {
             Class1 c1 = new Class1();
             NumOpe p1 = new NumOpe(c1.Add); //委托实例化,注意参数是要使用的参数名,且不带括号
             Console.WriteLine(p1(1,2)); //委托调用
             Console.ReadLine();
         }


         private int Add(int num1,int num2)
         {
             return(num1+num2);
         }
     }
}


7.override与重载之间的区别?


重载,函数名相同,但参数类型或个数或顺序不同。其用途比如:可读性强;在构造器的时候根据参数初始化你想要的实例;代码维护性高,重载的方法,处理逻辑的代码通常都在一个方法里,其他方法通常调用偏多
override,是重写,字面意思,就是重写某个方法的业务逻辑。最大用途是多态,其实重载也是一种多态,但二种多态有个差别是,重载是编译时多态,override是运行时多态


8.abstract class与interface有什么区别?


含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码


9.Unity事件的执行顺序以及什么时候执行?


10.两个游戏对象发生碰撞的必要条件?

主动碰撞双方要有一个Rigidbody存在,并且碰撞双方必须都要有碰撞体组件。     如果碰撞双方只有一个有刚体,那么那个刚体一定要处于运动的状态下才会有碰撞事件发生。


第九题我题目都没读懂,所以就不祸害大家了。希望清楚的网友告知

猜你喜欢

转载自blog.csdn.net/ji2570489271/article/details/78666743
今日推荐