接口是一种公共的规范标准,只要符合标准就可以使用
定义: public interface 接口名称{}
接口中可以包含:常量,静态方法,默认方法,抽象方法,私有方法
接口中的抽象方法:修饰符必须是 public abstract

接口不能直接使用,要用一个抽象类来使用
public class 实现类名称 implements 接口名称

接口的实现类必须重写接口的所有抽象方法,否则这个类必须是抽象类(抽象方法所在的类是抽象类)

默认方法:(解决接口的升级问题)
public default 返回值类型 方法名称(){};
默认方法可以直接被实现类继承下去,接口的默认方法可以被实现类调用,也可以被实现类重写。

静态方法
public static 返回值类型 方法名称 (){};
静态方法要通过接口名直接调用,不能通过实现类调用
接口名称.静态方法名()

接口的私有方法
抽取一个共有方法,解决两个默认方法重复代码的问题,但是这个公有方法不应该让实现类使用,因此它应该是私有化的

接口的成员变量
接口的成员变量其实是常量,要用public static final定义,也可以省略,但是依旧是常量,必须赋值,名称完全大写。

注意:
1.接口没有静态代码块与构造方法
2.一个类的直接父类唯一,但是一个类可以同时实现多个接口
3.如果实现类实现的多个接口有重名的方法,重写一次即可
4.如果实现类没有重写全部的抽象方法,那么它是一个抽象类
5.如果实现类的多个接口中有重名的默认方法,那么实现类中必须重写默认方法。
6.如果父类的方法与接口的方法冲突,优先用父类的方法。

多态
抽取所有子类的共性上升到了一个新的形态。
格式:

父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();
//即左父右子,左边的父类引用指右边的子类对象

对象的向上转型
其实就是多态的写法,右侧创建一个子类对象把它当作父类来使用,但是向上转型后无法调用原来子类特有的方法

向下转型还原
类似于一次强制转换

(子类名称) 对象名 = (子类名称) 父类对象
//将父类对象还原成原来的子类对象,需要先判断本来的类
//用instanceof方法
对象 instanceof 类名称
//返回一个boolean值,判断该对象原本是否属于此类

final关键字
1.用于修饰一个类:表示当前这个类不能有任何子类,一个类如果是final类,那么其中所有的成员方法都不能重写

2.修饰一个方法:表示这个方法是最终方法不能重写

因此,对于类和方法来说,不能同时使用abstract,final修饰,因为会矛盾

3.修饰局部变量:一次赋值,终身不变。对于基本类型来说是它的值不变,对于引用类型来说是变量的地址不能发生改变,但是可以通过调用成员方法修改变量的值(setxxx)

4修饰成员变量:由于成员变量有默认的值,用了final之后必须手动赋值,final的成员变量要么直接赋值要么用构造方法赋值,必须保证类中所有重载的构造方法都能对final赋值。

内部类
1.内部成员类
2.局部内部类(包括匿名内部类)
格式:

public class 外部类名{
	修饰符 class 内部类名{
	}
}

内用外可随意访问(理解成外部的内容相对于内部来说类似于全局变量?);外用内,用通过内部类对象来使用

成员内部类的使用:
1.间接:通过外部类对象,调用外部类方法,在里面间接使用内部类对象
2.直接: 外名.内名 对象名 = new 外名().new 内名();

内部类的同名变量访问:

//访问同名变量的方法
public class Outer{
	int num = 20;
	public class Inner{
		int num = 10;
		public void show(){
			int num = 30;
			sout(num);
			sout(this.num);
			sout(Outer.this.num);
		}
	}
}

局部内部类
一个类定义在方法内部,出了方法就不能用了,因此要在方法中创建对象从外部调用此方法

//定义一个类的时候 外部类可以用public/default 成员内部类都可以,局部内部类什么也不用
public class Outer{
	int num = 10;
	public void show(){
		int num = 20;//这个num该怎么访问?
		class Inner{
			int num = 30;
			public show_info(){
				int num = 40;
				sout(num);
				sout(this.num);
				sout(Outer.this.num);
			}
		}
		Inner inner = new Inner();
		inner.show_info();
	}
}

局部内部类如果想访问所在方法的局部变量,那么这个局部变量必须是有效final的。

匿名内部类
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略该类的定义(不用再去创建一个实现类了),改为使用匿名内部类。
格式:

接口名称 对象名 = new 接口名(){
	//重写抽象方法
}

需要注意的是,这种方法创建对象时只能使用唯一的一次。
匿名内部类是省略了子类/实现类的名称,匿名对象是省略了对象名,不是一回事。