一、接口
- 接口语法
1.把类的class替换成interface------>接口
2.接口中的成员变量,默认必须用public static final修饰,可以省略不写。
3.接口中的方法都是默认必须使用public abstract修饰,可以省略不写。
接口=常量(public static final)+抽象方法(public abstract)
4.接口不能被实例化对象
5.接口中没有构造函数
6.实现类实现接口必须重写接口中所有的抽象方法,除非实现类是抽象类。 接口 和 实现类 使用implements连接
7.public interface demo{}
public class test implements demo{}
8.一个实现类可以有多个接口
9.一个类继承另一个类的同时,可以有多个接口
public class A extends B implements C,D{}
10.接口打破单继承,一个接口可以继承多个接口
public interfacce C extends A,B{}
11.类与类之间用extends 接口与类之间用implements,接口与接口之间用extends
12.类与类之间强调的是从属关系,接口与接口之间强调的是功能。
13.接口可以使用多态
implements +重写+向上转
二、object类
object类是根类(老祖)
- hashCode()
1.返回值是int类型
2.含义:两个对象的地址相同,则hashCode()返回值哈希值是相等的,若对象的地址不相同,那么哈希值也就不一样。
哈希值:内存地址转换的整数
应用场景:
哈希表(散列表)---->是数据结构
HashMap是集合
HashMap的底层原理是哈希表
哈希表需要hashCode()支持
哈希冲突:重写可能会导致哈希冲突。
- toString()方法
1.返回值String
2.全限定类名+@+16进制
3.建议重写toString()方法,重写可以输出我们想要的东西
package java学习.Object;
public class ToString1 {
}
//
package java学习.Object;
public class ToString {
public static void main(String[] args) {
ToString1 t = new ToString1();
System.out.println(t);
System.out.println(t.toString());
}
}
结果
java学习.Object.ToString1@1b6d3586
java学习.Object.ToString1@1b6d3586
java移位运算的小技巧
-
左移一位相当于乘以2的一次方,左移n位相当于乘以2的n次方。
-
右移一位相当于除以2的一次方,右移n位就相当于除以2的n次方。
-
机器都是使用补码,运算也是使用补码运算。
-
正数的原码补码反码都一样。
-
补码与原码相互转换,其运算过程是相同的。
-
equals()
1.返回值:boolean
2.含义:比较两个对象是否相等,比较的是内存地址。
3.重写!!!!可以改成我们想要的结果
4.==也是比较对象的,equals也是可以比较对象的
==既可以比较基本数据类型,也可以比较引用数据类型。
equals只能比较引用数据类型(对象的引用)
5.instanceof 属于的意思 如:obj instanceof student (判断obj是否属于studnt类)
6.源码
public boolean equals(Object obj){
return this==obj;
}
- String类的equals(Object obj)
比较两个字符串是否相等,String a1="abc";String a2 = "abc";在常量池中的字符串可以使用"=="比较。但是若是String s1 = new String("abc");
String s2 = new String("abc"); 对象s1和s2在堆中存储,所以不要使用"=="比较,这里会比较的是堆的地址,应该用s1.equals(s2)比较。equals只比较的是内容。
s1="ab";
s2="c";
s3=s1+s2;
s4="abc";
s3是s1与s2相加而来,内存不再是常量池里了,而是在堆内。
- finalize()
GC垃圾回收机制,GC守护线程
GC垃圾回收器对对象回收垃圾时,会调用fanalize()方法,只要finalize()方法执行了,标志GC回收对象完成。
三、内部类
- 实例内部类
1.一个类的类体嵌套另一个类
2.内部类直接调用外部类的属性和方法
3.外部类通过创建内部类对象调用内部类的成员。
4.测试类创建对象调用内部类的成员
外部类.内部类 对象名 = new 外部类().new内部类();
- 局部内部类
1.局部内部类在方法体中,作用域在方法体中,public不能修饰。
2.局部内部类可以直接调用外部类的属性和方法,但是其他类都不可以调用局部内部类。
3.出了方法体,局部内部类不再起作用。
- 静态内部类
1.静态内部类只能调用外部类的静态成员!
2.外部类通过内部类名调用内部类的静态成员,内部类类名不可省略。
3.测试类,如果调用的是内部类的静态成员,直接,外部类.内部类.成员 调用
如果调用的额是内部类的非静态成员,创建对象调用
外部类.内部类 对象名=new 外部类.内部类();
- 匿名内部类
1. 匿名内部类属于特殊局部内部类,存在方法中,并且只有类体,没有名字和任何修饰。
2. {};
3. 在接口,抽象类中可能会用到
package java学习.Object;
public interface Animaltest {
void eat();
}
//
public class TTest {
public static void main(String[] args) {
//匿名内部类还是Animaltest的实现类
Animaltest a1 = () -> System.out.println("hhh ");
}
}
//或下面这个测试
package java学习.Object;
public class TTest {
public static void main(String[] args) {
Animaltest a1 = new Animaltest()
//匿名内部类还是Animaltest的实现类
{
@Override
public void eat() {
System.out.println("hhh ");
}
};
}
}