理解面向对象等于理解Java编程的本质,你得搞清楚:你写的每一个类,他们都没有内存,但是操作系统或者说虚拟机是认识他们的,他们位于进程模型中的text部分,但这不代表他们占有实际的意即可以被放到CPU上运行的内存数据,,只有函数里的对象才能在CPU上运行,而一切运行都是从psvm开始的。
面向对象程序设计方法有三种机制:封装,继承,多态:
一、封装,即类和对象,之前已经介绍过这个Java编程中最基本的语法及概念,并且在《Java基本知识》一文中已经通过介绍访问修饰符介绍了Java类的封装机制,现在要注意这么一个问题:将一般的成员变量设置为private,通过public的get和set函数去访问是一个良好的编程习惯。
①抽象类和接口:二者颇为相似,都是抽象的,这意味着他们都不能实例化对象,必须被extends(抽象类)或者implements(接口)后才能实例化,事实上接口要比抽象类更抽象,抽象类中的抽象方法可有可无,只是一旦有抽象方法的时候该类一定得被声明为抽象类,但是接口里的方法必须都得是抽象方法(注:JDK 1.8 以后,接口允许包含具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰。),而且,接口并不需要刻意使用abstract进行定义,它本身以及内部的方法默认就是abstract,二者的本质区别是抽象类是类,接口不是类,是interface,抽象类毕竟还是一个类,是类就有构造函数,但是接口不是类,没有构造函数,除了这两点不同以外,他们的其他区别还有:
A.抽象类和接口的可见度并没有差别,要不public要不default,但是在内部成员的修饰上,接口很特殊,成员变量必须是public static final,成员函数一般为public;
B.类继承类只能单继承,类实现接口可多实现,接口继承接口可多继承。
注意:有一种特殊的接口:标记接口,它内部什么都没有。
②枚举:enum,在C++里这一种基本数据类型,但是在Java里它是一个特殊的类,枚举跟普通类一样可以拥有自己的变量、方法和构造函数,但是一定要注意:构造函数只能使用 private 访问修饰符,所以enum是无法实例化对象的,也就是说当你定义一个enum引用时,你不能new该enum对象,只能将enum已有成员变量赋给这个引用,为什么能这样做呢?请看下面:
当我们定义一个enum:
enum Color { RED, GREEN, BLUE; }
它实际上是这样的:
class Color { public static final Color RED = new Color(); public static final Color BLUE = new Color(); public static final Color GREEN = new Color(); }
另外,enum有一些常用的API:
values():这是一个静态方法,返回值为一个数组;
ordinal():不是静态方法,返回调用该函数的引用所指向的常量的索引;
valueOf(""):这是一个静态方法,在参数表中填入常量,再返回这个常量。
二、继承:三要素:除了private以外都能继承来,可扩展,可重写(这是多态的一种)
继承的主要问题是构造函数的问题:构造函数不管它是什么访问级别,都不能被继承来,但是却可以在子类的构造函数中调用父类构造函数完成对继承来的变量的初始化,规则如下:
如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
另需注意一件事情,所有的类都隐式继承Object类,这个类是个老祖宗类,因而任何类都会有Object类的所有公有函数,其中比较著名的几个函数有:
除此以外,主要都是些关于线程的函数。
三、多态:
①重载;一个类里的同名函数
②重写:不同类里的同名函数
区别如下: