面对对象编程
一、 包
包:是组织类的一种方式,就是一个文件夹,用package 关键字来表示
导入包中的类
public class Test {
public static void main (String[ ] args) {
java.util.Date date = new java.util.Date( );
System.out.println(date.getTime( )); }
}
上述方式较为复杂,可以使用import语句导入包
import java.util.* ; 导入java.util下的所有类
java.lang.* ; 由编译器自动导入
但是在实际使用中,还是建议显示指定要导入的类名。
例如:import java.util.* ;
import java.sql.*;
若在代码中定义Date这样的类,编译就会出错,因为util和sql中都存在Date类,无法判断到底是哪一个!
将类放到包中
- 在.java文件的最上方加上一个package 语句指定该代码在哪个包中
- IDEA中创建包的方法:src-New- package
- 包的命名规则:全小写,倒着起 (com.bit.www)
若在命令行下使用jdk运行包中的程序
(运行放在com包下的bit文件夹下的TestDemo程序)
1.编译:使用 javac com\bit\TestDemo.java
2.运行:使用 java com.bit.TestDemo - 在包下的 .java文件需要加入 package com.bit.TestDemo;
这取决于JVM的启动路径,若在文件所在位置启动JVM,则不需要加。
二、 访问权限
public:公有
private:私有
protected:保护
default:包访问权限
权限大小:public > protected > default > private
若在代码中未加public 等关键字,则默认为包访问权限
三、继承
继承是一个 is - a 的关系,子类继承父类,用extends 关键字来指定父类
目的:实现代码的复用
被继承的叫做父类,也称超类、基类
继承的叫做子类,也称派生类
子类继承父类,继承了父类除构造方法外的其他东西
子类的构造首先需要构造父类
可以使用super来调用父类的构造方法,帮助父类进行构造
- 在java中,只能进行单继承,不能进行多继承,即一个子类只能继承一个父类
- 对于父类的private 属性,子类无法访问
- 一般将父类的属性设为protected,子类中可以访问,同一个包中也可访问
四、 super 关键字
1.调用父类的方法 super.func( )
2.调用父类的属性 super.data;
3.调用父类的构造方法 super( );
- 调用父类的构造方法时,只能放在方法的第一行
super和this的对比:
五、代码块的执行顺序
- 父类静态代码块
- 子类静态代码块
- 父类实例代码块
- 父类构造代码块
- 子类实例代码块
- 子类构造代码块
- 静态代码块只执行一次!
- invokespecial 构造方法
invokevirtual 普通实例方法
invokestatic 静态方法
六、 多重继承/多层继承
子类可进一步派生出新的子类
例如:类B继承了类A,那么类C也可以继承类B
七、final关键字修饰类
被final所修饰的类为密封类,不能被继承
若不想类被继承,可在前面加上final关键字
八、多态
多态:(程序层次上)父类引用子类的对象,并且父类和子类有同名的覆盖方法。这个时候如果通过父类引用调用这个重名的方法,就会发生动态绑定。
使用多态的好处:
1.降低代码的复杂度及调用成本
2.可扩展能力强
多态发生的前提:子类引用父类对象
动态绑定:使用javap -c查看,编译时底层调用父类的方法
运行时,变为子类的方法
要发生动态绑定:
1.父类引用子类的对象
2.子类和父类由同名的覆盖方法
运行时多态:运行时子类和父类同名的方法的地址会覆盖原父类方法的地址
方法表是一个对象一张还是一个类型一张?
一个类型有一张方法表
class对象和方法表和类型一一对应
向上转型
定义:父类引用子类的对象,将子类的对象给父类
发生时机:
1.传值
2.传参
3.方法的返回值
重写
重写:方法名相同,返回值不同,参数列表相同,并且不在一个类中
( 返回值可以不同,但是返回值之间必须构成协变类型)
static方法不支持重写
private方法不支持重写
子类重写父类的方法:子类的权限一定要大于父类的权限
向下转型
定义:将父类的对象给子类
前提:必须先发生一次向上转型,向下转型的类型必须是父类的一个实例
例如:加入 if (animal instanceof Cat ) (Cat是animal的一个实例)
九、抽象类
- 抽象方法:没有实现的方法, 用abstract修饰
- 包含抽象方法的类叫做抽象类
- 抽象类可以包含抽象方法,也可以包含非抽象方法
- 抽象类无法实例化一个对象
- 一个普通类 若继承了抽象类,一定要重写抽象类中的抽象方法
- 抽象类可以继承抽象类,这样就不需要重写抽象方法
- 若一个普通类C继承了上述的抽象类,如果上述抽象类A并没有重写抽象类B的抽象方法,那么当前的普通类C一定要重写
- 抽象方法不能是private
- 抽象类不能被final所修饰,抽象类是为了实现继承
- 抽象类可以发生向上转型,创建子类对象
抽象类和普通类的区别:
十、接口
目的:为了实现多继承
以关键字interface来定义接口,接口命名时尽量以动词命名。
定义接口:
interface IShape {
public static final int a = 10;
public abstract void draw();
接口中的变量一定要初始化
接口中方法一定不能有具体的实现,都是抽象方法
- 接口中,void draw() 默认为public abstract void draw();
- int a =10-> 默认public static final int a =10;
普通类不能继承接口,但是可以实现implems,需要重写接口中的方法
接口不可以实例化,但是可以发生向上转型
一个类可以实现多个接口(implements A接口,B接口)
一个类可以先继承,再实现接口(继承在先,接口在后)
抽象类是可以实现接口的,但普通类B要继承这个抽象类A,这时需要重写接口的方法
接口与接口之间是不能发生实现的,但是它们之间可以继承,一个接口可以继承多个接口
抽象类和接口的区别: