-
面向对象思想
世界万物皆对象。
我们都知道编程思想有「面向过程」和「面向对象」。面向过程注重的是实现过程。比如说把大象装进冰箱里这个例子。
第一步:打开冰箱;
第二步:把大象塞进冰箱;
第三步:关闭冰箱;
以上三个步骤就是面向过程的思维,那面向对象呢?就是把这三步封装进冰箱这个对象里,只要有这个冰箱对象,大象就能塞进去冰箱,而不用去思考如何把大象塞进冰箱。 -
类和对象的关系
「对象」的集合就是「类」。
张三是一个具体的对象,李四是一个具体的对象。他们都属于 People 这个类。 -
成员变量和局部变量的区别
分四点来说
第一点:定义的位置不同。成员变量定义在class里,局部变量定义在方法体里或者语句里;
第二点:作用域不同。成员变量的作用域是整个class中,局部变量的作用域就相对小了;
第三点:内存中位置不同。成员变量在堆内存空间,局部变量在栈空间里;
第四点:生命周期不同。局部变量随方法运行完就结束了,成员变量还会存在与堆内存中等待回收; -
封装
类成员变量私有化就是封装的一种,提供get set 方法。
目的:
①提高代码复用性;
②隐藏实现细节,对外提供访问方式,便于调用;
③提高安全性; -
继承
代码复用性高,可以提升开发效率
注意事项:
①一个子类只支持单继承
②一个父类可以有多个子类
③支持多层继承 b extends a;c extends b -
抽象类
①不能实例化
②没有方法体
③抽象方法必存在于抽象类中
④强制子类必须实现抽象类的所有抽象方法
⑤抽象类中可以存在非抽象方法 -
接口
特殊的抽象类
①接口中全是抽象方法,无法定义普通的成员变量,只能是常量
②将功能的定义和实现分离,优化了程序设计
③权限锁死为public
④接口的好处:扩展功能,降低耦合性
⑤接口中可以多继承 -
抽象类和接口的区别
相同点:
①都位于继承的顶端,用于被其它类继承或实现
②不能直接实例化
③都包含抽象方法,子类必须重写
不同点:
①抽象类为部分方法提供实现,避免子类重复实现,提高代码重用性;接口中只有抽象方法
②一个类只能继承一个直接父类,却可以实现多个接口(接口弥补了 java 的单继承)
③抽象类是某个事物中应该具备的内容,继承体系是一种 is…a 的关系
④接口类是某个事物中额外的内容,继承体系是一种 like…a 的关系 -
多态
一种事物有多种形态,体现在父类引用变量可以指向子类对象。不过前提是有继承父类或者有实现接口。
①
多态有三种调用形式,普通类,抽象类,接口;举个例子
People p1 = new Student();
People p2 = new Teacher(); 父类引用变量指向子类对象。
使用多态后的父类引用变量在调用时,会调用子类重写后的方法。
②
成员变量有什么特征?
编译时,参考父类是否有这个成员变量,有则成功
运行时,运行的是父类的变量值
③
成员方法有什么特征?
编译时,参考父类是否有这个成员方法,有则成功
运行时,运行的是子类重写的方法
④向上转型,自动转换
好处:可以调用共有的成员
弊端:不能调用子类特有的方法
⑤向下转型,强制转换
可以调用子类特有的方法 -
构造方法
①new 对象的时候就在调用对象的构造方法
②子类构造方法的第一行有一个隐式代码 super()
③子类中所有的构造方法,无论重载多少个,第一行必须是super() -
final
修饰类,不可被继承;
修饰方法,不能被重写;
修饰变量,就成为常量,只能赋值一次;
修饰引用变量,内存地址终身不变 -
static
意义所在:共享数据的存在;
被修饰的成员,可以被 new 出来的对象调用,也可以直接类名调用;
类进入到方法区后,先加载自己的静态成员;
内存中,静态优先于非静态存在的;
静态中不能访问非静态;
生命周期跟着类消失而消失;
接口中的变量都是常量;
定义成员变量的时候,多个事物之间是否有共性的数据;
定义成员方法的时候,根据变量走,如果方法没有调用过非静态成员,将方法定义为静态; -
匿名对象
new Person().eat();
没有引用变量,只能使用一次,如果确定只调用一次,那就可以用匿名对象; -
内部类
将类写在其它类的内部,可以写在其他类的成员位置和局部位置(方法体里);
在描述事物时,若一个事物内部包含其他的事物,比如描述汽车,汽车内部还包含发动机,这时发动机就可以用内部类来描述; -
匿名内部类
定义实现类,重写方法,创建实现类对象,一步搞定;
前提 有继承或有实现;
new 接口或父类(){重写抽象方法};
只能写在方法中; -
代码块
构造代码块,new 一次,执行一次,优先于构造方法‘
静态代码块,无论 new 几次,只执行一次,优先于构造代码块;