Java基础知识小结(内部类、BigInteger、枚举、接口、重写重载和序列化)

一、Java内部类

1、内部类

在Java中,也可以嵌套类(类中的类)。嵌套类的目的是将属于同一类的类分组,这使代码更具可读性和可维护性。
要访问内部类,请创建外部类的对象,然后创建内部类的对象:

class OuterClass {
  int x = 10;

  class InnerClass {
    int y = 5;
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.y + myOuter.x);
  }
}

// 输出 15 (5 + 10)

2、私有的内部类

与"常规"类不同,内部类可以是private 私有的或 protected受保护的。 如果不希望外部对象访问内部类,请将该类声明为private:

class OuterClass {
  int x = 10;

  private class InnerClass {
    int y = 5;
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.y + myOuter.x);
  }
}

3、Static 内部类

内部类也可以是static静态的,这意味着您可以在不创建外部类的对象的情况下访问它:
与 static静态属性和方法一样,static静态内部类无权访问外部类的成员

class OuterClass {
  int x = 10;

  static class InnerClass {
    int y = 5;
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass.InnerClass myInner = new OuterClass.InnerClass();
    System.out.println(myInner.y);
  }
}

// 输出 5

4、从内部类访问外部类

内部类的一个优点是,它们可以访问外部类的属性和方法:

class OuterClass {
  int x = 10;

  class InnerClass {
    public int myInnerMethod() {
      return x;
    }
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.myInnerMethod());
  }
}

// 输出 10

二、Java大数BigInteger、BigDecimal

如果基本的整数和浮点数精度不够用,可以使用java.math包中的BigInteger、BigDecimal类处理包含任意长度的数字序列的数值。

1、BigInteger实现任意精度的整数运算

大数的创建

//valueOf()方法将普通的数值转换为大数
        BigInteger a=BigInteger.valueOf(100);
        //使用一个带字符串参数的构造器
        BigInteger b=new BigInteger("1332433344333");
        //内置常量ZERO、ONE这些
        BigInteger c=BigInteger.ZERO;

大数的运算

Scanner in=new Scanner(System.in);
        String s1=in.nextLine();
        String s2=in.nextLine();
        BigInteger a=new BigInteger(s1);
        BigInteger b=new BigInteger(s2);
        //加法add()
        BigInteger c=a.add(b);
        System.out.println(c);
        //乘法multiply()
        BigInteger d=a.multiply(b);
        System.out.println(d);
        //减法subtract()
        BigInteger e=a.subtract(b);
        System.out.println(e);
        //除法divide()
        BigInteger f=a.divide(b);
        System.out.println(f);
        //取余数mod()
        BigInteger g=a.mod(b);
        System.out.println(g);

其他方法

Scanner in=new Scanner(System.in);
        String s1=in.nextLine();
        String s2=in.nextLine();
        BigInteger a=new BigInteger(s1);
        BigInteger b=new BigInteger(s2);
        //开平方根
        //BigInteger c=a.sqrt();//java 9才有
        //比较两个大数的大小
        // a<b返回负数,a>b返回正数,a==b返回0
        int num=a.compareTo(b);
        String flag= num>=0 ? (num>0 ? "a大":"相等"):"b大";
        System.out.println(flag);

2、BIgDecimal 实现任意精度的浮点数运算

其他方法与BIgInteger类似

Scanner in=new Scanner(System.in);
        String s1=in.nextLine();
        String s2=in.nextLine();
        BigDecimal a=new BigDecimal(s1);
        BigDecimal b=new BigDecimal(s2);
        //除法,并指定舍入方式
        BigDecimal c=a.divide(b,BigDecimal.ROUND_HALF_UP);//四舍五入

三、Java中常量、枚举类型

1、常量

特点:

  • 在程序运行过程中一直不会改变,用关键字final修饰,也被称为“final变量”;
  • 在整个程序中只能被赋值一次,赋值后便不可修改,为所有对象共享;
  • 常量名一般使用全大写;

声明常量的标准语法:

