JAVA基础

JAVA面向对象三大特性详解

一、封装  1、概念:    将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。  2、好处:   只能通过规定的方法访问数据。   隐藏类的实例细节,方便修改和实现。   3、封装的实现步骤 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方

一、封装

  1、概念:

    将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

  2、好处:

  •    只能通过规定的方法访问数据。

  •       隐藏类的实例细节,方便修改和实现。 

  3、封装的实现步骤

c7b12d0304a495a29169f5d12028717e.png

 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准。


 

A、访问修饰符


22bb1ff763569390ee39903376c3c35c.png

从表格可以看出从上到下封装性越来越差。

B、this关键字

 1.this关键字代表当前对象

  this.属性 操作当前对象的属性

  this.方法 调用当前对象的方法。

 2.封装对象的属性的时候,经常会使用this关键字。

 3.当getter和setter函数参数名和成员函数名重合的时候,可以使用this区别。如:

679f056af8e4452bce1fd1caa31f680c.png

C、Java 中的内部类

 内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。

 那么问题来了:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!!

 答:内部类的主要作用如下:

  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。

  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据。

  3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。

  内部类可分为以下几种: 


    • 成员内部类

    • 静态内部类

    • 方法内部类

    • 匿名内部类  

  各个内部类的具体使用请转移到另一篇随文:http://www.cnblogs.com/hysum/p/7101974.html

回到顶部

二、继承

1、继承的概念

 继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。如下图所示:

e939c9e297140ce6a8d126cf875b15b6.png

 注:java中的继承是单继承,即一个类只有一个父类。

2、继承的好处

 子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用; 

3、语法规则,只要在子类加上extends关键字继承相应的父类就可以了:

a75ad93bdca2551a94cc6c4b99357d61.png

A、方法的重写

 子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。

 重写要注意:

     a、返回值类型

  b、方法名

  c、参数类型及个数

 都要与父类继承的方法相同,才叫方法的重写。

 重载和重写的区别:

  方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。

  方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。


 B、继承的初始化顺序

  1、初始化父类再初始化子类

  2、先执行初始化对象中属性,再执行构造方法中的初始化。

 基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:

 父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化--->子类对象构造方法   

 下面有个形象的图:

1ddd5b59e0b659e4f373cb6a1b472d72.png

 C、final关键字

 使用final关键字做标识有“最终的”含义。

  1. final 修饰类,则该类不允许被继承。

  2. final 修饰方法,则该方法不允许被覆盖(重写)。

  3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),且初始化之后就不能改了,只能赋值一次。

  4. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。


 D、super关键字

 在对象的内部使用,可以代表父类对象。

  1、访问父类的属性:super.age

   2、访问父类的方法:super.eat()

 super的应用:

 首先我们知道子类的构造的过程当中必须调用父类的构造方法。其实这个过程已经隐式地使用了我们的super关键字。

 这是因为如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。

 那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。

 要注意的是:如果子类构造方法中既没有显示调用父类的构造方法,而父类没有无参的构造方法,则编译出错。

(补充说明,虽然没有显示声明父类的无参的构造方法,系统会自动默认生成一个无参构造方法,但是,如果你声明了一个有参的构造方法,而没有声明无参的构造方法,这时系统不会动默认生成一个无参构造方法,此时称为父类有没有无参的构造方法。)


 E、Object类

 Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类默认继承Object类。

 Object类中的方法,适合所有子类!!!

 那么Object类中有什么主要的方法呢?

 1、toString()

  a. 在Object类里面定义toString()方法的时候返回的对象的哈希code码(对象地址字符串)。

  我们可以发现,如果我们直接用System.out.print(对象)输出一个对象,则运行结果输出的是对象的对象地址字符串,也称为哈希code码。如:

  哈希码是通过哈希算法生成的一个字符串,它是用来唯一区分我们对象的地址码,就像我们的身份证一样。  

  b. 可以通过重写toString()方法表示出对象的属性。

   如果我们希望输出一个对象的时候,不是它的哈希码,而是它的各个属性值,那我们可以通过重写toString()方法表示出对象的属性。

  2、equals()

  a、equals()----返回值是布尔类型。

  b、默认的情况下,比较的是对象的引用是否指向同一块内存地址-------对象实例化时,即给对象分配内存空间,该内存空间的地址就是内存地址。使用方法如:dog.equals(dog2);

  c、 如果是两个对象,但想判断两个对象的属性是否相同,则重写equals()方法。

 以Dog类为例,重写后的equals()方法如下(当然你可以根据自己想比较的属性来重写,这里我以age属性是否相同来重写equals()方法):

e630b45f44b9c79c42ecfc3b5ccd98cc.png

上面有四个判断,它们的含义分别是:

  1

原创不易,完成人机校验,阅读全文

相关推荐