1、面向对象 面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。 1.1面向对象 面向对象是一种程序设计思想,计算机程序的设计实质上就是将现实中的一些事物的特征抽离出来描述成一些计算机事件的过程,这种抽象的过程中,我们把具体的事物封装成一个一个的整体进行描述,使被描述的对象具备一些系统性、整体性的的行为和特征,我们把这种设计思想称为面向对象。 2、面向对象与面向过程 2.1、面向过程是早期的程序语言设计思想,该思想强调事物的行为细节,即程序的设计不需要封装成一个个的整体,而是将整个程序描述成一个行为,所有行为细节都按照固定方式一步一步的执行,执行程序就是执行某一行为的过程。 2.2、面向对象和面向过程都是一种思想,面向对象是相对于面向过程而言的, 面向过程强调的是具体的功能行为,而面向对象将功能封装进对象,强调具备了功能的对象,面向对象是基于面向过程的,但面向对象思想更接近于现实场景。 2、对象 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。 3、类 类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。 java中的类实现包括两个部分:类声明和类体。 类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。 当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。 向对象的三个基本特征是:封装、继承、多态。 4、封装 首先,属性能够描述事物的特征,方法能够描述事物的动作。封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。 1.1、封装是指:隐藏对象的属性和实现细节,仅对外提供公共访问方式。 1.2、封装的好处: (1)将外界的变化隔离,使程序具备独立、安全和稳定性。 (2)便于设计者使用,提高代码的复用性。 1.3、封装的原则 (1)将不需要对外提供的内容都隐藏起来。 (2)把实现细节隐藏,提供可以对其进行访问公共的方式。 1.4、封装的方式 将某一功能、属性抽离出来,独立写成单独的方法或类。 设置访问权限 (1)设置访问权限可以限定该功能或属性可以被特定的访问者访问,保证了程序的安全性和功能的稳定性。 (2)Java对类和类中成员都定义了特定的访问修饰符。 类:public(公共的) 、default(默认的,不写就默认是它) 类中成员:public、PRotected、default(默认的)、private 注:类的访问修饰符可以不写(默认的),也可以写public(公共的),一个java文件中只能有一个被public修饰的类,且被public修饰的类类名必须要跟文件名一致(包括大小写一致),否则编译会出错,为了方便阅读,类名的命名规范是单词的首字母大写,多个单词组成的类名每个单词的首字母都大写。
为了实现良好的封装,我们通常将类的成员变量声明为private,在通过public方法来对这个变量来访问。对一个变量的操作,一般有读取和赋值2个操作,,我们分别定义2个方法来实现这2个操作,一个是getXX(XX表示要访问的成员变量的名字)用来读取这个成员变量,另一个是setXX()用来对这个变量赋值。 下面我们来看下这个例子: public class Demo { /* * 对属性的封装一个人的姓名、性别、年龄、都是这个人的私有属性 */ private String name; private String sex; private int age; /* * setter()、getter()是该对象对外开发的接口 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
5、继承 1、继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的功能,或者说将事物的共性的功能和属性抽取出来定义成一个父类,让后来具有更多样化实现的子类继承父类。 2、继承的作用: (1)父类具备的方法子类可以直接继承过来,不用重新书写,提高了代码的复用性。 (2)让类与类之间产生关系,有了关系才有多态的实现。 (3)Java中只支持单继承,不支持多继承,因为多继承存在安全隐患(当多个父类存在同个功能时,子类不确定要运行哪一个),Java支持多层继承,即父类还可以继承其他类,java用另一种机制解决单继承的局限性,即多实现。 3、对继承体系的使用 (1)想要使用体系,应该先查阅父类,因为父类定义了该体系的共性功能,了解了父类的功能,就基本可以使用该体系的功能了。 (2)在具体调用时,要创建子类的对象,因为有可能当父类是抽象类时父类不能创建对象,而且子类具备更丰富、更具体的功能实现。 4.继承的特点 4.0覆盖(重写) 4.1如果子父类中的成员一致时,子类成员会覆盖父类成员。 4.2当子类继承父类时,沿袭父类的功能到子类中,但子类对该功能的实现细节不一致,子类可以保留父类对该功能的定义,重写功能的内容。 4.3重写与重载:重载只看参数列表,其他一致参数列表不一致为重载,而重写子父类的参数必须要一致 4.4 this与super this表示当前对象的引用,super表示当前对象父类的引用
5.子父类中的构造函数 5.0构造函数不能重写。 5.1构造函数第一行有一条隐式的语句super()/this()。 5.2在对子类对象进行初始化时,父类构造函数也会运行,因为子类中的构造函数默认第一行有一条隐式的super()语句,这样方便子类构造时先获取到父类的共性属性。 5.3 super()一定要定义在子类构造函数的第一行,当没有默认的空参数构造函数,要手动指定。 6、注意事项: 6.1千万别为了获取其他类中的功能而继承,必须是类与类间有所属关系才可以继承。 6.2子类覆盖父类时必须保证子类权限大于等于父类,才可以覆盖,否则编译失败。 6.3子类静态成员只能覆盖父类静态成员。 7 final关键字 7.1 final关键字可以修饰类、函数和变量。 7.2被final修饰的类不可以被继承(继承打破了封装性)。 7.3被final修饰的方法不可以被复写。 7.4被final修饰的变量只能被赋值一次,既可以修饰成员变量,也可以修饰局部变量、形参。 8. Object类 8.1java中有一个特殊的类,Object类,它是所有对象的超类(根类),Object类中定义了所有对象的共性成员。 8.2Object类中的方法 equals() 比较两个对象是否相同 toString() 返回该对象的字符串表示形式 getClass() 获取该对象对应的字节码文件对象 hasCode() 获取该对象的哈希码值 9.类间的体系关系 继承、聚集(聚合)、组合 9.1继承: 指的是一个类继承另外的一个类的功能,并增加它自己的新功能或改写旧有功能的具体实现,继承是类与类之间最常见的关系。 9.2聚合: 指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如足球队中的足球队员就是聚合关系。 9.3组合: 也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。例如人的各个身体器官之间的关系。 继承的实例 class Person { public String name = “四J”; public int age = 20; } class Student extends Person { void study() { System.out.println(“I can study!”); } } public class Tcj{ public static void main(String args[]) { Student stu = new Student(); // stu.name = “zhangsan”; // stu.age = 20; System.out.println(“name=” + stu.name + “/t” + “age=” + stu.age); } }
6、多态 方法的重写、重载与动态连接构成多态性; 6.1、多态的定义;某一类事物具备的多种表现形态(猫、狗和动物)。同时,多态也是面向对象编程的精髓所在。 6.2、java中多态的表现形式 父类的引用指向自己的子类对象。 父类的引用接收自己的子类对象。 6.3、多态的前提 必须是类与类之间有关系,要么继承,要么实现。 子父类间的成员存在覆盖。 6.4、多态的好处与缺陷 好处是提高了程序的扩展性,缺陷是只能使用父类的引用访问父类的方法,无法访问子类的特有方法。 6.5、多态的应用 类型转换 向上转型,自然转型。 向下转型,强制父类引用向下转型。 6.6、特点 (1)多态中成员函数的特点 编译时看引用变量所属的类中是否有方法。 运行时看对象所属类的方法。 (2)多态中成员变量的特点 无论编译或运行时都参看右边。 多态中静态成员函数的特点 编译或运行时都参看左边 。
6.7 要理解多态性,首先要知道什么是“向上转型”。 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者的父类。我可以通过 Cat c = new Cat(); 例化一个Cat的对象 但当我这样定义时: Animal a = new Cat(); 这代表什么意思呢? 它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。所以, 父类引用只能调用父类中存在的方法和属性,不能调用子类的扩展部分;因为父类引用指向的是堆中子类对象继承的父类;(但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。) 同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。 6.8 对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。例如:”几何图形”的”绘图”方法,”椭圆”和”多边形”都是”几何图”的子类,其”绘图”方法功能不同。 Java的多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。 编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。 运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。 7、重载(Overloading) 方法重载是让类以统一的方式处理不同数据类型的手段。 一个类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。 返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准。 8、重写(Overriding) 子类对父类的方法进行重新编写。如果在子类中的方法与其父类有相同的的方法名、返回类型和参数表,我们说该方法被重写(Overriding)。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。 子类函数的访问修饰权限不能低于父类的。
新闻热点
疑难解答