java基础


以下内容为本人的学习笔记,如需要转载,请声明原文链接  


java常用类:

1.内部类

2.Object类

3.Object类常用方法

4.包装类

5.String类

6.BigDecimal类

1、内部类

  • 分类:

    内部类:成员内部类,静态内部类, 局部内部类,匿名内部类

  • 概念:在一个类的内部再定义一个完整的类(类中类)

  • 特点:

  1. 编译之后可生成独立的字节码文件;

  2. 内部类可直接访问外部类的私有成员,而不破坏封装

  3. 可为外部类提供必要的内部功能组件

  1. public class Body{
  2. private String name;
  3. //内部类
  4. class Header{
  5. public void show(){
  6. //访问外部类私有成员
  7. System.out.println(name)
  8. }
  9. }
  10. }

1.1成员内部类

  • 在类的内部定义,与实例变量、示例方法同级别的类;

  • 外部类的一个实例部分,创建内部类对象时,必须先创建外部类对象:

    Outer out = new Outer();

    out.Inner in = out.new Inner();

  • 当外部类、内部类存在重名属性时,会优先访问内部类属性;

  • 成员内部类不能定义静态成员,但是能定义静态常量。

示例:

  1. public class Outer{
  2. private String name="张三";
  3. private int age = 20;
  4.  
  5. //内部类
  6. class Inner{
  7. private String address = "北京";
  8. private String phone="110";
  9. private String name = "李四";
  10.  
  11. //方法
  12. public void show(){
  13. //打印外部类的属性,内部类属性和外部类的属性名字相同(重名时):Outer.this
  14. System.out.println(Outer.this.name);
  15. System.out.println(age);
  16.  
  17. //打印内部类中的属性
  18. System.out.println(this.address);
  19. System.out.println(phone);
  20. }
  21.  
  22. }
  23. }

  24. public class TestOuter{
  25. public static void main(String [] agrs){
  26. //1创建外部类对象
  27. // Outer outer = new Outer();
  28. //2创建内部类对象,要加外部类对象前缀
  29. // outer.Inner inner = outer.new Inner()
  30.  
  31. //1,2合并为一句
  32. Inner inner = new Outer().new Inner();
  33. inner.show();
  34. }
  35. }

1.2静态内部类

(静态内部类,在内部类基础上加static,级别相当于外部类,给外部类使用)

  • 不依赖(先创建)外部类对象,可直接创建或通过类名访问,可声明静态成员

  • 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)

    Outer.Inner inner = new Outer.Inner();

    Outer.Inner.show();

示例:

  1. public class Outer {

  2. private String name ="小米";
  3. private int age = 19;

  4. //静态内部类
  5. static class Inner{
  6. private String name = "计缘";
  7. private int age =11;
  8. static private String address = "广东";
  9. public void show(){
  10. //1.调用外部类的属性,先创建外部类对象,因为静态内部类与外部类属于同一级别
  11. Outer outer = new Outer();
  12. //2.调用外部类的属性
  13. System.out.println(outer.name);
  14. //3.调用静态内部类的属性
  15. System.out.println(name);
  16. //4.调用静态内部类的静态属性,类名.属性名
  17. System.out.println(Inner.address);
  18. }


  19. }
  20. }
  21. //测试
  22. public class TestOuter {
  23. public static void main(String[] args) {
  24. //直接创建静态内部类对象
  25. Outer.Inner inner = new Outer.Inner();
  26. inner.show();
  27. }
  28. }

