1.类(class)
    格式:

    1. public class ClassName {
    2. //成员变量
    3. //成员方法(方法不需要加static,其他相同)
    4. }

    使用:类名 对象名 = new 类名();
    注意:
    a.由于class整个都是new出来的,所以成员变量在堆内存中,但是成员方法在堆中仅仅是地址值,用于向方法区中寻找方法。当然方法调用的时候需要在栈内存中。
    b.对象类型可以作为方法参数和返回值
    2.封装
    private关键字:代表私有权限,也就是private后的成员变量和方法只能在本类中才能访问
    格式:idea中可以帮助创建get set成员方法,set用于对变量赋值,get用于调用变量。

    1. public class Student {
    2. private String name;
    3. private int age;
    4. public void setName(String n) {
    5. name = n;
    6. }
    7. public String getName() {
    8. return name;
    9. }
    10. public void setAge(int a) {
    11. age = a;
    12. }
    13. public int getAge() {
    14. return age;
    15. }
    16. }

    this关键字:用于在当前类中对自身的引用,this即代表对象本身。
    构造方法:方法名与所在类名相同
    注意:
    若不提供构造方法,那么系统会给出无参构造方法。
    若已经提供构造方法,那么系统不会再提供无参构造方法。
    构造方法根据情况可以有好多重载。
    标准参考如下:

    1. public class ClassName{
    2. //成员变量
    3. //构造方法
    4. //无参构造方法【必须】
    5. //有参构造方法【建议】
    6. //成员方法
    7. //getXxx()
    8. //setXxx()
    9. }

    3.继承:对存在多个相同属性的类的整合
    作用:可以对父类的方法进行拓展
    格式:

    1. class 父类 {
    2. }
    3. class 子类 extends 父类 {
    4. }

    特点:
    a.子类对象可以使用父类对象中的成员变量和方法
    b.调用时会先在子类中寻找方法,若未找到再到父类中寻找
    重名:
    变量重名:若子类成员变量与父类重名,那么该变量访问到的是子类中的变量
    方法重名:又叫方法重写,声明不变,实现重新写
    super关键字:类似this关键字,用来在子类中访问父类中的成员变量和方法
    注意:
    a.一个类只可能有一个继承一个父类,但是可以多层继承。
    b.构造方法先执行父类的,再执行子类的
    4.抽象:abstract
    抽象类:在class之前加上abstract即变为抽象类
    例子:public abstract class 类名 { }
    抽象方法:在返回值之前加上abstract,且删除大括号即可
    例子:public abstract 返回值 方法名();
    特点:
    子类对象若想使用抽象成员方法,必须对抽象方法进行重写,也就是去掉abstract,并将方法的实现写入大括号
    注意:
    a.抽象方法只能在抽象类中定义,但是抽象类仍可以定义普通成员方法
    b.抽象类不能创建对象
    c.抽象类的子类必须重写父类中的所有抽象方法(若子类也是抽象类,那么子类的子类中必须有一个要重写抽象方法)
    5.接口:封装了抽象方法,默认方法和静态方法,简单来说就是一个内部全是方法的类
    定义:

    1. public interface 接口名称 {
    2. //抽象方法
    3. //默认方法
    4. //静态方法
    5. //私有方法
    6. }

    抽象方法:public abstract void method();
    注意:在接口中,抽象方法的public abstract可以省略
    默认方法:public default void method(){ 代码 }
    可以理解为接口中的普通方法,可以写入代码实现,也不需要必须重写
    静态方法:public static void method(){ 代码 }
    通过接口名称直接调用,不可以通过实现类调用
    私有方法:使用private关键字修饰,用来私有化接口中的默认方法和静态方法
    多继承:接口可以通过extends关键字来继承父接口,如果与父接口中默认方法有重名,那么子接口需要重写一次
    注意:
    a.接口中无法定义成员变量,但是可以定义接口常量,用public static final关键词修饰
    b.接口中没有构造方法,不能创建对象
    c.接口中没有静态代码块
    6.实现:对于接口中抽象方法的实现类,可以看作是接口的子类
    格式:接口与类不同的一点是一个实现类可以实现多个接口

    1. class 类名 [extends父类名] implements 接口名1,接口名2,接口名3...{
    2. //重写接口中抽象方法【必须】
    3. //重写接口中默认方法【不重名时可选】
    4. }

    注意:
    a.当不同的接口中有重名的默认方法时,必须重写
    b.当一个类既继承父类,又实现多个接口时,父类中的成员方法与接口中的默认方法重名,那么子类会执行父类中的成员方法
    7.多态:同一种行为具有多种表现形式
    体现:左父右子
    父类名称 对象名 = new 子类对象;
    接口名称 对象名 = new 实现类对象;
    优点:多态的对象可以方便整合,并且修改的时候直接在父类中修改即可
    缺点:多态的对象是父类类型,也就是说不使用子类的特殊方法和变量了
    8.引用类型的转换
    向上转型:多态写法
    特点:向上转型了之后,子类的特有方法就不能调用了(可以通过向下转型还原)
    向下转型:父类类型向子类类型向下转换的过程,类似变量类型中的强制类型转换
    格式:子类名称 对象名 = (子类名称)父类对象;
    注意:要向下转型的前提是该类型要与原本的类型要保持一致
    instanceof检查:得到一个boolean值,判断对象能不能作为转换的类型
    格式:变量名 instanceof 数据类型
    例子:If (Animal instanceof Cat) { 代码 }
    9.final关键字:表示最终的、不可变的

    final修饰 格式 作用
    public final class 类名 当前类不能有子类,因此其成员方法也不能被重写
    方法 public final void 方法名 该方法不能被覆盖重写
    变量 final 数据类型 变量名
    一次赋值,终生不变
    对于引用类型,表示地址值不变
    成员变量 final 数据类型 变量名 final之后的成员变量必须手动赋值,不使用默认值
    必须保证类当中所有构造方法必须都对该成员变量进行赋值

    10.访问权限

    public公共的 protected受保护的 default默认的 private私有的
    同一类中
    同一包中
    不同包的子类
    不同包中的无关类

    使用建议:
    成员变量用private,隐藏细节
    构造方法使用public,方便创建对象
    成员方法使用public,方便调用方法
    default表示默认的,也就是普通的权限,比如普通变量和方法,default一般可以不写
    11.内部类:一个事物内部还包含其他事物
    成员内部类:
    格式:

    1. class 外部类 {
    2. class 内部类 {
    3. }
    4. }

    权限:内用外,随意;外用内,需要内部类对象;(你的就是我的,我的还是我的)
    储存:在存储中,用$来标识内部类,如Body$Heart.class,表明该类的是内部类
    使用:
    间接方式:通过外部类中的成员函数使用内部类
    直接方式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
    例子:Body.Heart heart = new Body().new Heart();
    重名访问:通过 外部类名称.this.成员变量 访问外部类的内容
    局部内部类:类在方法中,只有该方法中可以使用该类
    注意:局部内部类不需要写修饰符
    访问:如果想访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
    匿名内部类:创建对象时只能创建唯一一次,但是不需要再单独创建一个实现类了,简单来说就是把实现类简化了
    例子:
    接口名称 对象名 = new 接口名称() { @Override 代码 }
    区分:
    匿名内部类:在【创建对象】的时候,只能创建唯一一次,
    如果希望多次创建对象,且内容一样,那么必须单独定义实现类
    匿名对象:在【调用方法】的时候,只能使用唯一一次,
    如果希望同一个对象调用多次方法,那么必须创建对象变量
    12.泛型:可以在类或方法中预支地使用未知的类型。当没有指定泛型时,默认类型为Object类型。
    格式:修饰符 class 类名<代表泛型的变量> { }
    例子:class ArrayList{ }
    含有泛型的方法:修饰符 <代表泛型的变量> 返回值类型 方法名(参数) { }
    例子:public void show(MVP mvp) { }
    使用:调用方法时传递什么类型的参数确定什么类型的方法
    格式2:修饰符 interface接口名<代表泛型的变量> { }
    例子:public interface MyGenericInterface{ }
    泛型的使用:
    在定义实现类的时候就确定泛型:
    public class MyImp1 implements MyGenericInterface { }
    始终保留泛型直到创建对象
    public class MyImp2 implements MyGenericInterface { }
    泛型的通配符:在使用泛型类或者接口的时候,如果不确定数据类型,可以使用?来代替。
    例子:public static void getElement(Collection<?> coll) { }
    注意:定义的时候不能用,只能在参数传递的时候用。但是一旦使用了通配符之后,只能使用Object类中的共性方法,集合元素自身方法不能使用
    受限泛型:
    // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
    public static void getElement1(Collection<? extends Number> coll){}
    // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
    public static void getElement2(Collection<? super Number> coll){}
    注意区分:
    泛型是需要在创建变量和方法的时候使用,而泛型的通配符是在传递参数的时候使用