初学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 一般一起修饰属性,该属性变为静态常量。
原文地址:https://blog.csdn.net/2401_87491344/article/details/142865124
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!