final 数据类型 常量名=;

如果要使某个常量在一个类的多个方法中都能够使用,可以声明为类常量,使用 static final 修饰

public class Main
{
    public static final double PI=3.14;
    public static void main(String[] args)
    {
        System.out.println(PI*2*2);
    }
}

当定义的final变量属于类常量时,必须在定义的时候就赋值,否则会出错。

public class Main
{
    static final double PI=3.14;//必须在定义时就赋值
    public static void main(String[] args)
    {
        final double p;//可以分开
        p=2.2;
        System.out.println(PI*p*2);
    }
}

2、枚举类型

变量的取值只在一个有限的集合内,枚举类型包括有限个命名的值。
例如,杯子有小中大三种型号

public class Main
{
    public enum Size{SMALL,MEDIUM,LARGE};
    public static void main(String[] args)
    {
        Size cupSize=Size.SMALL;
        System.out.println(cupSize);
    }
}
SMALL

比较两个枚举类型的值时,可以直接使用==。
枚举类的定义

public enum Size
    {
        SMALL("S"),MEDIUM("M"),LARGE("L");
        private String cupSize;
        //构造器总是私有的,所以private可以忽略不写
        Size(String cupSize)
        {
            this.cupSize=cupSize;
        }
        public String getCupSize()
        {
            return cupSize;
        }
    }

枚举类型中的常用方法
在这里插入图片描述
综合应用:

import java.util.*;
public class Main
{
    public enum Size
    {
        SMALL("S"),MEDIUM("M"),LARGE("L");
        private String cupSize;
        //构造器总是私有的,所以private可以忽略不写
        Size(String cupSize)
        {
            this.cupSize=cupSize;
        }
        public String getCupSize()
        {
            return cupSize;
        }
    }
    public static void main(String[] args)
    {
        Scanner in=new Scanner(System.in);
        String input=in.next().toUpperCase();
        Size size=Enum.valueOf(Size.class,input);//将普通字符串转换为枚举实例
        System.out.println("size="+size);
        System.out.println("cupSize="+size.getCupSize());
        if(size==Size.MEDIUM)
        {
            System.out.println("YES");
        }
    }
}

medium
size=MEDIUM
cupSize=M
YES

四、Java使用接口

1、定义接口

接口中的方法是抽象的、公有的,一个类可以实现多个接口。

Java 8 新增:引入默认方法,静态方法,用default关键字来定义
Java 9 新增:私有方法和私有静态方法,用private修饰,私有方法必须包含方法体,必须是具体方法,且私有方法只能在该接口内使用或访问。

2、引用接口

关键字:implements
定义接口

package 基础语法;

public interface JieOne {
	int add(int a,int b);
}

引用接口

package 基础语法;

class SiZeYunSuan implements JieOne,JieTwo,JieThree,JieFour{
	public int add(int a,int b) {
		return a+b;
	}
	public int sub(int a,int b) {
		return a-b;
	}
	@Override
	public int umul(int a, int b) {
		// TODO 自动生成的方法存根
		return a/b;
	}
	@Override
	public int mul(int a, int b) {
		// TODO 自动生成的方法存根
		return a*b;
	}
	
}
public class UseInterface {
	public static void main(String[] args) {
		SiZeYunSuan t=new SiZeYunSuan();
		System.out.println("a+b="+t.add(2, 5));
		System.out.println("a-b="+t.sub(2, 5));
		System.out.println("a*b="+t.mul(2, 5));
		System.out.println("a/b="+t.umul(2, 5));
	}
}

在接口的实现过程中规定:

能为所有的接口提供实现的功能; 能遵循重写的所有规则; 能保持相同的返回数据类型。 接口完全支持多继承,可以有多个直接父接口,用英文逗号隔开。

五、Java方法的重写和重载

1、重写

建立在继承关系上,在子类中重新编写来自父类的方法来满足需求。

规则:

