java——面向对象

Object类

Object的方法介绍

含义:所有类的基类/超类

理解:一个类没有明确继承的父类,都默认继承Object,所以说Object类是所有类的祖先类

注意:Object类是所有类的超类,所以众多子类都可以调用Object中非私有化的方法

equals():判断两个对象地址是否相同

底层:

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

标杆作用:判断两个对象是否相同

理解:不同的子类判断两个对象的规则时不一样的,子类重写equals方法即可。

理解String底层:

​ String底层存储字符串是将字符串转换为了字符数组存储

String底层源码:

public class MyString {

	private char[] value;
	
	public MyString(String str){//"abc"
		value = str.toCharArray();//['a','b','c']
	}
	
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		
		MyString m = (MyString) obj;
		
		char[] v1 = this.value;//获取的是m1中的字符数组
		char[] v2 = m.value;//获取的是m2中的字符数组
		
		int n = v1.length;
		if(n != v2.length){
			return false;
		}
		
		for (int i = 0; i < n; i++) {
			if(v1[i] != v2[i]){//判断两个字符串中的字符是否相同 -- Unicode
				return false;
			}
		}
		
		return true;
	}
	
	@Override
	public String toString() {
		return String.valueOf(value);//将对象中的字符数组转换为字符串
	}
	
}

测试类

public class Test {
	
	public static void main(String[] args) {
		
		String str1 = new String("abc");
		String str2 = new String("abc");
		
		System.out.println(str1 == str2);//false
		System.out.println(str1.equals(str2));//true
		
		System.out.println(str1);
		System.out.println(str2);
		
		System.out.println("--------------------------");
		
		MyString m1 = new MyString("abc");
		MyString m2 = new MyString("abc");
	
		System.out.println(m1 == m2);//false
		System.out.println(m1.equals(m2));//true
		
		System.out.println(m1);
		System.out.println(m2);
	}
}

使用到某个类,JVM就会把该类的class文件加载到方法区(一次),同时会在堆内存中创建该类的class对象

class对象作用该类的class文件的访问入口

getClass():获取该类的class对象

hashCode():获取到对象的hash值(hash值是通过对象的内存地址

+hash算法算出来的一个int值)

toString():将对象转换为字符串格式

标杆作用:获取我们想要的对象中的数据

理解:不同的子类有不同的属性,子类重写toString方法获取我们想要的数据即可

public String toString(){
		//Integer.toHexString(hashCode()) -- 将十进制的hash值转换为十六进制
 		return getClass().getName() + "@" + Integer.toHexString(hashCode());
		}

final

含义:最终

作用:

  1. 修饰类:该类不能被继承

  2. 修饰方法:该方法不能被重写

  3. 修饰变量:变成常量,不能重新赋值

​ 常量的命名规则:全大写,单词之间用下划线隔开

​ 常量的生命周期:存在常量池中,直到项目结束才会被销毁

抽象类及抽象方法

//抽象类
public abstract class 类名{
    //抽象方法
    public abstract void method();
}

抽象方法交给非抽象的子类去实现(重写)

应用场景:当一个方法必须在父类中出现,但是这个方法又不好实现,就把该方法变成抽象方法,交给非抽象的子类去实现

面试题:

1.抽象类不能有构造方法?

抽象类可以有构造方法

2.抽象类中只能有抽象方法?

抽象类中有非抽象方法(成员方法和静态方法)

3.抽象类中不可以没有抽象方法?

抽象类中可以没有抽象方法,但是毫无意义

4.如果父类是抽象类,则子类必须实现父类的抽象方法?

不一定,子类如果是抽象类,可以不实现父类的抽象方法

5.可以使用new关键字来创建抽象类对象?

不可以,创建的是匿名内部类的对象

接口

含义:特殊的抽象类

注意:

  1. JDK1.7时,接口中只能有静态常量和抽象方法
  2. JDK1.8开始,接口中添加了静态方法和默认方法

应用场景:接口更像一个规范

抽象类 vs 接口

抽象类:成员变量、静态变量、静态常量、成员方法、静态方法

接口:静态常量、静态方法(JDK1.8)、默认方法(JDK1.8)

面试题:

1.一个类可以实现多个接口?
    可以
			
2.一个接口可以实现多个接口?
    不可以,接口与接口的关系是多继承
			
3.接口里面的方法不一定都是抽象的?
    JDK1.7时接口里只能有抽象方法,JDK1.8时接口可以有静态方法和默认方法
			
4.接口解决了类的单继承问题?
    是的,因为类与类是单继承,类与接口是多实现
			
5.一个类是否可以继承一个类并同时实现多个接口?可以
			
6.接口可以new对象?
    接口是特殊的抽象类,但是本质还是抽象类,抽象类是不可以new对象的,接口也是不能new对象,new出来的是匿名类内部类的对象

类 - 接口的关系:
类 - 类:单继承
类 - 接口:多实现
接口 - 接口:多继承

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值