面向对象(下)
static
静态的
可以用来修饰属性、方法、代码块、内部类
1、静态变量、类变量
我们创建对象时,每个对象都拥有一套类的非静态变量,修改其中一个对象的非静态变量,不会改变其他对象中的非静态变量
创建多个对象,多个对象共享一个静态变量,修改其中一个对象中的静态变量,其他对象调用的时候会发向静态变量已经被修改过了
静态变量随着类的加载而加载、加载早于对象的创建
因为类只会加载一次,所以静态变量也只会加载一次
2、使用 static修饰的方法
静态方法只能调用静态的方法或者属性
非静态方法中都能调用
静态方法内不能使用this、super的关键字
开发中如何确定一个属性是否要声明为static
属性
属性被多个对象共享并且一致
类中的常量
方法
操作静态属性的方法,通常static
工具类的方法习惯上是static
设计模式
单例设计模式
饿汉式
懒汉式
饿汉式:对象加载时间长
线程安全
懒汉式:暂时线程不安全—》学习线程后修改
MAIN
- main方法作为程序的入口
- main也是一个普通的静态方法
代码块
{}
static来修饰
内容可以有输出语句
随着类的加载而执行
每创建一次对象就执行一次非静态代码块
可以在创建对象的时候对对象的属性进行初始化
final
修饰类、方法、变量
final修饰类
不能再继承了 ep:string、system等类
final修饰方法
不能被重写
final修饰变量
此时的变量称为常量
修饰属性:可以考虑复制的位置有:显式初始化、代码块内赋值、构造器初始化
abstract:抽象的
abastract可以用来修饰结构、类、方法
抽象类:修饰类之后,不能实例化
构造器在子类对象中还可以继续使用
抽象方法:只有方法的声明。没有方法体
public abstract void eat();
抽象方法一定在抽象类里
子类重写了父类的所有抽象方法后,次子类方可实例化
如果没有重写全部抽象方法,那么子类也是抽象类
abstract不能用来修饰属性、构造器
不能修饰私有方法、静态方法、final方法
接口
- java不能多继承,用接口达到多继承的效果
- 具有功能,但不是is a的关系,使用接口
- 本质是一种规范、标准、契约
接口的使用
- 使用interface来定义
- Java中接口和类是并列的结构
如何定义接口:定义接口的成员
3.1 JDK7以前<br /> 只能定义全局常量和抽象方法:<br /> 全局常量:public static final,书写时可以省略<br /> 抽样方法:public absteact,同样可以省略<br /> 3.2 JDK8以后还可以定义静态方法、默认方法default <br /> 接口中定义的静态方法只能用接口调用<br /> 实现类的对象可以调用接口的默认方法 ,如果实现类重写了默认方法,调用的就是重写后的方法<br /> 父类和接口都声明了同名同参的方法,子类没有重写,调用的是父类的方法 <br /> 接口.super.方法可以调用接口的同名同参或者被重写的方法<br /> 4. 接口不能定义构造器,不能实例化<br /> 5. java开发中接口都通过类去实现的方式去实现<br />如果实现类覆盖了接口中所有的方法,那么实现类就可以实例化<br />如果没有,那么实现类仍是抽样类<br />class plane implements Flybale{<br />}
Java类可以实现多个接口,但是必须全部覆盖抽象方法
class 类 extends 父类 implements 接口a、接口b、接口c
接口可以多继承性
interface a{}
interface b{}
interface cc extends a,b{}
例如:和电脑做数据传输就要用usb,这就是一个规范,不管什么设备,只要和电脑做传输,就要定义usb这个接口
内部类
一个类A声明在类B内,A就是内部类
分类:成员内部类 vs 局部内部类(方法内、代码块内、构造器内)
成员内部类
作为外部类的成员
调用外部类的结构
可以被static修饰
可以被四种不同权限修饰
可以作为一个类
- 类内可以定义属性方法、构造器
- 可以被final修饰
- 可以被abstract修饰
实例化
静态
Person.Dog dog = new Derson.Dog();
非静态
Person p = new Person();
Person.Bird bird = p.new Bird();
属性声明为double类型时可以使用包装类比较大小
在内部类中调用局部变量时,要求此局部变量声明为final