【西天取经】1、OOP面向对象(C#\JAVA)
1、OOP面向对象(C#\JAVA)
关于面向对象的三大特征,可以下载这本书的电子版,在第五章里面有详细的介绍和实例。本书最重要的一章,核心中的核心!
仔细读完保证让你有本质提升。本书于2009年10出版上市,在那个年代里我写的这本书,绝对是计算机编程书籍里的一股清流。
想搞明白下面C#和JAVA的面试题结果,需要下载上面的电子书,仔细阅读第五章里面的知识,会让你受益匪的,从此走向人生巅峰。
面向对象的编程思想不区分你使用的是哪种编程语言,封装、继承、多态的道理都是一样的。
C#请写出运行结果:(面试题)
class Person { protected int Age = 10; public Person() { this.Output(); } public virtual void Output() { Console.WriteLine("Person:" + this.Age); } } class Employee : Person { public Employee() : base() { base.Age = 20; } public override void Output() { Console.WriteLine("Employee:" + base.Age); } } class Program { static void Main(string[] args) { Employee employee = new Employee(); } }
JAVA请写出运行结果:(面试题)
友情提示:JAVA里面没有C#里面的virtual和override关键字(这两个关键字简直就是坑爹的设计,文章结尾处有吐槽)
public class Person { protected int age = 10; public Person() { this.outPut(); } public void outPut() { System.out.println("Person:" + this.age); } } public class Employee extends Person { public Employee() { super(); super.age = 20; } @Override public void outPut() { System.out.println("Employee:" + super.age); } } public class CodeDemo { public static void main(String[] args) { new Employee(); } }
JAVA类型比较和C#类型比较的特殊之处,请写出下面JAVA代码的运行结果:(面试题)
public static void main( String[] args ) { System.out.println("1" == "1"); System.out.println("1".equals("1")); System.out.println(new String("1") == new String("1")); System.out.println(new String("1").equals(new String("1"))); System.out.println("1" == new String("1")); System.out.println("1".equals(new String("1"))); int data1 = 127; int data2 = 127; System.out.println(data1 == data2); Integer dataObject1 = 127; Integer dataObject2 = 127; System.out.println(dataObject1 == dataObject2); Integer dataObj1 = new Integer(127); Integer dataObj2 = new Integer(127); System.out.println(dataObj1 == dataObj2); Integer dataObject11 = Integer.valueOf(127); Integer dataObject12 = Integer.valueOf(127); System.out.println(dataObject11 == dataObject12); int int127 = 127; System.out.println(int127 == dataObj1); System.out.println(dataObj1.equals(int127)); System.out.println(int127 == dataObject11); System.out.println(dataObject11.equals(int127)); data1 = 128; data2 = 128; System.out.println(data1 == data2); dataObject1 = 128; dataObject2 = 128; System.out.println(dataObject1 == dataObject2); dataObj1 = new Integer(128); dataObj2 = new Integer(128); System.out.println(dataObj1 == dataObj2); dataObject11 = Integer.valueOf(128); dataObject12 = Integer.valueOf(128); System.out.println(dataObject11 == dataObject12); int int128 = 128; System.out.println(int128 == new Integer(128)); System.out.println(new Integer(128).equals(int128)); System.out.println(int128 == Integer.valueOf(128)); System.out.println(Integer.valueOf(128).equals(int128)); }
总结:
JAVA的比较大小是否相等简直就是坑爹的设计,int和Integer的区别很多人都整不明白,即便是整明白这里了,遇到比较临界值127和128的时候,也会让你开始怀疑人生。除了int还有String等很多类型都有各种比较的坑,总结一句话JAVA在类型比较时不如NET,比较大小相等的时候,搞不清楚该怎么用的时候,就用equals方法准没错,如果没有equals方法就先声明它的类型,之后就可以new了,new完了就有equals方法了;高级点的用法就是用valueOf方法得到它的类型然后就有equals方法可以用了。(在整不明白为什么之前,千万别用valueOf方式得到类型的equals方法啊,不然会坑死你的,编程这个职业也是高危职业,弄错了把你送进监狱说不定也是有可能的。)
多说一句关于继承的知识点:
C#里面有protected和internal两个访问修饰符,还有virtual和override两个关键字,而在JAVA里面是完全没有的。
先说C#这两个访问修饰符真的能把你坑得死死的,你想添加一个类型的扩展方法,发现调用类里protected和internal访问修饰符定义的方法根本不行,为了扩展一个功能去重写一个类型,当你这么干的时候,你会发现根本不现实,C#里面这两个访问修饰符完全就是鸡肋,食之无味弃之可惜。反观JAVA这里虽然没有C#里面的扩展方法这个语法糖的优点,但是JAVA里的访问限制可以说基本上是没有的,因为JAVA里面不仅没有internal这个访问修饰符(protected访问修饰符对象可以用),甚至连virtual和override这两个关键字都没有,你可以随便改随便写,你的子类把继承的父类里所有的方法全部重写一遍都是没问题的。再想想C#里面这四个高大上的东西叫什么呢?这就叫做门槛,微软又在你成为高手的必经之路上给你设置了一道非常高的门槛,没有对比就没有伤害。