四、面向对象
面向对象概念:
一切皆对象,将不同类型的数据和特征抽象出来,重新定义一种事物( 抽象数据类型),起名后,就是一种类型,在使用数据时,使用类的实例,通过调用实例,来使用我们所需要的数据。
类的定义:
修饰词 class className{
成员变量
方法
}
对象的实例化:
类型 变量 = new 构造器(有参传参) (地址传递,值传递)
属性和方法的访问(调用):
变量.属性
变量.方法
NullPointerException:
当变量内没有地址信息时,也就是这个变量没有指向任何对象。所以,当访问变量.属性,变量.方法时,相当于在运行代码时出现了null.属性,null.方法,就会出现运行时异常。null:是引用类型的默认值
构造方法:与类名相同,
格式:修饰词 类名(参数列表){
}
作用: 用于属性的初始化
每个类中肯定都会有一个构造方法。如果一个类中没有声明一个明确的构造方法则会自动生成一个无参的什么都不做的构造方法。一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法了。
构造器也可以重载
this(有参传参)---在类的构造器中调用本类中的其他构造器
匿名对象:
只使用一次的对象,称为匿名对象。
匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。
五、String
一旦创建,不可改变。不能被继承
String的比较有两种方式:
==:地址值比较
equals()方法:内容比较
栈(Stack):存放基本类型的数据和对象的引用。
堆(Heap):用于存放所有的Java对象,即用new产生的数据。
静态域:存放在类中用static定义的静态成员。
常量池:常量值通常直接存放在代码内部。
六、this关键字和static关键字
this:
this是一个隐式的引用变量,指向将要创建的对象。
可以使用this调本类中的方法、属性、本类的构造方法。
使用this调用构造方法必须也只能放在构造方法的第一行
static:
修饰方法:
静态方法属于类的,应该类名.方法名 这么调用。对象的引用变量也可以调用
非静态方法属于对象的,只能使用引用变量去调用
在一个类中,静态方法里只能直接调用其它的静态成员(包括变量和方法),而不能直接访问同类中的非静态成员。
修饰属性:
静态属性,属于类,用类名调用。属于公有资源
通过某一个变量修改后,其他变量使用时都是修改后的数据。
static{
用于加载资源,如图片,视频,音频等
}
静态块执行的时机是加载期间。执行一次
动态块执行的时机是new之前。 new一次,执行一次
七、继承
当某一个类的功能不够用时,在不修改此类的基础上,我们将此类的功能继承到另外一个自定义的类型中,再扩展其他功能。
类的继承格式:
修饰词 subClass extends superClass{
}
subClass 是子类,也叫派生类。
superClass是父类,也叫基类,超类
在Java中只允许单继承,不能使用多重继承,即:一个子类只能继承一个父类。但是允许进行多层继承,即:一个子类可以有一个父类,一个父类还可以有一个父类。
子类继承了父类中所有能继承过来,包含,私有方法和私有属性。但是子类没有权限使用父类的私有方法等(不可见)
构造方法不能被继承,只能被调用,使用super(有参传参)。子类对象在实例化之前必须首先调用父类中的构造方法之后再调用子类自己的构造方法
方法的重写:
继承关系,方法名相同,参数类型列表相同
返回值类型:可相同,也可以(子类方法返回值类型是父类方法返回值类型的子类)
修饰词: 可相同,也可以(子类修饰权限大于父类修饰权限)
使用super可以从子类中调用父类中的构造方法、普通方法、属性。
强调:子类可以自定义自己的属性,但是不建议与父类重名。
八、final关键字
修饰属性:即为常量,只能进行初始化,不能进行第二次赋值
修饰方法: 不能被重写,即不能被子类所覆盖
修饰类 :不能被继承
全局常量:public static和final一起修饰的变量就是全局常量
九、抽象类(like a 关系)
abstract修饰,不能被final修饰
特征:
1:抽象类中可以提供构造器,但是不能被调用
2:抽象类中的方法不一定是抽象方法
3:有抽象方法的类,一定是抽象类
4:抽象方法:没有方法体,即没有{},不能省略abstract,最好使用public
5:抽象类不能被直接实例化。抽象类必须被子类继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法。
6: 只支持单继承,但是可以继承传递
十、接口(is a 关系)
关键字interface 修饰词是public,不写的话系统提供
接口就是一种规范,其他商家,第三方厂家默认遵守
用来实现类的多继承
特征:
1:接口不能提供构造器,不能实例化
2:接口里的方法 一定是抽象方法,可以省略abstract,public
3:接口里的属性,一定是全局常量 可以省略public static final。可以用接口名.属性名的方式引用其中的全局常量
4:接口与接口的关系:可以继承多个接口
接口与抽象类的关系:实现关系 implements
接口与普通类的关系:实现关系 implements
当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的
Java8对接口的改变:
增加了静态方法:主要是为了完善设计模式即工厂方法
增加了默认方法:格式: default 返回值类型 方法名(参数列表){
方法体
}
接口的默认方法不能通过接口名直接调用
十一、多态
多态的定义: 同一种行为,作用于不同的对象,会产生不同的结果。允许不同类的对象,对同一消息做出不同的响应。
向上转型:子类对象->父类对象
对于向上转型,程序会自动完成,格式:
父类 父类对象=子类实例;
向下转型:父类对象->子类对象
对于向下转型,必须明确的指明要转型的子类类型,格式:
子类 子类对象=(子类)父类实例;
多态性主要有两种体现:方法的重载和对象的多态性
多态的实现:
继承实现的多态:
方法的重写:派生类(子类)将继承超类(父类)所有的变量和方法,可根据需要来重新定义超类的变量和方法,甚至增加或者修改部分内容,以提供不同形式的实现。
抽象类实现的多态:
抽象类被继承之后需要实现其方法,不同的子类对其抽象方法的实现也不同
接口实现的多态:
类似于抽象类
多态的好处:
程序具备了动态的扩充性
多态的机制只用在方法上,对属性不适用,只用在非静态方法上,对静态方法不适用
instance of :
可以用instanceof 判断是否一个对象实现了某个接口;也可以用它来判断一个实例对象是否属于某一个类。
语法格式:
对象 instanceof 类(或接口)
返回值:true false