1.3局部内部类

  1. 定义在外部类方法中,作用范围和创建对象仅限于当前方法;

    • 局部内部类前缀不能加任何访问修饰符(如,public,protect...),作用范围在方法里

    • 局部内部类和局部变量属于同一级别

    • 静态方法不能访问非静态的成员,因为静态属性是类的属性,不是单个成员的属性

    • 局部内部类不能定义静态变量,但可以定义静态常量

  2. 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final;

  3. 限制类的使用范围。

    局部内部类访问局部变量:

    •   访问局部变量,JDK1.7要求变量是常量final,JDK1.8会自动为局部变量添加final;

    •   因为局部变量在方法完成后会消失,但是局部内部类不会消失,可是局部内部类会使用到一个将要消失的局部变量?所以要让局部变量为常量。

  1. public class Outer {

  2. private String name = "计缘";
  3. private int age = 42;

  4. public void show(){
  5. String address = "广东";
  6. class Inner{
  7. private String name = "尹兆先";
  8. private int age = 43;

  9. public void show2(){
  10. //访问外部类的属性,Outer.this可省略
  11. System.out.println(Outer.this.name);
  12. System.out.println(age);

  13. //访问内部类的属性
  14. System.out.println(name);
  15. //访问局部变量,JDK1.7要求变量是常量final,JDK1.8会自动为局部变量添加final
  16. System.out.println(address);
  17. }
  18. }
  19. //不能在main方法里创建局部内部类对象,
  20. // 在main方法里调用外部类的show方法是不能调用局部内部类的,因为
  21. // 上面只做了声明,没有调用。
  22. // 要调用局部内部类的方法要在上一级方法(跟局部内部类同一级上)创建局部内部类对象并调用方法
  23. Inner inner = new Inner();
  24. inner.show2();
  25. }
  26. }


  27. //测试
  28. public class TestOuter {
  29. public static void main(String[] args) {
  30. Outer outer = new Outer();
  31. outer.show();
  32. }
  33. }

1.4匿名内部类

  1. 没有类名的局部内部类(一切特征都与局部内部类相同);

  2. 必须继承一个父类或者实现一个接口;

  3. 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象;

  • 优点:减少代码量;

  • 缺点:可读性较差。

示例:

  1. public interface Usb {
  2. public void service();
  3. }


  4. public class Mouse implements Usb{

  5. public void service(){
  6. System.out.println("鼠标正在工作中...");
  7. }
  8. }


  9. public class TestUsb {
  10. public static void main(String[] args) {
  11. //创建接口类型的变量,多态
  12. // Usb usb = new Mouse();
  13. // usb.service();

  14. //局部内部类,main方法也是方法里
  15. // class Fan implements Usb{
  16. //
  17. // @Override
  18. // public void service() {
  19. // System.out.println("连接电脑成功,风扇开始工作...");
  20. // }
  21. // }
  22. //
  23. // //使用局部内部类创建对象
  24. // Usb usb = new Fan();
  25. // usb.service();
  26. //

  27. //使用匿名内部类优化(相当于创建了一个局部内部类)
  28. Usb usb = new Usb(){//第二个Usb位置可以是接口,抽象类,父类,在方法体里可以重写方法
  29. public void service() {
  30. System.out.println("连接电脑成功,风扇开始工作...");
  31. }
  32. };
  33. usb.service();
  34. }
  35. }

2、Object类

  1. 超类、基类,所有类的直接或间接父类,位于继承树的最顶层;

  2. 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承;

  3. Object类中所调用的方法,是所有对象都基本的方法;

  4. Object类型可以存储任何对

  • 作为参数,可接受任何对象。

  • 作为返回值,可返回任何对象。

3、Object类常用方法

3.1getClass()方法
  •   public final Class<?> getClass(){}
  •   返回引用中存储的实际对象类型;
  •   应用:通常用于判断两个引用中实际存储对象类型是否一致。

示例:

  1. public class Student {
  2. private String name;
  3. private int age;

  4. public Student() {
  5. }

  6. public Student(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }

  10. public String getName() {
  11. return name;
  12. }

  13. public void setName(String name) {
  14. this.name = name;
  15. }

  16. public int getAge() {
  17. return age;
  18. }

  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. }



  23. public class TestStudent {
  24. public static void main(String[] args) {
  25. Student s1 = new Student("居元子",999);
  26. Student s2 = new Student("魏元生",6);

  27. //判断s1和s2是不是同一个类型
  28. Class class1 = s1.getClass();
  29. Class class2 = s2.getClass();
  30. if (class1==class2){
  31. System.out.println("s1和s2属于同一个类型");
  32. }else{
  33. System.out.println("s1和s2不属于同一个类型");
  34. }

  35. }
  36. }
3.2hashCode()方法
  •  public int hashCode(){}
  •  返回该对象的哈希码值;
  •  哈希值根据对象的地址字符串数字使用hash算法(系统底层提供)计算出来的int类型的数值;
  •  一般情况下相同对象返回相同哈希码。

