Java的八大常用类
文章目录
1.内部类
- 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
-
成员内部类
成员内部类:类比成员方法,不能拥有静态域但是可以访问外部类的静态域
示例
package com.oop.demo09; public class Outer { private int id=10; public void out(){ System.out.println("这是外部类的方法"); } public class Inner{ public void in(){ System.out.println("这是内部类的方法"); } //获得外部类的私有属性 public void getId(){ System.out.println(id); } } } //一个java类中可以有多个class类,但是只能有一个public class类 class A{ public static void main(String[] args) { } } Application: package com.oop; import com.oop.demo09.Outer; public class Application { public static void main(String[] args) { //new Outer outer = new Outer(); //通过这个外部类来实例化内部类 Outer.Inner inner = outer.new Inner(); inner.in(); } }
-
静态内部类
定义在外部类的内部,使用static修饰,类比静态方法,静态内部类不需要外部类对象产生就能使用,不能访问外部类的成员域,但能访问静态域
static int age; String name; //静态内部类 - 类比静态变量 static class Inner { public void test(){ System.out.println(age); System.out.println(name); } }
静态内部类的创建语法:
1.外部类内部:与成员内部类一样
2.外部类外部:StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
-
局部内部类
定义在方法内部:类比局部变量
1.对外部完全隐藏,因此方法内部类不能有任何访问修饰符
2.方法内部类没有访问形参是,这个形参是可以在方法中随意修改的,一旦方法内部类中使用了形参,这个形参必须被声明为final
//局部内部类 public void method(){ class Inner{ public void in(){ } } }
-
匿名内部类
1.必须继承一个抽象类或者实现一个接口
2.没有构造方法
package com.oop.demo09; public class Test { public static void main(String[] args) { //没有名字初始化类,不用将实例保存到变量中 new Apple().eat(); UserService userService = new UserService() { @Override public void hello() { } }; } } class Apple{ public void eat(){ System.out.println("1"); } } interface UserService{ void hello(); }
内部类的优点
1、每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整。
2、方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
3、方便编写事件驱动程序。
4、方便编写线程代码。
2.Object类
1.Object类是超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
2.任何类如没有书写extends显示继承某个类,都默认直接继承0bject类,否则为间接继承。
3.0bject类中所定义的方法,是所有对象都具备的方法。
4.0bject类型可以存储任何对象。
(1)作为参数,可接受任何对象。
(2)作为返回值,可返回任何对象。
-
getClass()方法
public final native Class<?> getClass(); 返回 this 的运行时类。返回的对象是由所表示类的方法锁定的对象。ObjectClassstatic synchronized 实际结果类型为 Class<? 扩展|X|>|十|是调用 getClass 的表达式的静态类型的擦除。例如,此代码片段中不需要强制转换: Number n = 0; Class<? extends Number> c = n.getClass(); 返回: 表示此对象的运行时类的对象。Class
注:此处的native关键字
使用native关键字修饰的函数(方法),说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。
返回引用中存储的实际对象类型(返回一个class类型的值)
主要应用:通常用于判断两个引用中实际存储对象类型是否一致
代码示例:
Student类:
package com.commonclass;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Test类:
package com.commonclass;
public class Test {
public static void main(String[] args) {
Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb", 18);
//判断s1和s2是不是同一个类型
Class class1 = s1.getClass();
Class class2 = s2.getClass();
if (class1==class2){
System.out.println("s1和s2属于同一类型");
}else {
System.out.println("s1和s2不属于同一类型");
}
}
}
运行结果:
s1和s2属于同一类型
Process finished with exit code 0
-
hashCode方法
public int hashCode(){ }
返回对象的哈希代码值。支持此方法是为了使哈希表(如
HashMap 提供的哈希
表)受益。总合同是:
hashCode
- 每当在执行 Java 应用程序期间在同一对象上多次调用该方法时,该方法都必须始终返回相同的整数,前提是不修改在对象比较中使用的任何信息。此整数不必从应用程序的一次执行到同一应用程序的另一次执行保持一致。
hashCode``equals
- 如果根据方法,两个对象相等,则在两个对象中的每个对象上调用该方法必须产生相同的整数结果。
equals(Object)``hashCode
- 如果根据
equals(java.lang.Object)
方法,如果两个对象不相等,则不需要在两个对象中的每一个上调用该方法必须生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。hashCode
尽管合理实用,但类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但 Java™ 编程语言不需要这种实现技术。
Object
-
返回:
此对象的哈希代码值。
-
另请参阅:
equals(java.lang.Object)
,System.identityHashCode(java.lang.Object)
- 每当在执行 Java 应用程序期间在同一对象上多次调用该方法时,该方法都必须始终返回相同的整数,前提是不修改在对象比较中使用的任何信息。此整数不必从应用程序的一次执行到同一应用程序的另一次执行保持一致。
小结:(可以当作地址来看但它本质上不是地址)
- 提高具有哈希结构的容器的效率
- 两个引用,如果指向的是同一个对象,则哈希值肯定一样
- 两个引用,如果指向的是不同对象,则哈希值是不一样的
- 哈希值主要根据地址号来!不能将哈希值完全等价于地址
- 在后面的集合中hashCode如果需要的话,也会重写
代码示例:
package com.commonclass;
public class Test {
public static void main(String[] args) {
Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb", 18);
//hashCode方法
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Student s3=s1;
System.out.println(s3.hashCode());
}
}
运行结果:
460141958
1163157884
460141958
-
toString方法
public String toString()
返回对象的字符串表示形式。 一般来说,
toString
方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。该
toString
类方法Object
返回一个由其中的对象是一个实例,该符号字符的类的名称的字符串
@` ”和对象的哈希码的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串:getClass().getName() + '@' + Integer.toHexString(hashCode())
-
结果
对象的字符串表示形式。
-
基本介绍:
默认返回:全类名 + @ + 哈希值的十六进制
Object toString()原码
//(1)getClass().getName() 类的全类名(包名+类名)
//(2)Integer.toHexString(hashCode()) 将hashCode的值转成16进制字符串
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
代码示例:
子类往往重写toString方法,用于返回对象的属性信息(快捷键:alt + insert),当然我们也可以自己定制。
package com.commonclass;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public