初学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);//falseSystem.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());//395983System.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", "撕裂的忧伤", "彭于晏");//0x001User user2 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x002System.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;}@Overridepublic boolean equals(Object obj) {if(this == obj){return true;}User use = (User) obj;if(this.username.equals(use.username)){return true;}return false;}@Overridepublic 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", "撕裂的忧伤", "彭于晏");//0x001User user2 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x002System.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;}@Overridepublic 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);//falseSystem.out.println(str1.equals(str2));//trueSystem.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);//falseSystem.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();//将字符串转换为字符数组}@Overridepublic 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;}@Overridepublic String toString() {return String.valueOf(value);//将字符数组转为字符串}
}
四,final
1.理解:最终的
1.final 修饰类,该类不能被继承
2.final修饰方法,该类不能被子类重写
3.final修饰变量 变量变为常量,不能重新赋值
2.注意:
1.常量在常量池中声明,项目结束时才会被销毁
2.常量的命名规范:全部单词大写,单词与单词之间用下划线隔开
3.经验:
1.如果不想让该类有子类(不想该类有扩展)就用final修饰;
2.final和static 一般一起修饰属性,该属性变为静态常量。