重写方法不能比被重写方法限制更严格的访问级别,即访问权限可以扩大不能缩小; final修饰的方法和静态方法都不能重写;
返回类型和参数列表保持相同; 抽象方法必须在具体类中重写;
无论被重写方法是否抛出异常,重写方法都可以抛出任何非强制异常;但重写方法不能抛出新的强制性异常,或则比被重写方法声明的范围更广的强制性异常。反之则可以。

2、重载overload

同一类中可以有两个或多个方法具有相同的方法名,但是要保证它们的参数不同,

方法重载中参数列表不同的含义是:参数的个数不同或者是参数类型不同。另外,返回类型不能用来区分方法重载

package 基础语法;

public class Chongzai {
	int max(int a,int b) {
		System.out.println("int max:");
		return a>b?a:b;
	}
	int max(short a,short b) {
		System.out.println("int max(short):");
		return a>b?a:b;
	}
	public static void main(String args[]) {
		Chongzai tChongzai=new Chongzai();
		tChongzai.max(3, 4);
		short a=3;//先定义为short,否则默认int
		short b=4;
		tChongzai.max(a, b);
		
	}
}

六、序列化

1、序列化与反序列化

package com.java.main;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class TestObject
{
	public static void main(String[] args)
	{
		ObjectStream objectStream = new ObjectStream();
		objectStream.testObjectOutputStream();
		objectStream.testObjectInputStream();
	}
}
class ObjectStream
{
	/*
	 * 序列化过程:将内存中的Java对象保存到磁盘中或者通过网络传输出去
	 */
	public void testObjectOutputStream()
	{
		ObjectOutputStream oos = null;
		try
		{
			oos = new ObjectOutputStream(new FileOutputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt"));
			oos.writeObject(new String("你好Java"));
			oos.flush(); // 刷新一下
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally
		{
			if(oos != null)
			{
				try
				{
					oos.close();
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
	}
	/*
	 * 反序列化过程:将磁盘中的对象还原成内存中的Java对象
	 * 
	 */
	public void testObjectInputStream()
	{
		ObjectInputStream ois = null;
		try
		{
			ois = new ObjectInputStream(new FileInputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt"));
			Object obj = ois.readObject();
			String string = (String)obj;
			System.out.println(string);
		}catch(IOException e)
		{
			e.printStackTrace();
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}finally
		{
			if(ois != null)
			{
				try
				{
					ois.close();
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
	}
}

自定义的类的对象如果需要序列化与反序列化,就需要实现Serializable接口,而且该类要提供一个全局常量serialVersionUID(用来标识序列化版本)
自定义类的所有属性都必须可序列化

class Person implements Serializable
{
	/**
	 * 需要提供一个全局常量 serialVersionUID 
	 */
	private static final long serialVersionUID = 1L;
	
	private String name;
	private int age;
	public Person(String name, int age)
	{
		this.name = name;
		this.age = age;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	@Override
	public String toString()
	{
		return "Person [name=" + name + ", age=" + age + "]";
	}	
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TestObject
{
	public static void main(String[] args)
	{
		ObjectStream objectStream = new ObjectStream();
		objectStream.testObjectOutputStream();
		objectStream.testObjectInputStream();
	}
}
class ObjectStream
{
	/*
	 * 序列化过程:将内存中的Java对象保存到磁盘中或者通过网络传输出去
	 */
	public void testObjectOutputStream()
	{
		ObjectOutputStream oos = null;
		try
		{
			oos = new ObjectOutputStream(new FileOutputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt"));
			oos.writeObject(new Person("张三", 21)); // 序列化自定义的类对象person
			oos.flush(); // 刷新一下
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally
		{
			if(oos != null)
			{
				try
				{
					oos.close();
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
	}
	/*
	 * 反序列化过程:将磁盘中的对象还原成内存中的Java对象
	 * 
	 */
	public void testObjectInputStream()
	{
		ObjectInputStream ois = null;
		try
		{
			ois = new ObjectInputStream(new FileInputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt"));
			Object obj = ois.readObject();
			Person person = (Person)obj;
			System.out.println(person);
		}catch(IOException e)
		{
			e.printStackTrace();
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}finally
		{
			if(ois != null)
			{
				try
				{
					ois.close();
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
	}
}

2、RandomAccessFile

既可以实现输入,也可以实现输出

package com.java.main;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class TestRandom
{
	public static void main(String[] args)
	{
		RandomAccessFile raf1 = null;
		RandomAccessFile raf2 = null;
		try
		{
			raf1 = new RandomAccessFile(new File("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照.jpg"), "r");
			raf2 = new RandomAccessFile(new File("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照1.jpg"), "rw");
			
			byte[] bBuffer = new byte[1024];
			int len;
			while((len = raf1.read(bBuffer)) != -1)
			{
				raf2.write(bBuffer, 0, len);
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally
		{
			if(raf1 != null)
			{
				try
				{
					raf1.close();
				} catch (IOException e)
				{
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
			
			if(raf2 != null)
			{
				try
				{
					raf2.close();
				} catch (IOException e)
				{
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/80738.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)

前言&#xff1a;在实际项目开发中&#xff0c;可能会对一些用户的隐私信息进行脱敏操作&#xff0c;传统的方式很多都是用replace方法进行手动替换&#xff0c;这样会由很多冗余的代码并且后续也不好维护&#xff0c;本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去…

【框架类】—MVVM框架

一、MVVM框架有哪些 Vue.jsReact.jsAngular.js 二、对MVVM的认识 1. MVC是什么 全称 Model View Controller, 它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离 2. MVVM的定义 MVVM是一种软件架构模式&#xff0c;它代表了模型 --视…

深入理解JVM——垃圾回收与内存分配机制详细讲解

所谓垃圾回收&#xff0c;也就是要回收已经“死了”的对象。 那我们如何判断哪些对象“存活”&#xff0c;哪些已经“死去”呢&#xff1f; 一、判断对象已死 1、引用计数算法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器就加一&…

探索无限创造力的星辰大道,画出想象的浩瀚宇宙!-turtle

介绍 视频教程地址在此&#xff1a;https://www.bilibili.com/video/BV1Pm4y1H7Tb/ 大家好&#xff0c;欢迎来到本视频&#xff01;今天&#xff0c;我们将一同探索Python编程世界中的一个有趣而创意的库——Turtle库。无需专业绘画技能&#xff0c;你就可以轻松地用代码绘制…

人工智能在网络安全中的作用:当前的局限性和未来的可能性

人工智能 (AI) 激发了网络安全行业的想象力&#xff0c;有可能彻底改变安全和 IT 团队处理网络危机、漏洞和勒索软件攻击的方式。 然而&#xff0c;对人工智能的能力和局限性的现实理解至关重要&#xff0c;并且存在许多挑战阻碍人工智能对网络安全产生直接的变革性影响。 在…

概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理

Top NSD DBA DAY09 案例1&#xff1a;搭建redis服务器案例2&#xff1a;常用命令限案例3&#xff1a;部署LNPRedis案例4&#xff1a;创建redis集群 1 案例1&#xff1a;搭建redis服务器 1.1 具体要求如下 在主机redis64运行redis服务修改服务运行参数 ip 地址192.168.88.6…

在 ubuntu 18.04 上使用源码升级 OpenSSH_7.6p1到 OpenSSH_9.3p1

1、检查系统已安装的当前 SSH 版本 使用命令 ssh -V 查看当前 ssh 版本&#xff0c;输出如下&#xff1a; OpenSSH_7.6p1 Ubuntu-4ubuntu0.7, OpenSSL 1.0.2n 7 Dec 20172、安装依赖&#xff0c;依次执行以下命令 sudo apt update sudo apt install build-essential zlib1g…

[论文笔记]Glancing Transformer for Non-Autoregressive Neural Machine Translation

引言 这是论文Glancing Transformer for Non-Autoregressive Neural Machine Translation的笔记。 传统的非自回归文本生成速度较慢,因为需要给定之前的token来预测下一个token。但自回归模型虽然效率高,但性能没那么好。 这篇论文提出了Glancing Transformer,可以只需要一…

6.RocketMQ之索引文件ConsumeQueue

本文着重分析为consumequeue/topic/queueId目录下的索引文件。 1.ConsumeQueueStore public class ConsumeQueueStore {protected final ConcurrentMap<String>, ConcurrentMap<Integer>, ConsumeQueueInterface>> consumeQueueTable;public boolean load(…

Selenium 测试用例编写

编写Selenium测试用例就是模拟用户在浏览器上的一系列操作&#xff0c;通过脚本来完成自动化测试。 编写测试用例的优势&#xff1a; 开源&#xff0c;免费。 支持多种浏览器 IE&#xff0c;Firefox&#xff0c;Chrome&#xff0c;Safari。 支持多平台 Windows&#xff0c;Li…

Xxl-job安装部署以及SpringBoot集成Xxl-job使用

1、安装Xxl-job&#xff1a; 可以使用docker拉取镜像部署和源码编译两种方式&#xff0c;这里选择源码编译安装。 代码拉取地址&#xff1a; https://github.com/xuxueli/xxl-job/tree/2.1.2 官方开发文档&#xff1a; https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%…

Android5:活动生命周期

创建项目Stopwatch activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…

ROS-PyQt小案例

前言&#xff1a;目前还在学习ROS无人机框架中&#xff0c;&#xff0c;&#xff0c; 更多更新文章详见我的个人博客主页【前往】 ROS与PyQt5结合的小demo&#xff0c;用于学习如何设计一个界面&#xff0c;并与ROS中的Service和Topic结合&#xff0c;从而控制多个小乌龟的运动…

设计HTML5表单

HTML5基于Web Forms 2.0标准对HTML4表单进行全面升级&#xff0c;在保持简便、易用的基础上&#xff0c;新增了很多控件和属性&#xff0c;从而减轻了开发人员的负担。表单为访问者提供了与网站进行互动的途径&#xff0c;完整的表单一般由控件和脚本两部分组成。 1、认识HTML…

ansible的playbook剧本

playbook剧本 PlayBook1.playbooks 本身由以下各部分组成2.示例&#xff1a;3.运行playbook补充参数&#xff1a; 4.定义、引用变量5.指定远程主机sudo切换用户6.when条件判断7.迭代8.Templates 模块1.先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设置引用的变量2…

记录--webpack和vite原理

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 每次用vite创建项目秒建好&#xff0c;前几天用vue-cli创建了一个项目&#xff0c;足足等了我一分钟&#xff0c;那为什么用 vite 比 webpack 要快呢&#xff0c;这篇文章带你梳理清楚它们的原理…

Linux命令200例:clock的具体应用,设置系统的时钟时间、硬件时钟和定时器等相关信息

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

Atlas 元数据管理

Atlas 元数据管理 1.Atlas入门 1.1概述 元数据原理和治理功能&#xff0c;用以构建数据资产的目录。对这个资产进行分类和管理&#xff0c;形成数据字典。 提供围绕数据资产的协作功能。 表和表之间的血缘依赖 字段和字段之间的血缘依赖 1.2架构图 导入和导出&#xff1…

Educational Codeforces Round 62 (Rated for Div. 2) C. Playlist

一开始肯定要排个序&#xff0c;b相同时t大的在前边&#xff0c;不同时b大的在前面。 然后想最多只能选k个的限制&#xff0c;可以这样想&#xff0c;每次用到的b只能用已选到的最小的值&#xff0c;那可以把每个b都枚举一遍&#xff0c;然后每一次选时长最长的&#xff0c;且…

CCF C³ 走进百度:大模型与可持续生态发展

2023年8月10日&#xff0c;由CCF CTO Club发起的第22期C活动在百度北京总部进行&#xff0c;以“AI大语言模型技术与生态发展”主题&#xff0c;50余位企业界、学界专家、研究人员就此进行深入探讨。 CCF C走进百度 本次活动&#xff0c;CCF秘书长唐卫清与百度集团副总裁、深…