面向对象是一种思想,把复杂事物简单化,把面向过程的执行者变成了指挥者。过程其实就是函数,而对象将函数和一些内容封装。把事物的属性和行为封装成对象,再把对象抽象成类。
类的访问修饰符有public和final。而成员的修饰符有public private protected static 。
成员变量和局部变量的区别:成员变量定义在类内方法外,在本类中有效,存在于堆内存;而局部变量存在于方法中、参数上、语句中,在定义时到大括号有效,存在于栈内存。
构造函数和普通函数的区别:构造函数与类同名,没有返回值,只在创建对象的时候调用一次;普通函数有返回值,可由对象多次调用。
构造代码块是给所有对象初始化,而构造函数则是给相对应的对象初始化。
Person p=new Person(); 在内存中:1,先找到Person的字节码文件,加载到内存。2,执行main方法时会在栈内存中开辟一片空间,在栈区中分配了一个变量p。3,在堆内存中开辟实体空间,并分配一个内存首地址值。 4,在空间中进行属性的空间分配,并进行默认初始化。5,对空间中的属性进行显示初始化。6,属性进行构造代码块初始化。7,调用该实体对应的构造函数进行构造函数初始化。8,把首地址值赋给p,则p指向了该对象。
封装用于隐藏对象的实现细节。仅对外提供公共访问方式。好处是将变化隔离,提高复用性,安全,便于使用。
static:所有对象共享的成员可以用静态修饰,成员可以用对象、也可以用类名调用。静态随着类的加载而存在,优先于对象,所以在静态方法中不能存在非静态成员。this和super也不可以。 好处是:节约内存 弊端是:存在时间太长。
this和super不可以同时出现在构造函数中,因为它们都只能在第一行。子类的构造函数中,第一行默认是super(),即调用父类的空参构造函数,若父类没有空参构造函数,则需显示的调用相应的父类构造函数。子类之所以调用父类的构造函数,是因为子类继承了父类的成员,要通过调用父类构造方法来查看父类成员的初始化情况。
继承是“is a”,实现接口是“like a”。
子类方法覆盖父类方法时,访问权限应该大于等于父类,抛出的异常应小于等于父类异常。
继承打破了封装性,所以一些不想被继承的类,或者一些不想被覆盖的方法可以用final来修饰。final可以修饰类、方法、变量。
抽象类:抽象类、抽象方法须由abstract修饰。方法只能声明,没有方法体。抽象类不可以被创建对象(但是有构造方法,可以给子类进行初始化)。而且抽象类中可以定义非抽象方法。抽象关键字不可以和static、private、final。
接口:interface,接口中的成员都有固定的修饰符。成员函数:public abstract 成员变量:public static final。 子类可以单继承,但是可以多实现。实现接口必须重写所有的抽象方法,否则类将抽象,无法创建对象。
接口是对外提供的规则,是功能扩展,降低了耦合性。
多态:事物的多种形态。前提是必须要有关系:继承或者实现,通常会有覆盖操作。 好处:提高了扩展性。 弊端:自能访问父类中存在的方法,不可以访问子类中特有的方法。多态就是父类的引用接收了子类的对象。
在多态当中,成员变量、静态函数编译运行都看左边。 成员函数编译看左边,运行看右边。