面向对象

一、匿名对象
使用方式一:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化;
使用方式二:可以将匿名对象作为实际参数进行传递。
注意:如果对一个对象进行多个成员调用,必须给这个对象起个名字。


二、构造代码块与this语句
构造代码块:给对象进行初始化对象一建立就执行,先于构造函数执行。
构造代码块和构造函数的区别:
1.构造代码块是给所有对象进行初始化,而构造函数是给对应的对象初始化;
2.构造代码块中定义的是不同对象共性的初始化内容。
this语句:用于构造函数之间相互调用。
this语句只能定义在构造函数的第一行。因为初始化要先执行。
构造函数之间调用只能用this语句。


三、静态
static关键字
1.随着类的加载而加载,也就是说,静态会随着类的消失而消失,说明它的生命周期最长;
2.静态先存在,对象后存在;
3.被所有对象所共享;
4.可以直接被类名调用。
注意:
1.静态方法只能访问静态成员,非静态方法既可以访问静态也可以访问非静态;
2.静态方法中不可以定义this,super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this;
3.主函数是静态的。

静态的利弊:
利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。可以直接被类名调用。
弊端:生命周期过长。访问出现局限性(静态虽好,只能访问静态)。

主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用。
主函数的定义:
public:代表着该函数访问权限是最大的。
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值。
main:不是关键字,但是一个特殊的单词,可以被jvm识别。
(String[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。
主函数是固定格式的:jvm识别。

什么时候使用静态:
1.什么时候定义静态变量(类变量):当对象中出现共享数据时,该数据被静态所修饰;
2.什么时候定义静态函数:当该功能内部没有访问到非静态数据时,该功能可以定义成静态的。

静态的应用:工具类
每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装以便复用。定义一个工具类,将类中的所有方法都定义成static的,直接通过类名调用即可。将方法都静态后,可以直接被类名调用,就不必再被建立对象,所以可以将构造函数私有化。

静态代码块:
随着类的加载而执行,只执行一次并优先于主函数执行。用于给类进行初始化。
静态代码块(对构造函数进行初始化)>构造代码块(对对象进行初始化)>构造函数(对对应对象进行初始化)


四、对象的初始化过程
Person p=new Person("zhangsan",20);
1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中;
2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化;
3.在堆内存中开辟空间,分配内存地址;
4.在堆内存中建立对象的特有属性,并进行默认初始化;
5.对属性进行显示初始化;
6.对对象进行构造代码块初始化;
7.对对象进行对应的构造函数初始化;
8.将内存地址赋给栈内存中的p变量。


五、继承
1.提高了代码的复用性;
2.让类与类之间产生了关系,有了这个关系才有了多态的特性。
注意:千万不要为了获取其他类的功能,简化代码而继承。必须是类与类之间有所属关系才可以继承。所属关系 is a。
Java语言中支持单继承,不支持多继承,因为多继承容易带来安全隐患。比如当多个父类定义了相同功能,当功能内容不相同时,子类不确定要运行哪一个。但是Java保留这种机制,并用另一种体现形式来完成表示:多实现。

Java支持多层继承。也就是一个继承体系。
如何使用一个继承体系中的功能:想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中的共性功能。通过了解共性功能,就可以知道该体系的基本功能。那么这个体系已经基本可以使用了。但在具体调用时要创建最子类的对象:因为父类有可能不能创建对象并且创建子类对象可以使用更多的功能,包括基本的也包括特有的。
总而言之:查阅父类功能,创建子类对象使用功能。

子父类出现后,类成员的特点:
1.变量:
如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量用this,子类要访问父类中的同名变量用super。
super的使用和this的使用几乎一致,this代表的是本类对象的引用,super代表的是父类对象的引用。
2.子父类中的函数:
当子类出现和父类一模一样的函数时,子类对象调用该函数会运行子类函数的内容,如同父类的函数被覆盖一样。这就是函数的另一个特性:重写(覆盖)。
当子类继承父类,沿袭了父类的功能到子类中,但是子类虽具备该功能内容却和父类不一致。这时没有必要定义新功能,而是使用覆盖,保留父类的功能定义并重写功能内容。
覆盖:
a.子类覆盖父类,必须保证子类权限大于等于父类权限才可以覆盖,否则编译失败;
b.静态只能覆盖静态。

重载:只看同名函数的参数列表。
重写:子父类方法要一模一样,包括返回值类型。

3.构造函数
a.在对子类对象进行初始化时,父类的构造函数也会运行。因为子类的构造函数默认第一行有一条隐式的语句super()。
super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
b.子类之所以要访问父类中的构造函数,是因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化时,要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super()语句的方式来指定。
注意:super()的语句一定定义在子类构造函数的第一行。
c.子类的实例化过程:子类的所有构造函数,默认都会访问父类中空参数的构造函数。因为子类每一个构造函数内的第一行都有一句隐式super();当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形式来指定要访问的构造函数。当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。


六、final关键字
final关键字:最终。作为一个修饰符。
1.可以修饰类、函数、变量。
2.被final修饰的类不能被继承。为了避免被继承,被子类复写功能。
3.被final修饰的方法不可以被复写。
4.被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量又可以修饰局部变量。当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值取个名字,方便于阅读。而这个值不需要改变所以加上final修饰。
作为常量:常量的书写规范所有字母都大写,如果有多个单词组成。单词间通过_连接。
5.内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。


七、抽象

当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。

抽象类的特点:

1.抽象方法一定在抽象类中。

2.抽象方法和抽象类都必须被abstract关键字修饰。

3.抽象类不可以用new创建对象。因为调用抽象方法没意义。

4.抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。抽象类强制了其子类必须重写其抽象方法。


抽象类比一般类多了个抽象函数,就是在类中可以定义抽象方法。抽象类不可以实例化。

特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。



八、接口

接口:初期理解可以认为是一个特殊的抽象类。当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。

Class用于定义类

Interface用于定义接口


接口定义时,格式特点:

1,接口中常见定义:常量,抽象方法。

2,接口中的成员都有固定修饰符

常量:public static final

方法:public abstract

注意:接口中的成员都是public的。 


接口:

不可以创建对象,因为有抽象方法。

需要被子类实现。子类对接口中的抽象方法全部覆盖后,子类才可以实例化。否则子类是一个抽象类。

接口可以被类多实现,也是对多继承不支持的转换形式,java支持多实现。



九、多态

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

1.多态的体现:

父类的引用指向了自己的子类对象。

父类的引用也可以接受自己的子类对象

2.多态的前提:

必须是类与类之间有关系。要么继承,要么实现。

通常还有一个前提:存在覆盖

3.多态的好处:

多态的出现大大的提高程序的扩展性。

4.多态的弊端:

提高了扩展性,但是只能使用父类的引用访问父类中的成员。

5.多态的应用


在多态中成员函数的特点:

在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有,编译失败。

在运行时期:参阅对象所属的类中是否有调用的方法。

简单总结:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点:无论编译和运行,都参考左边。

你可能感兴趣的:(继承,静态,多态,final,抽象)