Java菜鸟:类与对象初探

Java初学者:类与对象初探

JavaC++都是面向对象的编程语言,那么也就是说类和对象成为了这两门语言的精髓与灵魂,今天就来谈一下类和对象的一些小节。

1.类和对象

         A.类

                   类看似很抽象,其实,我们发现,生活中我们已经习惯于把东西归类,这里的其实我认为是有共同点的,比如“学生”就是一个类,因为所有需要上学的自然人都具有一定相通的属性,这样我们一提到这个词的时候立马会联想起很多相关联的信息。同样的在程序员眼里,也一类具有一定共同属性的集合体,是一个模板,里面锁定了一些属性,也可以说类是对象的提取与抽象的归纳。

        

         B.对象

                   “万事万物皆对象。”是一句很抽象的话,不过也对于对象最形象的描述,我们眼睛所看见的任何一个物体都是一个对象,我们脑海所想到的物体也是对象。同时,对象由特征和行为构成,形成了具体的对象。

        

         C.定义类格式

         java中,类还是有一定的具体语法格式需要遵循的,如下:

         public class 类名{

                   private 数据类型  属性名;

                  

                   public 类名([参数列表]){

                            //方法体

                   }

                  

                   public 返回值类型  方法名([参数列表]){

                            //方法体

                   }

         }

        

         publicprivateprotected均为访问修饰符,具体应用可见上篇日志)

        

        

         D.方法的分类

                   Java中的方法也就是C++中的函数,不过,我认为“方法”这个词更具体更形象,就想我们拿到一道方程题,我们首先要化简,再合并同类项,最后约分等等,这里面的每一步就是一种解决问题的“方法”。同样的,当我们处理任何一个对象的时候都需要用到某种“方法”这里主要想说一下Java中方法的构成与分类。

        Java中的方法是需要两部分组成的:

        返回值类型+参数

进而我们可以把Java的方法分为两类:

                   1.根据返回值划分

                            有返回值的方法和无返回值的方法

                   2.根据参数划分

                            有参数的方法和无参数的方法

        

         E.方法重载

                   重载顾名思义,名字是一样的但是“换了汤也换了药”,一个方法在不同的类中可能需要进行不同的功能,这时我们就要给这个方法进行重载,并且通过参数列表的区别来区分这两个“同名兄弟”何时能够正确的发挥自己的作用。这就是我们要知道实现方法重载后是如何调用的,系统根据你调用方法时,所传递的参数个数和参数类型来决定调用具体的方法。

        

         F.方法参数传递

                   分为两种,第一种是基本数据类型的传递。第二种是对象的传递

        

         G.构造函数

                   构造函数可以说是一种特殊的方法,是一个类的自有属性。

构造函数和普通方法的区别:

                   1.构造函数不能有返回值类型,普通方法必须要有返回值类型

                   2.构造函数的函数名必须和类名相同,普通方法的自己定义

                   3.系统会默认提供一个构造函数,普通方法必须自己写

                   4.构造函数是用来实例化对象(创建对象)和初始化属性,普通方法是执行某一个功能的方法。

                   5.每创建一个对象,只会使用一个构造函数,并只执行一次,普通方法可以多次调用。

                  

        

          H. this关键字

       this指针可以说是对于当前对象的一个简称,比如在甲乙熟知是可以互称“你我”这样就比称呼 对方名字要简单很多了,也就有了效率。我们要注意的是以下两点:

this关键字是指当前的对象;

this关键字是用来区分属性和参数。

        

         I.值传递和引用传递

         值传递:适用于Java中的基本数据类型(包括了String)。

                   值传递是将变量A中的值,拷贝一份存入到变量B中,两个不同的变量分别存储相同的值,对变量B的值做修改

                   是不会影响到变量A

                  

         引用传递:适用于Java中的所有类(String除外)只要是用class定义的类都属于

                   引用传递是将对象名A中存储的地址,拷贝一份存入到对象名B中,这样两个对象名中存储的地址相同,那么在

                   调用方法或者属性的时候都访问的是同一对象。

以上是对于类和对象的一些基本问题的理解,下面我主要想说一下Java的面向对象的魅力所在,也就是其精髓继承与多态。

        

A.继承

         前面提到了,“学生”是一个类,那么我们如果邮箱描述在大学里读书的学生,是否必须要重新定义一个“大学生”类呢?首先,大学生和学生虽然有差别,或者说,大学生具有一些普通学生不具备的特性,但是,所有学生具有的属性,大学生也都具有啊,那何必再重复一遍强调“大学生”的“学生”属性呢?这里我们就可以用到继承了,所以,继承既增加程序的可重用性,也增加程序的扩展性。大大的提高了我们编程的效率也是的程序有更好的扩展性。    

    但是我们回到程序员的角度观察问题,会问子类继承到了父类的什么?在Java里面子类主要继承了:

                   第一种是不在同一包下:子类可以继承父类公有的属性和公有的方法。

                   第二种是在同一包下:子类可以继承父类公有的、受保护的以及默认的属性和方法。

 

         B.继承的格式

                   要实现继承必须使用extends关键字

                   public  class  子类名  extends 父类名{

                           

                   }

                  

         C.方法的重写

        这里就要说到另一个重点了,多态就是在方法的重写里面得到了很好的体现,比如在“学生”类中,作业这个方法在子类“初中生”“高中生”“大学生”中肯定是不同的,但是,我们可以都用作业这个名字来针对不同类的对象来实现多种多样的功能,从而实现了多态。

                   那么方法重写有什么条件么?必须存在继承的关系,子类中定义的方法必须在父类中存在,并且子类定义的方法格式必须完全和父类一样,但是子类定义方法的访问修饰符可以比父类的访问修饰符范围大(不能小).

         另外,我们需要注意的是子类可以重载父类中的方法。        

        

         D.自动转型

                   要实现自动转型必须满足的条件:

                   1.必须存在继承关系

                   只有存在继承关系的类才可以使用自动转型。

                   因为父类包含了子类。

                   自动转型的格式:

                   父类名  对象名  =  new  子类构造函数([参数列表]);

                   对象名是父类类型的,但是具体的对象却是通过子类的构造函数创建的,那么对象是子类的。

                   会优先执行子类的方法。

                  在调用方法的时候,会优先执行子类的方法,如果子类中没有该方法,则执行父类的方法。

        

                 

E.接口

JavaC++我体验到区别之一就在于Java为我们提供了丰富多样的“接口”也就是说我们已经具有了很多可以直接拿来应用的“类”,Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能) Java接口,Java中存在的结构,有特定的语法和结构。

                  定义接口的格式:接口只有公有的属性和方法,但是因为方法是没有具体的实现,所以在使用的过程中,很少定义属性,这里我们要注意由于接口中是没有构造函数,所以接口就不可以创建对象。

                            public interface 接口名{

                            定义常量的格式:

                            public static final 数据类型  常量名(常量名最好全部大写)  = ;

                           

                            定义方法的格式:

                            public  返回值类型  方法名([参数列表]);

                           

                            返回值类型   方法名([参数列表]);

                   }

                  

        

         那么如何实现接口呢,格式如下

                   实现接口的关键字是implements

                   public class 类名 implements 接口名{

                            //重写接口中定义的所有方法。

        (这里很重要,当我们要继承一个接口的时候,我们必须重写接口中所有的方法,在具体的程序编写中,可以通过查看接口源代码来确定,接口中有什么方法)

                   }

                  

         由于接口是一种特殊的类,所以接口可以继承接口的,格式如下:

         public interface 子接口名  extends  父接口名{

                  

         }

                 

F.抽象类

         抽象类是介于接口和类之间的一种类。他比接口要具体,但是又比类要抽象,这里就有必要讨论下他与接口和类的联系与区别了。

在继承抽象类时,必须覆盖该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值,这一点与接口相同。

  当父类已有实际功能的方法时,该方法在子类中可以不必实现,直接引用的方法,子类也可以重写该父类的方法(继承的概念)。

而实现 (implement)一个接口(interface)的时候,是一定要实现接口中所定义的所有方法,而不可遗漏任何一个。

这也就看出来了,抽象类是介于接口和类之间的一种形式。

  另外,抽象类不能产生对象的,但可以由它的实现类来声明对象。

  定义抽象类的方法如下:

         定义抽象类的关键字是abstract  class

         public abstract  class 类名 extends 父类  implements 父接口,...{

                   定义抽象方法

                   public abstract 返回值类型  方法名([参数列表]);

         }

        

 

最后,通过这次小结,我也再一次的复习了类和对象的一些基本概念与定义方法,这都是我们在今后的Java编程中需要天天打交道的,希望大家能够给我提出一些意见,文中肯定也有很多错误,希望大家指正,并且,此文结构和部分内容来自熊哥讲义。