八大基本类型:
byte short int Long float double char boolen
类里定义的变量叫 : 成员变量
方法里面定义的变量叫 : 局部变量
this关键字:
this关键字,作用是用来记录当前方法是被哪个对象调用的,
哪个对象调用方法,this就记录哪个对象.
可以解决:成员变量和局部变量重名的方法
super关键字:
标识父类内容的关键字,也可以区分 子父类重名的成员变量
构造里面默认有个 super()
Static关键字:
static关键字: 它是一个修饰符,可以修饰类中的成员变量,成员方法。
特点: 被static修饰的成员变量我们称为类变量(静态变量),修饰的方法称为:类方法(静态方法)
被static修饰的内容是所有对象共享的,所有和对象无关,只和当前的类相关,因此被static修饰的成员,访问的方式是使用类名.成员(变量,方法);
静态代码块: 在类加载的时候就执行 在成员变量位置 用static{内容}
final关键字:
类不能继承,方法不能重写,变量不能改变
类加载的过程:
JVM从上往下逐行加载
1.把静态的加载到方法区静态区域 非静态的加载到方法区非静态区域
2.给静态的成员变量 付默认值,然后在显示赋值
3.在2的时候 如果遇到静态代码块就执行静态代码块
构造方法: public 类名{}
创建类默认有一个无参构造方法
new 出来对象 其实就是调用无参构造创建的
当类中有了有参构造,默认的无参构造将被覆盖,所以需要重新书写无参构造
构造代码块:
构造代码块执行优先于构造方法
写在类的成员位置,方法外
{所有构造方法都需要执行的代码写到这里} <---- 这就是构造代码块
构造方法也是方法 也可以被重载 (无参构造,有参构造就是重载)
继承:
extends关键字, 子类可以使用父类 非私有成员
父类里面定义的是 事物共性的 属性(成员变量)和行为(方法)
成员变量的特点:
子类可以直接访问父类非私有的成员变量
子类访问 父类的成员变量用 : super.父类成员变量名
成员方法的特点:
子类可以访问父类的非私有成员方法
子类和父类方法重名: 就近原则 优先子类的, 如果需要访问父类的 需要super.成员方法
构造方法的特点:
必须和类名一致,构造方法不能被继承
构造方法的执行过程: 和对象创建过程差不多
1. new会在堆中开辟空间。
2. 加载非静态的成员变量。
3. 给所有的非静态成员变量默认初始化
4. 调用与传递参数一致的构造方法。 构造方法的执行有隐式的3步。
1. super(); // 调用父类的构造方法,给父类的成员变量赋值,然后让子类使用。
2. 成员变量显示赋值。
3. 执行构造代码块
4. 开始执行构造方法本身的代码
5. 当构造方法执行结束表示对象创建完成。
当父类中,没有默认的无参构造时,子类的super()语句,则调用不到父类的无参构造。子类需要手动调用父类的有参构造。
方法重写:
子类重写父类方法的时候 权限需要大于或等于父类.
必须和父类的 : 方法名相同,参数类表相同,返回值相同
方法重载:
方法名相同,参数类型 参数位置不同
方法的返回值类型 可以相同 也可以不同
抽象类: abstract 里面全是抽象方法
有抽象方法的类,当前类必须也声明是抽象类
抽象类不能创建对象, 因为抽象方法没有方法体 没有任何意义
抽象类有构造方法,是给子类创建对象时候构造里的super用的
接口:
接口是扩展额外的功能的,接口只封装了方法.
接口中没有构造方法,所以不能创建对象
接口中不能有变量,但是可以有常量,固定不变的值
接口中可以定义四种方法:
抽象方法 JDK1.7之前 : public abstract 返回值类型 方法名(参数)
默认方法 JDK1.8 : public default 返回值类型 方法名(参数){方法体}
可以重写也可以不重写
如果实现两个接口里面的默认方法名一样,则必须重写
静态方法 JDK1.8 : public static 返回值类型 方法名(参数){方法体}
直接 接口名.方法名 使用
静态方法不能重写
私有方法 JDK1.9: private static 返回值类型 方法名(参数){方法体}
给接口内部的 默认方法和静态方法使用的
多态:
多态的前提: 必须有继承和实现的关系
Java中: 父类引用指向子类对象
语法:
父类 变量名 = new 子类()
接口 变量名 = new 实现类()
多态对象在使用的时候:
多态会产生类型的向上提升, 只能调用父类的成员
编译时期 只关注父类 (所以子类 类型提升 是为了欺骗虚拟机可以编译成功)
解决弊端:
只能访问父类的成员,是因为子类类型向上提升.
解决:
将提升为父类的子类,向下转型
多态使用成员变量和成员方法注意:
编译时期状态: 只关注父类是否存在当前对象访问的成员
运行时期状态:
成员变量: 访问运行的依然是父类的成员变量
成员方法: 访问子类重写的方法 如果子类没有 那就调用父类
集合:
数组的长度不可变
集合就是一个容器,可以自动扩容.因为底层是数组,扩容的时候每次新创建一个数组
new ArrayList() 初始容量为10 , 第十一个就开始 自动扩容