接口:interface
定义的接口必须由public修饰,可以实现多继承,会获得父接口中所定义的一切。接口中定义的变量只会是常量(public static final 修饰),没写public static final会默认加上。且接口中的方法也是public abstract类型的。不写也是默认该类型。注意:接口不是类,没有构造方法!
JDK1.7之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。
JDK1.8后,接口中包含普通的静态方法 implements
内部类:
1. 内部类可以直接访问外部的私有属性。但是破坏了类的结构。
2. 内部类可以使用public、default、protected 、private以及static修饰。
3. 是一个编译时概念,一旦编译完成就是两个独立的类,且内部类的成员变量/方法名可以和外部类相同。
4. 由于编译后会生成两个对应的字节码文件(Outer.class和Outer$Inner.class两个类的字节码文件(故可以通过$判断是否是内部类)在项目左边专门存放字节码文件的地方查看)。
5. 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,在只为外部类提供服务的情况下可以优先考虑使用内部类。
6. 可分为
1)成员内部类: 相当于外部类的成员
2)静态内部类:(1)不允许访问外部类的非static属性
(2)若内部类中的方法是静态的,则内部内必须为静态的---创建内部类对象:外部类类名.内部类类名 Outer.Inner i=new Outer.Inner();)
![e83489e1d3821d1e16a9f8111c186e8c.png](https://i-blog.csdnimg.cn/blog_migrate/0bb155b3a4fa65dde08dcf86d1e1d6ca.jpeg)
3)方法中的内部类:只能在方法中使用,相当于方法中的局部变量。
![3b2ba6109bbde4e0596772398f826f23.png](https://i-blog.csdnimg.cn/blog_migrate/334e328d05373a3aa1a4185fefe9d645.jpeg)
4)匿名内部类:(前提:存在继承或实现关系)
![ddc152a30f2ab3b3c6ef0f85e97d05b9.png](https://i-blog.csdnimg.cn/blog_migrate/d0eec347f99f84fe8142384c964cd957.jpeg)
常量池:
![bd9b589c1c864060b41a051bf0fe2d6f.png](https://i-blog.csdnimg.cn/blog_migrate/ec6990867ee94b0b50b65349da055523.jpeg)
会在堆内开空间:两种情况:1)有变量参与运算 2)new 关键字
字符串相等的判断:
引用数据类型有两种相等的判断:
==:比较两字符串地址是否相等 equals(obj):比较两字符串内容是否相等
二维数组的实始化:
1) int intA[][]={{1,2},{2,3},{3,4,5}};
2) int [][] intB=new int[3][5];
3) int []intC []=new int[3][];
intC[0]=new int[2];
intC[1]=new int[3];
intC[2]=new int[5];
二维数组的遍历:
![d5a3e769592e393803f6bcedfcbf5c74.png](https://i-blog.csdnimg.cn/blog_migrate/36672aba002585c95d568e2694c78e75.jpeg)
Java.util.Arrays
![ae54810d3102d09b01ead0cca468ef1b.png](https://i-blog.csdnimg.cn/blog_migrate/3dbed96adaa21aac57abb95ab13d441f.jpeg)
Array.equals(数组a,数组b)使用的是Arrays里面的equals方法。比较的是两数组的顺序和值是否一致
数组a.equals(数组b),执行的是Object里面的equals方法,比较的是地址值。