IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 常用Object的方法内部类 -> 正文阅读

[Java知识库]常用Object的方法内部类

一?常用Object的方法

1.1 Object是什么?

????????Object 是java提供的根类,所有类有直接或者间接的继承Object,由于与java中继承是可以传递的所以Object中的所有方法是所有类都有的方法.

1.2 equals方法

1.2.1?设计目的

比较两个对象是否相等

1.2.2 和"=="的区别

?? ?使用==比较基本数据类型 可以比较值的大小,但是比较引用类型 只能比较内存地址,而 object中默认的equals方法是比较内存地址的,因为人家又不知道你要比较什么属性?需要根据自己的需求进行覆写即可

eg:
? ? ? ? ? ? ?public boolean equals(Object obj){
? ? ? ? ? ? ? ? return this ==obj;
? ? ? ? ? ? ?}

例子?

需求:规定id相同和名字相同,就是同一个学生

代码:

public class Equals_01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a1="asd";
		String a2="asd";
		System.out.println(a1.equals(a2));//true
		Student s1=new Student(001, "张三");
		Student s2=new Student(001, "张三");
		System.out.println(s1==s2);//false,因为地址s1 和 s2的地址不同
		System.out.println(s1.equals(s2));//名字和学号都相同,才返回true;
	}
}
class Student {
	private int id;
	private String name;
	public Student(int id,String name){
		this.id=id;
		this.name=name;
		
	}

	public String getName(){
		return this.name;
	}
	@Override
	public boolean equals(Object obj){
		//需求:规定id相同,就是同一个学生
		//1 先比较地址,地址一样说明是同一个对象,直接返回true;
		if(this==obj){
			return true;
		}
		//2 说明不是同一个对象,那么需要判断是否是同类,不同类没有可比性
		if(obj instanceof Student){
			//向下转型,否则会丢失子类特有的属性(多态的缺点)
				Student s=(Student)obj;
				if(this.id==s.id && this.name.equals(s.name)){
					return true;
				}
			}
		return false;

}
}

1.3?finalize方法

1.3.1设计目的

JVM四大特性:跨平台?? ? 面向对象 多线程 自动垃圾回收

????????垃圾:一个对象没有任何引用指向他,该对象就被当成垃圾数据,谁也找不到他.等于说是没有用的资源,浪费空间

1.3.1?finalize方法特点

1 是Object中的方法,也就意味着是所有类对象都有的
2 该方法不需要程序员调用,有系统自动调用
3 当一个对象被回收的时候,会自动调用该对象的finalize方法
4 如果我们手动调用该方法,那么只是一个方法调用而已,并不会被回收

例子

public class Finalize_01 {
public static void main(String[] args) {
	Finalize_01 finalize_01=new Finalize_01();
	finalize_01=null;
	for(int i=1;i<10000000;i++){
		System.gc();//程序员可以"建议"垃圾回收
	}
	//执行结果:day_05._02_Finalize.Finalize_01@7ad74083回收
	//执行结果可能不会每次都出现,所以可以采用多次建议或者增加垃圾的数量
}
@Override
	protected void finalize() 	{
	System.out.println(this+"回收");
}
}

1.4 hashCode方法

1.4.1 设计目的

方法设计目的 返回该对象的字符串表示形式

1.4.2 哈希冲突:??

如果一个对象,取对此hash值,那么值一定相同,但是 不同对象,获取hash值也可能相同 又叫哈希冲突

hashCode 方法就是根据哈希方法得到的一个哈希值
hash算法:是一种安全的加密算法,把不定长的数据改为定长的数据,并不能保证其唯一性
1.4.3 既然有哈希冲突不能保证对象的唯一性,怎么办?
?用equals
1 先比较哈希值,如果不同 则不是同一个对象
2 如果不同,再用equals比较

1.5 toString方法

1.5.1 设计目的

方法设计目的 返回该对象的字符串表示形式

1.5.2 实现原理

????????输出一个引用类型的数据的时候 会自动调用该对象的toString方法?,Object中默认的toString方法是打印该对象的内存地址,如果输出一个对象的时候,不希望打印内存地址,而是打印指定格式的内容,就需要覆写toString方法

例子

public class toString_01 {
	public static void main(String[] args) {
		Person person=new Person(001,"张三",18);
		Person person2=new Person(002, "李四", 19);
		System.out.println(person);//运行结果:姓名:   张三    id:1   年龄  :18
		System.out.println(person2);//运行结果:姓名:   李四    id:2   年龄  :19
}
}
class Person{
	private int id ;
	private String name;
	private int age ;
	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		
		return "姓名:   "+this.name+"    id:"+this.id+"   年龄  :"+this.age;
	}
} 

二 内部类? ?

2.1 内部类概念

类体中还有其他的类,这个类就叫做内部类

????????当一个类的内部需要有一个完整的结构进行描述,而这个内部的完整结构有只是为了外部类提供服务,此时该类就可以定义成内部类

