java中关于父子类继承private的一道面试题

package jxau.blueDot.lyx;
		
		/**
		 * 
		 * @author liyixiang
		 * @2014-8-19
		 * @TODO:
		 * 	关于继承的面试题:
		 * 	第一种情况:2 4 6
		 * 		结果 Sub 
		 * 		父类引用指向子类对象,子类重写了父类的方法,所以调用子类的方法
		 * 	第二种情况:1 4 6
		 * 		编译器出错
		 * 		父类引用指向子类对象,调用的是父类的方法,而方法是private的
		 * 	第三种情况:2 4 7
		 * 		结果 Sub Sub
		 * 		调用的是子类继承父类的print方法,该print方法被继承后就是子类的了,
		 * 	所以sys中调用的是子类的showMe方法
		 * 	第四种情况:1 4 7  重点
		 * 		结果 Base
		 * 		1.说明private的方法没有被继承。如果是继承 则应该调用子类的showMe方法
		 *              2.由于print来自于父类,而父类并不知道子类有什么样的表现,(就如同你还没
		 * 	有孩子就要给孩子买多大的房,孩子并不一定需要)所以showMe调用的就是父
		 * 	类自己的方法(因为他不知道他的孩子也有showMe方法)
		 * 	第五种情况:2 5 6
		 * 		结果 Sub
		 * 		子类自身创建 调用重写方法
		 * 	第六种情况:2 5 7
		 * 		结果 Sub Sub
		 * 		子类自身创建 调用重写方法
		 * 	第七种情况:1 5 7 重点
		 * 		结果 Base
		 * 		由于print实在父类有定义的,无法识别子类新增的方法,所以只好去寻找父类自身                 *      的showMe方法
		 * 	第八种情况:3  5 7 
		 * 		结果 Base   
		 * 	    修饰符为public的时候,编译器报错,因为final方法不能被重写,而改为privat                     *      e编译通过,这就证明了private方法是不能被继承的!
		 */
		class Base{
			  //private String showMe()                     //1.
			  //public String showMe()                      //2.
			final private String showMe()         //3.final public String showMe()                           { 
				return "Base";
			  }
		    
			public void print(){
				System.out.println(showMe());
			}
		
		}
		
		
		public class Sub extends Base{
			
			public  String showMe(){
				System.out.println("Sub");
				 return "Sub";
			}
				
			//测试
			public static void main(String[] args){
			 //Base base = new Sub();                  //4.
			   Sub base = new Sub();                   //5.
			// base.showMe();                           //6.
			   base.print();                            //7.
			} 	
		}


你可能感兴趣的:(java中关于父子类继承private的一道面试题)