面向对象的三大特性:
一、封装性
1. 成员变量和局部变量的区别
-
成员变量定义在类中,整个类的可以访问;局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
-
成员变量存在于堆内存的对象中。局部变量存在于栈内存的方法中(局部代码块)。
-
成员变量随着对象的创建而存在,随着对象的消失而消失;局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
2、成员变量和静态变量的区别
- 生命周期不同,成员变量随着对象的创建而存在,随着对象的被回收而释放。静态变量随着类的加载而存在,随着类的消失而消失。
- 调用方式不同。成员变量只能被对象调用。静态变量可以用对象调用,还可以用类名调用。
- 数据的存储位置不同。成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。静态变量数据存储在方法区(的静态区),所以叫对象的共享数据。
3、构造函数
作用:可以给对象初始化,创建对象的时候就调用了。
-
在类中如果定义了构造了,那么默认的构造函数就没有了
-
定义构造函数的原因,对象一产生就具有的内容。
-
可以定义私有化构造函数来阻止对象的创建。
4、关键字
- this哪个对象调用就代表哪个对象,把局部变量的值传递给成员变量。关键字this也可以用于在构造函数中调用其他构造函数,但对this的调用必须是构造函数的第一句。
- static的特点:
- static修饰的成员被所有的对象所共享。
- static优先于对象存在,static修饰的成员随着类的加载就已经存在了
- 可以被类名直接调用
- 静态使用的注意事项:
- 静态方法只能访问静态成员。
- 静态方法不能使用this或者super关键字
- 主函数是静态的
5、主函数
- public:因为权限是最大的。
- static:不需要对象,直接用主函数所属类名调用即可。
- void:主函数没有具体的返回值。
- main:函数名,不是关键字,只是一个jvm识别的固定名字
- String[] args:这是主函数的参数列表,是一个数据类型的参数。
- 格式固定。
6、单例设计模式
-
一个类在内存里的对是唯一性的;
//饿汉式 class Single//类一加载,对象就存在了 { private static Single s = new Single(); private Single(){} public static Single getInstance() { return s; } } //懒汉式 class Single2//类加载,没有对象,只有调用getInstance方法时, //才会创建对象。 { private static Single2 s = null; private Single2(){} public static Single2 getInstance() { if(s==null) s = new Single2(); return s; } }
二、继承
用extends修饰
1、继承的作用:
- 提高了代码的复用性。
- 让类与类之间产生关系,给多态提供了条件。
- 注意事项:Java支持单继承,不直接支持多继承。但Java支持多重继承。
单继承:一个子类只能有一个直接父类。 多继承:一个子类可以有多个直接父类。
2、关键字
- this代表一个本类对象的引用,解决局部变量和成员变量名字相同的问题。
- super代表一个父类的空间,解决父类变量名字和子类变量名字相同的问题。
- final可以修饰类,方法,变量。final修饰的类不能继承,final修饰的方法不能被覆盖,final修饰的变量是常量
3、成员函数
- 当子父类函数一模一样的情况下,会运行子类的函数。这种现象称为覆盖,也就是重写。
- 覆盖注意事项:子类方法覆盖父类方法时候,子类权限必须大于或等于父类权限。
- 什么时候使用覆盖:当一个类进行子类扩展时,子类需保留父类的功能声明,但要定义子类中功能的特定内容时就要使用覆盖。对子类进行升级时,保留父类的内容时,可使用super.函数名();
4、构造函数
- 子类的实例化过程:子类中所有的构造函数都会默认调用父类的空参构造函数。
- 如果父类中没有空的构造函数,子类的构造函数中必须用super调用父类中的构造函数。
- super语句必须定义在第一行,父类的初始化必须先完成。
- 等super初始化完成后,才进行子类的成员变量显示初始化。
5、抽象类 abstract
- 类中有抽象方法的,类也要加 abstract 修饰。抽象类中可以同时存在抽象函数和非抽象函数。
- 抽象类不可以实例化。但有构造函数,给其子类初始化。
- 抽象类必须被子类覆盖所有的抽象方法后才可以实例化,不然子类还是抽象类。
- 抽象类可以没有抽象方法,通常为了不给类创建对象。
- 抽象关键字不能和private,static,final共存
6、接口 interface
- 用interface而不用class关键字。
- 接口中常见的成员,而且这些成员有固定的修饰符:
- 全局变量:public static final
- 抽象方法:public abstract
- 接口中的成员权限都是公共的,只能定义抽象方法。
- 实现接口 用implements ,例如class 类名 implements 接口名{}。
- 接口不可以实例化,实现了接口的子类需覆盖所有的抽象方法才能实例化,不然子类是抽象类。
- 一个类可以实现多个接口,解决了多继承的不确定性。
- 一个类在继承另一个类的同时,还能实现多个接口。
- 接口与接口之间是继承关系,还可以多继承。
三、多态
- 多态是指一个对象对应着不同的类型,代码中体现为父类或者接口的引用指向其子类对象。父类名 变量名1 = new 子类();但不能调用子类中特有的方法,可以用转型 子类 变量名2 = (子类名)变量名1; 实现
- instanceof:用于判断对象的具体类型。对象名 instanceof 类名。
- 成员的特点:
- 成员变量:编译和运行都参考等号左边。
- 成员函数:编译看左边,运行看右边。
- 静态函数:编译和运行看左边,不涉及多态性,运行不需要对象。
四、内部类
把一个类定义在另一个类里面,里面那个类就叫做内部类。
- 访问特点:
- 内部类可以直接访问外部类中的成员,等于是外部类的成员。
- 外部类访问内部类需要创建对象
- 创建内部类对象时,外部类名.内部类名 变 = new 外名().new 内名();
- 内部类可用成员修饰符,如public,static....。
- 如内部类是静态的,外名.内名 变 = new 外名.内名();
- 如果内部类的成员是静态的,内部类也要是静态的。
- 内部类在局部位置上,只能访问局部中被final修饰的局部变量。
- 匿名内部类必须是继承外部类或实现接口的。
- 匿名内部类就是子类的对象,格式:new 父类或接口名(){子类内容};