2.2 内部类优点

可以访问外部内的所有属性,包括私有属性

2.3 内部类的使用

1 .成员内部类 可以看做成员变量

成员内部类特点:
? ?1 成员内部类,没有static修饰
? ?2? 可以使用权限控制修饰符
? ?3 成员内部类中可以访问外部类的所有属性
? ?4?在成员内部类中不能有静态声明
? ?5 内部类编译之后的类名为 ?: 外部类类名$内部类类名

例子:

public class OuterClass_01 {
	private static String s1="私有化静态";
	private String s2="私有化成员态";
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		OuterClass_01 outerClass_01=new OuterClass_01();
		InnerClass innerClass=outerClass_01.new InnerClass();
		innerClass.m2();//输出结果:私有化静态 私有化成员态
	}
class InnerClass{
//	static int i=1;
//	public static void m1(){}
	public void m2(){
		System.out.println(s1);
		System.out.println(s2);
	}
}
}


2. 静态内部类 可以看做静态变量

静态内部类特点:
? ? ? 1? 静态内部类使用static修饰
? ? ? 2? 可以使用权限控制修饰符
? ? ? 3? 内部类编译之后的类名为:外部类类名$内部类类名
? ? ? 4? 在静态内部类中 成员也能声明,静态也能声明
? ? ? 5? 在静态内部类中,无法直接访问外部类的成员属性,需要对象才可以

例子

public class OuterClass_02 {
	private static String s1="私有化静态";
	private String s2="私有化成员";
	static class InnerClass{
		public void m1() {
			System.out.println(s1);
			// System.out.println(s2);
			// 创建外部类对象才能调用 外部类的成员属性
			OuterClass_02 o = new OuterClass_02();
			System.out.println(o.s2);
		}
//		static int i=1;
//		public static void m1(){}
		public static void m2(){
			System.out.println(s1);
//			System.out.println(s2);
			OuterClass_02 o=new OuterClass_02();
			System.out.println(o.s2);	
		}
	}
	public static void main(String[] args) {
		OuterClass_02.InnerClass.m2();
		InnerClass.m2();//在当前类中类名可以省略
		//创建对象
		InnerClass innerClass=new OuterClass_02.InnerClass();
			//外部类类名可以完全省略
		InnerClass innerClass2=new InnerClass();
		innerClass2.m1();
	}
}


3. 局部内部类 可以看做局部变量(方法中的类,不能写任何的修饰符(static,public等都不能写))

局部内部类特点:

1 局部内部类 : 方法中的类才是局部内部类
2? 局部内部类不能有静态声明,并且该类也不允许使用static修饰
3? 如果外部方法是成员方法,则该内部类可以直接访问外部类的所有属性
4 如果外部方法是静态方法,则该内部类不能直接访问外部类的成员属性,需要有对象
5 局部内部类也可以直接访问外部方法的局部变量,但是需要加fina修饰,从1.8开始final可以省略
? ?也就是说?,如果局部内部类使用了外部方法的局部变量,那么该局部变量也就等于加了final修饰了,? ? ?值就不能改了
?6 内部类类名:
?? ? ? ? 如果多个方法的内部类类名不一致, 那就这样:外部类类名$内部类类名,?
?? ? ? ? 如果多个方法的内部类类名一致, 就是这样:外部类类名$1内部类类名 , 外部类类名$2内部类? ? ? 类名 , 外部类类名$3内部类类名...

例子

public class OuterClass_03 {
	private static String s1 = "私有化静态";
	private String s2 = "私有化成员";
	
	public void m1(){
		final int i=100;
		int i2=200;
		class InnerClass {
		//static int x=2;
		public void m3(){
			System.out.println(s1);
			System.out.println(s2);
			System.out.println(i);
			System.out.println(i2);
			// 不能在更改
			// i=2;
			// 局部内部类只能在方法内部使用
			// 创建内部类对象
			InnerClass innerClass = new InnerClass();
			innerClass.m3();
		}
		
	}
	
}
public static void m2(){
		final int a=100;
		int a2=200;
		class InnerClass{
			public void m3(){
				System.out.println(s1);
				//静态方法中的内部类,不能直接访问外部类的成员属性,需要创建外部类对象才行
//				System.out.println(s2);
				OuterClass_03 outerClass_03=new OuterClass_03();
				System.out.println(outerClass_03.s2);
			}
		}
		// 不能在更改
				// i=2;
				// 局部内部类只能在方法内部使用
				// 创建内部类对象
				InnerClass innerClass = new InnerClass();
				innerClass.m3();
				System.out.println("111111");
	}
public static void main(String[] args) {
	OuterClass_03 outerClass_03 = new OuterClass_03();
	outerClass_03.m1();
	m2();
}
}


4. 匿名内部类 可以看做实参?? ?

? ? ? ? 下一篇文章见

? ??

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:30:54  更:2021-10-16 19:33:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:35:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码