JAVA复习2

1.多态。

关于java的多态,有的书上是这样讲的,它讲java的多态分成静态的多态,和动态的多态,而所谓静态的多态就是只函数的重载,动态的多态就是方法的覆写。
如下面:
class Test
{
void print()
{
System.out.println("hello world");
}
void print(int x)
{
System.out.println("hello world"+i);
}
public static void main(String []args)
{
Test ts=new Test();
ts.print();
ts.print(10);
}
}
/*
上面的程序就是在一个类中成员方法的重载例子。也就是一个静态的多态性。系统会在你编译的时候根据你调用的方法的参数列表来动态的决定调用那一个函数。
*/

动态的多态:

class Test
{
void print()
{
System.out.println("hello Test");
}
public static void main(String []args)
{
A a=new A();
a.print();
}
}

class A extends Test
{
void print()
{
System.out.println("hello A");
}
}

/*
这时由于子类覆写了父类的方法,所以调用的是子类覆写后的方法。
这是动态的多态。
*/

你上面的问题,是把一个子类的实例赋值给一个父类。这是可以的,其实我个人觉得这好像不是什么多态的问题。请看下面的程序:
class A
{
public static void main(String []args)
{
A [] a=new A[3];
a[0]=new B();
a[1]=new C();
a[2]=new D();
for(int i=0;i<a.length;i++)
{
a[i].print();
}
}
}

class B extends A
{
void print()
{
System.out.println("hello B");
}
}

class C extends A
{
void print()
{
System.out.println("hello C");
}
}

class D extends A
{
void print()
{
System.out.println("hello D");
}
}

/*
上面的程序执行的结果:
hello B
hello C
hello D

可以看出,程序不会调用父类的print()方法,再说父类根本就没有print()方法,但是它不会报错。这就是JVM (java虚拟机),能在程序运行时,动态的识别变量的类型。就像上面一样。这主要是考java的运行时的类型识别机制实现的,当然我认为这其实也可以看成是java多态的一种表现。
*/

在java中子类是父类的实例,这就像是说 鱼是动物。但不能说动物就一定是鱼,这也是符合了人们对现实世界的认识规律。另外java为我们提供了一个关键字,在孙鑫的教程里面也讲到了吧。它是instanceof
你可以用这来判断一个对象是否是一个类的实例。还是上面的A ,B,C ,D类的例子:
在mian函数中写上下面的代码:(把原来的代码删掉)
B b=new B();
if(b instanceof A)
System.out.println("b instanceof A");
//输出:b instanceof A

说明b是A类的实例。

再看下面的例子。
A a=new B();
if(a instanceof B)
System.out.println("a instanceof B");

//输出:a instanceof B
但此时不能这样,B b=a;
虽然a是B的实例但是这里不能这样赋值,要像下面:
B b=(B)a;
//进行类型的强制转换

关于这部分你还是自己体会吧。

2.关于你所说的函数的参数是对象的问题:

函数的参数当然可以是一个对象,类是我们自定义的类型,他可以像基本的数据类型(int ,float等)一样用来定义变量,在java中类用的是相当多的,类属于引用类型,而基本类型的变量属于值类型。在函数传递参数的过程中,实际上是传的是对象的地址。

 

