黑马程序员-面向对象

来源:互联网 发布:淘宝贷款欠1万4年了 编辑:程序博客网 时间:2024/05/18 01:43

1,封装:将属性私有。对外提供公共的访问方式。提高代码的安全性和复用性。

构造函数特点:函数名与类名相同,无返回值类型,不可写return语句。只执行一次,给类初始化时使用。
不定义构造函数时,自带一个空参数的构造函数。如果定义了其他参数的构造函数。还需要空参数的构造函数,则需要重新定义。

构造代码块:对象一建立就运行。优先于构造函数执行。给对象做统一初始化。

this代表本类对象。代表他所在函数所属对象的引用。
this的应用:当定义类中功能时,该函数内部要到调用该函数的对象时,这时用this来表示这个对象。
static:修饰成员。

被修饰成员的特点:
1,随着类加载而加载。生命周期最长。
2,优先于对象而存在。
3,被所有对象所共享。
4,可以直接被类名调用。
使用注意:静态方法只能访问静态成员。静态方法中不可以写this.super关键字。主函数是静态的。非静态可以访问静态也可访问非静态。
main:是一个特殊的函数。作为程序的入口。可以被jvm调用。调用主函数时会自动加载所属的本类。
什么时候使用静态,要从两方面下手:
因为静态修饰的内容有成员变量和成员方法。
1,当对象出现共享数据时。定义静态变量。
2,当功能内部没有访问到非静态数据时(对象的特有数据),定义静态函数。

静态代码块:随着类的加载而执行。只执行一次。

对象的初始化过程:
1,加载类到内存。
2,执行static代码块。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性,并进行默认初始化。
5,对属性进行显示初始化。
6,进行构造代码块初始化。
7,进行构造函数初始化。
8,将内存地址赋给栈内存中的变量。

栈内存使用调用了方法。每一个都有this,谁是引用就代表谁。同样,方法区的非静态方法也有this做引用。静态的则是类名。


2,继承使类与类之间产生了关系,提高代码复用性和扩展性,有这个关系才有了多态。

java只支持单继承,不支持多继承。但是支持多层继承。
聚集:什么里面有什么。
聚合:球员是球队的一员
组合:事物的一部分,更加紧密。
子父类成员变量的特点:相同名字的非私有成员变量要用this,super区分。

内存示意图:


创建子类对象时,先加载父类的字节码,再加载子类的字节码,并且将父类对象属性放到子类的对象区域中。方法区也是一样,此时子类对象中含有2个引用,一个是this,一个是super。
父类中特有的成员,子类可以用this作为引用,因为此时2个引用所指的都是子类对象,但是父类作为引用时只能使用父类的方法和成员。这是父类引用指向子类的特点。还可以理解为子类包含着父类,父类的成员也属于子类的,所以可以用this作为引用。
 子父类函数的特点:当子类出现和父类一模一样的函数时,运行时会运行子类的函数。这种现象叫做覆盖,重写。
覆盖:
当子类继承父类。沿袭了父类的功能,虽然子类具备该功能,但是内容却和父类不一致。这时可以直接覆盖父类特性,保留父类的功能定义,重写功能内容。
覆盖注意:必须保证子类权限大于等于父类权限。静态只能覆盖静态。父类私有的函数子类不可见,所以重写时不叫覆盖。
重载和覆盖的区别:
1,重载只看参数列表。
2,覆盖要求函数一模一样。

子父类构造函数的特点:
子类构造函数中有一个隐式的super();
父类无空参数的构造函数时。需要在子类构造函数中指定父类的构造函数。

class Fu{       Fu(int a){    }}class Zi{    Zi(){     super(4);    }}
为什么子类一定要访问父类中的构造函数:
因为父类的数据子类可以直接获取,所以子类对象在建立时,需要查看父类是如何对这些数据惊醒初始化的,如果子类想访问父类指定的构造函数时,可以通过手动定义super语句的方式来指定。
注意:super语句一定定义在构造函数的第一行。
结论:子类所有的构造函数,默认都会访问父类空参数的构造函数。当父类中没有空参数的构造函数时,子类必须手动通过super语句的形式来指定访问父类中的构造函数。当然,子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。
this和super语句必须在第一行。初始化动作必须先做。


抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象方法都必须被abstract修饰
3,抽象类不可以创建对象。因为调用抽象方法无意义。
4,抽象类的方法要被使用。必须由子类复写其所有的抽象方法后。建立子类对象调用。
如果子类只覆盖了部分抽象方法。那么该子类还是一个抽象类。

模板设计模式:将不确定的东西暴露出去。让别人去复写。



接口与接口之间可以有继承关系。并且可以有多继承(如果具有相同方法名,不同返回值时不行!)。因为没有方法体。

3,多态:事物的多种体现形式。

1,多态的体现:父类的引用可以指向子类对象。
2,多态的前提:必须是类与类之间有关系。要么继承,要么实现。通吃还有一个前提:存在覆盖。
3,多态的好处:提高了程序的扩展性。
4,多态的弊端:只能使用父类的引用访问父类中的成员。如果使用子类成员,需要转换成子类型。
多态子父类成员变量特点:
变量名相同时,在堆内存中根据引用找对应的成员变量。即父引用找父,子引用找子。
ps:编译运行都看左。
多态成员函数的特点:
多态的覆盖。父类引用运行的是子类的。如果覆盖方法是静态的。父类引用调用静态方法时跟对象没关系。运行父类的。
ps:编译看左边,运行看右边。

原创粉丝点击