当前位置: 首页 > news >正文

初学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 一般一起修饰属性,该属性变为静态常量。


http://www.mrgr.cn/news/48250.html

相关文章:

  • C++进阶-1-单继承、多继承、虚继承
  • 第十五届蓝桥杯Scratch01月stema选拔赛—排序
  • FreeRtos实时系统: 六.FreeRTOS的列表和列表项
  • 腾讯云云开发 Copilot 深度探索与实战分享
  • Cesium引入天地图、高德、百度地图
  • 常用的缓存技术都有哪些
  • 深入理解 Java HashMap 的 get() 方法及其相关实现
  • 事件轮询机制
  • Java数组的使用方法
  • 基于SpringBoot+Vue的超市管理系统设计实现(协同过滤算法、图形化分析)
  • 物理学基础精解【67】
  • 【jvm】垃圾回收是否会涉及到虚拟机栈?
  • 10月11日复盘日记
  • 离线使用k8s部署项目
  • thymeleaf
  • docker 安装与使用
  • 【cocos creator】输入框滑动条联动小组建
  • OpenRewrite配方之代码格式化——org.openrewrite.java.format.AutoFormat
  • 毕业设计之—基于ManTra-Net的图像篡改检测方法研究与应用实现
  • 你的拼命向前,只不过是别人的轻松实现
  • 【D3.js in Action 3 精译_033】4.1.0 DIY 实战:如何通过学习 d3.autoType 函数深度参与 D3 生态建设
  • Antsword-labs靶机渗透
  • QT:数据库,opencv
  • MySQL-02.概述-安装配置
  • 共识算法Raft
  • std::future::then的概念和使用方法