java方法的重载、覆盖和隐藏,以及多态的区别2007-10-03 11:55重载 overloading
大家都熟悉java的重载以及实现,在一个类中同一个函数以多种不同的形态出现,即函数的参数个数或者类型不一样。
例子 System.out.println(); 下面简称SOP
SOP(String str)
SOP(int number)
SOP(char ch)
SOP(double num)
.................................
这就是重载的效果
覆盖(重写) overwritting
覆盖也是大家熟悉不过了的,子类继承父类,然后子类中覆盖原父类的方法,从而实例化子类后,调用的是子类的方法。
例子
public class father{
public overwritting(){
      SOP("father method");
}

public class son extends father{
public overwritting(){
      SOP("son method");
}
public static void main(String args[]){
      father son=new son();
      son.overwritting();
}
}
结果会调用子类的overwritting方法, son method。这就是覆盖。

隐藏 hide
大家知道了覆盖,那么什么情况下,子类实例化后会调用父类的方法而不是子类的方法呢?
(当然子类和父类的方法定义需要是一样的)
大家知道static 类型的方法是不能被覆盖的,所以java利用这一个特性完成了隐藏的效果。
例子
public class father{
public static overwritting(){
      SOP("father method");
}

public class son extends father{
public static overwritting(){
      SOP("son method");
}
public static void main(String args[]){
      father son=new son();
      son.overwritting();
}
}
结果会调用父类的overwritting方法 fathetr method。这就是隐藏。


━━━━━━━━━━━━━━━━━━━━━
方法的重写、重载及隐藏

首先,重写和隐藏是发生在两个类中的,而重载可以发生在一个类中。

重写的概念就是顾名思义了:重新写一遍;方法名、参数及返回值是一模一样的,可能实现的过程不一样,为什么要重写?因为原来的方法不够perfect 或者不够strong,或者达不到开发者的实际应用要求。

重载是当多个方法享有相同的名字,但是这些方法的参数不同,或者是参数的个数不同,或者是参数类型不同时。就叫方法的重载
要注意的是:返回类型不能用来区分重载的方法,仅仅返回类型不同的两个同名方法是个error,这点比较容易理解了:如果你写参数一模一样的但是返回类型不一样的方法,当调用的时候,编译器没法决定调哪个好

隐藏
如下,是华为的一道面试题

public        class        classA{  
             public        void        methodOne(int        i){        }  
             public        void        methodTwo(int        i){        }  
             public        static        void        methodThree(int        i){        }  
             public        static        void        methodFour(int        i){        }  
       }  
   
       public        class        classB        extends        classA{  
             public        static        void        methodOne(int        i){        }  
             public        void        methodTwo(int        i){        }  
             public        void        methodThree(int        i){        }  
             public        static        void        methodFour(int        i){        }  
       }  

1       问那些方法隐藏了父类的方法?  
2       问那些方法覆盖了父类的方法? 

其实关于隐藏的概念本人不太了解,因为基本没用过,但是上题中的重写是很明显的,那就是methodTow,methodOne和methodThree就比较明显的是个错误了,子类继承父类,两个相同的方法一个是static的,一个不是,你让编译器怎么实例化啊,那剩下的就是隐藏了,根据网上搜到的概念:static 类型的方法是不能被覆盖的;也就是说子类的methodFour写了也没用,还是调用父类的methodFour方法
Sample:
public class father{
         public static void overwritting(){
             System.out.print("father method");
         }
}

public class son extends father{
         public static void overwritting(){
             System.out.print("son method");
         }
         public static void main(String args[]){
             father son=new son();
            son.overwritting();
         }
}
以上程序的运行结果就是输出了:father method

━━━━━━━━━━━━━━━━━━━━━

重载,继承,重写和多态的区别:

http://www.oioj.net/blog/user2/20387/archives/2005/117656.shtml

 
重载,继承,重写和多态的区别:
继承是子类获得父类的成员,重写是继承后重新实现父类的方法。重载是在一个类里一系列参数不同名字相同的方法。多态则是为了避免在父类里大量重载引起代码臃肿且难于维护。
网上看到一个有趣的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
下面的例子包含了这四种实现:
class Triangle extends Shape

{
          public int getSides()

         {
               return 3;
         }
}


class Rectangle extends Shape

{
        public int getSides(int i)

        {
               return i;
        }
}


public class Shape

{
        public boolean isSharp()

        {
                return true;
        }
    

        public int getSides()

        {
                return 0 ;
         }


        public int getSides(Triangle tri)

         {
                return 3 ;
         }

         public int getSides(Rectangle rec)

         {
                return 4 ;
          }


         public static void main(String[] args)

         {
                 Triangle tri = new Triangle();
                 System.out.println("Triangle is a type of sharp? " + tri.isSharp());
                 Shape shape = new Triangle();
                 System.out.println("My shape has " + shape.getSides() + " sides.");
         }
}
红色是重载,绿色是重写,蓝色是继承,粉红是多态
注意Triangle类的方法是重写,而Rectangle类的方法是重载。
比较红色的和粉红的部分就可以发现多态对重载的优点:如果用重载,则在父类里要对应每一个子类都重载一个取得边数的方法;如果用多态,则父类只提供取得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。
 

 

 

 

 

 

 

*.ser文件是Java程序源代码中的一种文件。

Java 程序包括源代码(.java文件)、由编译器生成的类(.class文件)、由归档工具jar生成的.jar文件、对象状态序列化.ser文件

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值