【黑马程序员】 学习笔记 - Java面向对象

来源:互联网 发布:狂湿淘宝店 编辑:程序博客网 时间:2024/06/06 04:40

----------------------android培训、java培训、期待与您交流!----------------------

Java面向对象


1.面向对象的概念:

面向对象是一种思想,它与面向过程的思想相对应。不考虑过程,只考虑方法调用,获得结果的一种思想。

2.面向对象的意义和优点:

这种思想能降低开发者的代码量,减少重复意义的代码,提高工作效率。众所周知,如今大型项目只靠面向过程的设计会需要巨大的代码量,延长开发周期,很难完成这些项目。使开发者由执行者变成了指挥者,更具有实际的意义。面向对象强调的是对象实例,面向过程强调的是动作,对象将动作进行封装。

3.面向对象的三大特征:封装(Encapsulation),继承(Extends),多态(Polymorphism)。

A.封装

封装:是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
封装的好处:提高安全性、提高重用性、将变化隔离、便于使用。
封装的原则:将属性及不需要对外提供的方法都隐藏起来,对外提供方法来访问。
Private私有:一个权限修饰符,用于修饰成员使它的内容只在本类中有效,一般作为封装隐藏属性及方法用。它只是封装的一种体现,而Java最小的封装体是函数。

public class PersonDemo {public static void main(String[] args) {Person p = new Person();p.setAge(6);System.out.println(p.getAge());}}class Person{private int age = 3;public void setAge(int a){age = a;}int getAge(){return age;}}

在程序中,我定义了一个Person类,这个类有个私有变量age,在main中无法调用Person.age这个变量,我们在Person中写两个函数setAge和getAge,用来给age赋值和读取。这就是私有类的含义,无法在外部直接调用age。


B.继承:

一个新类可以从现有的类中派生,这个过程称为类继承。现有类称为新类的父类(基类),新类称为现有类的子类(派生类)。
继承的意义:1.提高了代码的复用性。2:让类与类之间产生了联系,给多态提供了前提。
方法:使用extends关键字来实现,即 class 子类 extends 父类。
子类和父类的关系:
成员变量:
当本类的成员和局部变量同名用this区分。
当子父类中的成员变量同名用super区分父类。
子类不能直接访问父类中私有内容。
成员函数:当子父类中出现成员函数一模一样的情况,会运行子类的函数。这种现象,称为覆盖操作,这是函数在子父类中的特性。
函数的两个特征:重载和重写。
重载是指两个返回值类型和函数名都相同的两个函数,他们只有参数不同,这种用参数个数区分不同函数的方法叫做重载。
重写就是覆盖,子类中有与父类中相同的函数,子类中的函数会覆盖掉父类中的函数。
覆盖注意事项:
子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。
父类的方法是私有的(private),不能覆盖。
静态只能覆盖静态,或被静态覆盖。
以毕老师视频中的电话为例子,见代码:

class Phone{        void call(){}        void show(){            System.out.println(number);        }    }        class NewPhone extends Phone{        void show(){//创建子类的新功能            System.out.println(name);            System.out.println(pic);        super.show();//保留父类原有功能      }    }

什么子类实例化的时候要访问父类中的构造函数呢?
那是因为子类继承了父类,获取到了父类中的内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。所以子类在构造对象时,必须访问父类中的构造函数。为了完成这个必须动作,就在子类的构造函数中加入了super()语句如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类中哪个构造函数。同时子类构造函数中如果使用this调用了本类构造函数时,super就没有了,因为super和this都只能定义在第一行,所以只能有一个。但是可以保证的是子类中肯定会有其他的构造函数访问父类的构造函数注意:super语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。通过super初始化父类内容时,子类的成员变量并未显示初始化,等super()父类初始化完毕后,才进行子类的成员变量显示初始化。
一个对象实例化过程:  
Person p = new Person();  
a.jvm会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下)。 
b.在堆内存中开辟空间,分配地址。  
c.并在对象空间中,对对象中的属性进行默认初始化。  
d.调用对应的构造函数进行初始化。  
e.在构造函数中,第一行会先调用父类中的构造函数进行初始化。
f.父类初始化完毕后,再对子类的属性进行显示初始化。 
g.在进行子类构造函数的特定初始化。  
h.初始化完毕后,将地址值赋值给引用变量。

C.多态:

可以理解为事物存在的多种体现形态。

多态的体现:父类的引用指向了自己的子类对象。父类的引用也可以接收自己的子类对象。
多态的前提:必须是类与类之间有关系。要么继承,要么实现。通常还有一个前提:存在覆盖。
多态的好处:多态的出现大大的提高程序的扩展性。
多态的弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。前期定义的内容不能使用(调用)后期子类的特有内容。
多态的前提:必须要有关系,继承或者实现。要有覆盖。

转型:Animal a = new Cat();自动类型提升,猫直接提升成了动物类型,不能直接访问猫的特有功能。
作用就是限制对特有功能的访问,提高程序扩展性。
专业讲:向上转型。
a.eat();
如果还想用具体动物猫的特有功能,可以将该对象进行向下转型。
Cat c = (Cat)a;向下转型的目的是为了使用子类中的特有方法。
c.eat();       向上转型是为了限定功能使用,提高程序扩展性。
c.catchMouse();
注意:对于转型,自始至终都是子类对象在做着类型的变化。
Animal a = new Animal();
Cat c = (Cat)a;ClassCastException 类型转换异常。
在上下转型的过程在都是子类对象在变化。在父类型和本类型之间转换。
为提高扩展性或者为限制子类的特有功能时向上转型。
当想使用特有功能时向下转型。







原创粉丝点击