示例:

  1. Student s1 = new Student("居元子",999);
  2. Student s2 = new Student("魏元生",6);
  3. //hashCode方法
  4. System.out.println(s1.hashCode());
  5. System.out.println(s2.hashCode()); //s1.hashCode()!=s2.hashCode()
  6. Student s3 = s1;
  7. System.out.println(s3.hashCode()); //s1.hashCode()=s3.hashCode()
3.3 toString()方法
  • public String toStrin(){};
  • 返回该对象的字符串表示;
  • 可以根据程序需求覆盖该方法,如:展示对象各个属性的值。
  1.  
  1. System.out.println(s1.toString());
  2. System.out.println(s2.toString());//默认名字+返回哈希值的十六进制

重写toString:

  1. @Override
  2. public String toString() {
  3. return "Student{" +
  4. "name='" + name + '\'' +
  5. ", age=" + age +
  6. '}';
  7. }
3.4equals()方法
  • public boolean equals (Object obj){}
  • 默认(源码)实现为(this == obj)[比较两个对象是否相同],比较两个对象地址是否相同;
  • 可进行覆盖(重写后),比较两个对象的内容是否相同
  • equals是Object类的方法,默认为比较地址,跟'=='一样,String类中重写equals方法,比较的是值。
  1. //判断两个对象是否相等
  2. System.out.println(s1.equals(s2));//false
  3. Student s6 = new Student("小米", 12);
  4. Student s7 = new Student("小米", 12);
  5. System.out.println(s6.equals(s7));//false

equals()方法覆盖(重写)步骤

  1. 比较两个引用是否指向同一个对象;

  2. 判断obj是否为null;

  3. 判断两个引用指向的实际对象类型是否一致;

  4. 强制类型转换;

  5. 依次比较各个属性值是否相同。

  1. //Student类里
  2. public boolean equals(Object obj) {
  3. //1.判断两个对象是否是同一个引用
  4. if (this == obj) {
  5. return true;
  6. }
  7. //2.判断obj是否null
  8. if (obj == null) {
  9. return false;
  10. }
  11. //3.判断是否是同一个类型
  12. // if (this.getClass() == obj.getClass()) {
  13. //
  14. // }
  15. //instanceof 判断对象是否是某种类型
  16. if (obj instanceof Student) {
  17. //4.强制类型转换
  18. Student s = (Student) obj;
  19. //5.比较熟悉
  20. if (this.name.equals(s.getName()) && this.age == s.getAge()) {
  21. return true;
  22. }
  23. }
  24. return false;
  25. }

tips: instanceof比较的是前面的实际类型是不是后面对象实际类型的子类或同类,是的话返回true,否则返回false,所以true的情况下要强制转换为同类

3.5finalize()方法

   finalize:译:最终确定,把(计划、旅行、项目等)最后定下来;定案

  1. 当对象被判定为垃圾对象时,有JVM自动调用此方法,用以标记垃圾对象,进入回收队列;

  2. 垃圾对象:没有 有效引用(没有被赋予变量等) 指向此对象时,为垃圾对象;

  3. 垃圾回收:由GC销毁垃圾对象,释放数据存储空间;

  4. 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象;

  5. 手动回收机制:使用System.gc();通知JVM执行垃圾回收。(说是手动,其实还是JVM自动回收,只不过是被人为的告诉JVM一声)。

  1. //Student类里
  2. protected void finalize() throws Throwable{
  3. System.out.println(this.name+"对象被回收了...");
  4. }
  5.  
  6. //TestStudent类里
  7. new Student("aaa",32);
  8. new Student("bbb",32);
  9. new Student("ccc",32);
  10. new Student("ddd",32);
  11. new Student("eee",32);
  12. System.gc();
  13. System.out.println("回收垃圾");

2022-09-26  20:06:06

java基础之常用类1的更多相关文章

  1. 【Java基础】常用类

    常用类 字符串相关的类 String类:代表字符串,使用一对 "" 引起来表示. public final class String implements java.io.Seri ...

  2. Java基础总结--常用类以及包的访问权限

    -----Object---所有类的根类1.怎么得到的:通过对所有对象不断的向上抽取共性,具备所有对象的共性的东西2.常用的方法* equals(Object obj):比较两个对象的引用是否指向同一 ...

  3. Java基础之常用类

    1.Collections类: (1)此类完全由在 collection 上进行操作或返回 collection 的静态方法组成. (2)静态方法摘要: static <T> boolea ...

  4. java中的常用类(二)

    java中的常用类(二) Math类 Math类的声明:public final class Math extends Object Math类是与数学计算有关的类,里面的方法都是静态方法,直接使用类 ...

  5. Java基础-DButils工具类(QueryRunner)详解

    Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...

  6. Java基础之File类的使用

    Java基础之File类的使用 1.File类的构造方法和常用方法 2.对File中listFile(FileNameFilter name)学习 3.与File文件类相关的实现 File类的构造方法 ...

  7. Java基础:Object类中的equals与hashCode方法

    前言 这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢. 一切皆对象   对于软件工程来说面向对象编程有一套完整的解决方案:OOA.OOD.O ...

  8. Java基础和常用框架的面试题

    前言 最近学校也催着找工作了,于是刷了一些面试题,学习了几篇大佬优秀的博客,总结了一些自认为重要的知识点:听不少职场前辈说,对于应届毕业生,面试时只要能说到核心重要的点,围绕这个点说一些自己的看法,面 ...

  9. JAVA异常处理、常用类、反射、集合

    异常 异常:在Java中是指被一个方法抛出的对象. 分类:检查异常.运行时异常.错误 运行时异常(uncheckd):RuntimeException和其子类 检查异常(checkd/搜检异常):指E ...

随机推荐

  1. 03 MySQL_表相关的SQL

    表相关的SQL 什么是表: 表是数据库中保存数据的单位 数据库表的引擎: innodb:支持数据库的复杂操作,包括外键.事务等; myisam:只支持数据库的增删改查操作: 1. 创建表 格式: cr ...

  2. Excel用户如何打破内卷?只需要一个新软件,就能突破excel天花板

    还在死磕Excel吗?到底值不值得? 你看看,现在有多少excel培训班和培训课?网上各种EXCEL使用技巧教程也是满天飞.很多人为了提升Excel技能,不遗余力学习各种函数用法.VBA用法等等,最近 ...

  3. 串口应用:遵循uart协议,发送多个字节的数据(状态机)

    上一节中,我们遵循uart协议,它发送一次只能发送6/7/8位数据,我们不能随意更改位数(虽然在代码上可行),不然就不遵循uart协议了,会造成接收端无法接收. 在现实生活中,我们有时候要发的数据不止 ...

  4. 【MySQL 8】Generated Invisible Primary Keys(GIPK)

    从MySQL 8.0.30开始,MySQL支持在GIPK模式下运行时生成不可见的主键.在这种模式下运行时,对于任何在没有显式主键的情况下创建的InnoDB表,MySQL服务器会自动将生成的不可见主键 ...

  5. qbxt五一数学Day1

    目录 I. 基础知识 1. 带余除法(小学) 1. 定义 2. 性质 2. 最大公约数(gcd)/ 最小公倍数(lcm) 1. 定义 2. 性质 3. 高精度 II. 矩阵及其应用 1. 定义 2. ...

  6. 你的工具包已到货「GitHub 热点速览 v.22.31」

    如果你经常用 shell 记得看看本周特推里的 gum,它能给你的 shell 增加新趣味.除了这个 shell kit,我们还有 dashboard kit--tabler,功能技能 kit eng ...

  7. 关于微信小程序生产环境体验版获取不到openId的问题(大坑)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_119 我们知道openid是微信用户验证的重要标识,支付功能严重依赖这个东西,之前我们做微信支付的时候是通过在微信客户端直接调用官 ...

  8. Win10系统下安装编辑器之神(The God of Editor)Vim并且构建Python生态开发环境(2020年最新攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_160 众神殿内,依次坐着Editplus.Atom.Sublime.Vscode.JetBrains家族.Comodo等等一众编辑 ...

  9. PostgreSQL定时备份

    # PostgreSQL定时备份 # 版本:PostgreSQL14.0 # 一.如果你在pg_hba.conf中设定了密码登录,那么你就需要设置一个默认密码共psql登录的时候跳过验证.如果是roo ...

  10. Powerful Number 筛法

    我也不想学筛法了,可你考试时候出一个新筛法就不厚道了吧,我还开始以为这是杜教筛... $tips:$学完杜教筛立马学$Powerful \ Number$筛法,此筛法强悍如斯 $Powerful \ ...