初学Java基础Day17---面相对象之访问修饰符,初识Object,final关键字

一,访问修饰符

1.理解:

        给类,方法,属性定义访问权限的关键字

2.注意:

         1.修饰类只能使用public和默认的访问权限

        2.修饰方法和属性可以使用所有的访问权限

分类:     1.private    2.默认的        3.protected    4.public
本类            OK                OK                  OK             OK
本包             No                OK                 OK              OK
其他子类      No               No                   OK             OK
其他包          No                No                  No              OK

3.经验:

1.属性一般使用private 修饰,因为封装

2.属性或者方法如果需要被子类使用,一般用protected

3.方法如果不需要被外界使用,一般用private

4.方法一般用public

二,初识Object

1.理解:

        所有类的基类或者超类

        如果一个类没有明确继承的类默认继承Object,所以说Object是所有类的祖先类

Object提供了许多方法如:

1.equals();

        比较两个对象的内存地址是否相同

代码实现:
//equals():
//底层:
public boolean equals(Object obj){

    return this ==obj;
}

//实验:
public static void main(String[] args){
    
    //基本数据类型:==比较的是值是否相同
    int a =10;
    int b = 20;
    System,out.println(a==b);//false
    
    //引用数据类型:==比较的是内存地址
    Object obj1 =new Object();
     Object obj2 =new Object();
    System.out.println(obj1==obj2);//false
     System.out.println(obj1.equals(obj2));//false
}
2.getClass():

前言:

        使用到类,会把该类的class文件加载到方法区,并且在堆中创建该类的 class对象,该类的class对象作为class文件的访问入口;

        class文件只加载一次,所以该类的class对象在内存中也只有一个;

        getClass方法就是获取该类的class对象。

代码实现
//实验:
public static void main(String[] args){
    
     Object obj1 =new Object();
     Object obj2 =new Object();
    
    Class<? extends Object> class1 = obj1.getClass();//获取的是Object类的class对象
    
     Class<? extends Object> class2 = obj2.getClass();//获取的是Object类的class对象
    
     System.out.println(class1==class2);//true
    
}
3.hashCode();

获取对象的hash值;

注意:hash值不等于内存地址,是对象的内存地址+散列算法算出来的一个值

public static void main(String[] args){
    
     Object obj1 =new Object();
     Object obj2 =new Object();
    
     System.out.println(obj1.hashCode());//395983
     System.out.println(obj2.hashCode());//189395683
4.toString()

获取对象的字符串表示(就是将对象转换为字符串

三,Object的深入

getClass():在反射的知识点中使用;hashCode() ;在集合知识点中使用

equals();

比较两个对象的内存地址是否相同;他的标杆作用是比较两个对象是否相同;

不同子类比较两个对象的规则不一样,所以不同子类重写equals即可

//需求:编写用户类,比较两个对象是否相同

public  class Test01{
    public static void main(String[] args){
       	User user1 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x001
		User user2 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x002
		
		System.out.println(user1.equals(user2));
		
		System.out.println(user1.toString());
		System.out.println(user2.toString());

    }
    
}
public class User {
	
	private String username;
	private String password;
	private String nickName;
	private String name;
	
	public User() {
	}

	public User(String username, String password, String nickName, String name) {
		this.username = username;
		this.password = password;
		this.nickName = nickName;
		this.name = name;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getNickName() {
		return nickName;
	}

	public void setNickName(String nickName) {
		this.nickName = nickName;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		
		User use = (User) obj;
		if(this.username.equals(use.username)){
			return true;
		}
		return false;
	}
	
@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		
		User use = (User) obj;
		if(this.username.equals(use.username)){
			return true;
		}
		return false;
	}
}
toString();

获取对象的字符串表示

他的标杆作用是不同的子类有不同的属性,重写toString方法方便打印

//需求:编写用户类,比较两个对象是否相同,并打印
public  class Test01{
    public static void main(String[] args){
       	User user1 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x001
		User user2 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x002
		
		System.out.println(user1.equals(user2));
		
		System.out.println(user1.toString());
		System.out.println(user2.toString());

    }
    
}
public class User {
	
	private String username;
	private String password;
	private String nickName;
	private String name;
	
	public User() {
	}

	public User(String username, String password, String nickName, String name) {
		this.username = username;
		this.password = password;
		this.nickName = nickName;
		this.name = name;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getNickName() {
		return nickName;
	}

	public void setNickName(String nickName) {
		this.nickName = nickName;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return this.username + " -- " + this.password + " -- " + this.nickName + " -- " + this.name;
	}
}
面试题:

String 是如何比较两个字符串是否相同的?

1.比较两个字符串的地址是否相同

2.比较两个字符串的字符个数

3.循环比较字符的Unicode码

代码实现:
public class Test01 {
	/**
	 * 知识点:深入String的equals()
	 * 
	 * 面试题:String是如何比较两个字符串是否相同的
	 * 		1.比较两个字符串的地址是否相同
	 * 		2.比较两个字符串的字符个数
	 * 		3.循环比较字符的Unicode码
	 */
	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
		
		//注意:打印对象,默认调用toString()
		System.out.println(m1);
		System.out.println(m2);
	}
}

public class MyString {

	private char[] value;
	
	public MyString(String original) {
		//"abc"
		//['a','b','c']
		value = original.toCharArray();//将字符串转换为字符数组
	}
	
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		
		MyString my = (MyString) obj;
		
		char[] v1 = this.value;
		char[] v2 = my.value;
		
		//比较字符长度
		if(v1.length != v2.length){
			return false;
		}
		
		for (int i = 0; i < v1.length; i++) {
			//比较字符的Unicode码是否相同
			if(v1[i] != v2[i]){
				return false;
			}
		}
		return true;
	}
	
	@Override
	public String toString() {
		return String.valueOf(value);//将字符数组转为字符串
	}
}

四,final

1.理解:最终的

1.final 修饰类,该类不能被继承

2.final修饰方法,该类不能被子类重写

3.final修饰变量 变量变为常量,不能重新赋值

2.注意:

1.常量在常量池中声明,项目结束时才会被销毁

2.常量的命名规范:全部单词大写,单词与单词之间用下划线隔开

3.经验:

1.如果不想让该类有子类(不想该类有扩展)就用final修饰;

2.final和static 一般一起修饰属性,该属性变为静态常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值