java基础之常用类1
java基础
以下内容为本人的学习笔记,如需要转载,请声明原文链接
java常用类:
1.内部类
2.Object类
3.Object类常用方法
4.包装类
5.String类
6.BigDecimal类
1、内部类
分类:
内部类:成员内部类,静态内部类, 局部内部类,匿名内部类
概念:在一个类的内部再定义一个完整的类(类中类)
特点:
编译之后可生成独立的字节码文件;
内部类可直接访问外部类的私有成员,而不破坏封装
可为外部类提供必要的内部功能组件
public class Body{
private String name;
//内部类
class Header{
public void show(){
//访问外部类私有成员
System.out.println(name)
}
}
}
1.1成员内部类
在类的内部定义,与实例变量、示例方法同级别的类;
外部类的一个实例部分,创建内部类对象时,必须先创建外部类对象:
Outer out = new Outer();
out.Inner in = out.new Inner();
当外部类、内部类存在重名属性时,会优先访问内部类属性;
成员内部类不能定义静态成员,但是能定义静态常量。
示例:
public class Outer{
private String name="张三";
private int age = 20; //内部类
class Inner{
private String address = "北京";
private String phone="110";
private String name = "李四"; //方法
public void show(){
//打印外部类的属性,内部类属性和外部类的属性名字相同(重名时):Outer.this
System.out.println(Outer.this.name);
System.out.println(age); //打印内部类中的属性
System.out.println(this.address);
System.out.println(phone);
} }
}
public class TestOuter{
public static void main(String [] agrs){
//1创建外部类对象
// Outer outer = new Outer();
//2创建内部类对象,要加外部类对象前缀
// outer.Inner inner = outer.new Inner() //1,2合并为一句
Inner inner = new Outer().new Inner();
inner.show();
}
}
1.2静态内部类
(静态内部类,在内部类基础上加static,级别相当于外部类,给外部类使用)
不依赖(先创建)外部类对象,可直接创建或通过类名访问,可声明静态成员
只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
Outer.Inner inner = new Outer.Inner();
Outer.Inner.show();
示例:
public class Outer {
private String name ="小米";
private int age = 19;
//静态内部类
static class Inner{
private String name = "计缘";
private int age =11;
static private String address = "广东";
public void show(){
//1.调用外部类的属性,先创建外部类对象,因为静态内部类与外部类属于同一级别
Outer outer = new Outer();
//2.调用外部类的属性
System.out.println(outer.name);
//3.调用静态内部类的属性
System.out.println(name);
//4.调用静态内部类的静态属性,类名.属性名
System.out.println(Inner.address);
}
}
}
//测试
public class TestOuter {
public static void main(String[] args) {
//直接创建静态内部类对象
Outer.Inner inner = new Outer.Inner();
inner.show();
}
}
1.3局部内部类
定义在外部类方法中,作用范围和创建对象仅限于当前方法;
局部内部类前缀不能加任何访问修饰符(如,public,protect...),作用范围在方法里
局部内部类和局部变量属于同一级别
静态方法不能访问非静态的成员,因为静态属性是类的属性,不是单个成员的属性
局部内部类不能定义静态变量,但可以定义静态常量
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final;
限制类的使用范围。
局部内部类访问局部变量:
访问局部变量,JDK1.7要求变量是常量final,JDK1.8会自动为局部变量添加final;
因为局部变量在方法完成后会消失,但是局部内部类不会消失,可是局部内部类会使用到一个将要消失的局部变量?所以要让局部变量为常量。
public class Outer {
private String name = "计缘";
private int age = 42;
public void show(){
String address = "广东";
class Inner{
private String name = "尹兆先";
private int age = 43;
public void show2(){
//访问外部类的属性,Outer.this可省略
System.out.println(Outer.this.name);
System.out.println(age);
//访问内部类的属性
System.out.println(name);
//访问局部变量,JDK1.7要求变量是常量final,JDK1.8会自动为局部变量添加final
System.out.println(address);
}
}
//不能在main方法里创建局部内部类对象,
// 在main方法里调用外部类的show方法是不能调用局部内部类的,因为
// 上面只做了声明,没有调用。
// 要调用局部内部类的方法要在上一级方法(跟局部内部类同一级上)创建局部内部类对象并调用方法
Inner inner = new Inner();
inner.show2();
}
}
//测试
public class TestOuter {
public static void main(String[] args) {
Outer outer = new Outer();
outer.show();
}
}
1.4匿名内部类
没有类名的局部内部类(一切特征都与局部内部类相同);
必须继承一个父类或者实现一个接口;
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象;
优点:减少代码量;
缺点:可读性较差。
示例:
public interface Usb {
public void service();
}
public class Mouse implements Usb{
public void service(){
System.out.println("鼠标正在工作中...");
}
}
public class TestUsb {
public static void main(String[] args) {
//创建接口类型的变量,多态
// Usb usb = new Mouse();
// usb.service();
//局部内部类,main方法也是方法里
// class Fan implements Usb{
//
// @Override
// public void service() {
// System.out.println("连接电脑成功,风扇开始工作...");
// }
// }
//
// //使用局部内部类创建对象
// Usb usb = new Fan();
// usb.service();
//
//使用匿名内部类优化(相当于创建了一个局部内部类)
Usb usb = new Usb(){//第二个Usb位置可以是接口,抽象类,父类,在方法体里可以重写方法
public void service() {
System.out.println("连接电脑成功,风扇开始工作...");
}
};
usb.service();
}
}
2、Object类
超类、基类,所有类的直接或间接父类,位于继承树的最顶层;
任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承;
Object类中所调用的方法,是所有对象都基本的方法;
Object类型可以存储任何对
作为参数,可接受任何对象。
作为返回值,可返回任何对象。
3、Object类常用方法
3.1getClass()方法
- public final Class<?> getClass(){}
- 返回引用中存储的实际对象类型;
- 应用:通常用于判断两个引用中实际存储对象类型是否一致。
示例:
public class Student {
private String name;
private int age;
public Student() {
}
public Student(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;
}
}
public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student("居元子",999);
Student s2 = new Student("魏元生",6);
//判断s1和s2是不是同一个类型
Class class1 = s1.getClass();
Class class2 = s2.getClass();
if (class1==class2){
System.out.println("s1和s2属于同一个类型");
}else{
System.out.println("s1和s2不属于同一个类型");
}
}
}
3.2hashCode()方法
- public int hashCode(){}
- 返回该对象的哈希码值;
- 哈希值根据对象的地址或字符串或数字使用hash算法(系统底层提供)计算出来的int类型的数值;
- 一般情况下相同对象返回相同哈希码。
示例:
Student s1 = new Student("居元子",999);
Student s2 = new Student("魏元生",6);
//hashCode方法
System.out.println(s1.hashCode());
System.out.println(s2.hashCode()); //s1.hashCode()!=s2.hashCode()
Student s3 = s1;
System.out.println(s3.hashCode()); //s1.hashCode()=s3.hashCode()
3.3 toString()方法
- public String toStrin(){};
- 返回该对象的字符串表示;
- 可以根据程序需求覆盖该方法,如:展示对象各个属性的值。
System.out.println(s1.toString());
System.out.println(s2.toString());//默认名字+返回哈希值的十六进制
重写toString:
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
3.4equals()方法
- public boolean equals (Object obj){}
- 默认(源码)实现为(this == obj)[比较两个对象是否相同],比较两个对象地址是否相同;
- 可进行覆盖(重写后),比较两个对象的内容是否相同
- equals是Object类的方法,默认为比较地址,跟'=='一样,String类中重写equals方法,比较的是值。
//判断两个对象是否相等
System.out.println(s1.equals(s2));//false
Student s6 = new Student("小米", 12);
Student s7 = new Student("小米", 12);
System.out.println(s6.equals(s7));//false
equals()方法覆盖(重写)步骤
比较两个引用是否指向同一个对象;
判断obj是否为null;
判断两个引用指向的实际对象类型是否一致;
强制类型转换;
依次比较各个属性值是否相同。
//Student类里
public boolean equals(Object obj) {
//1.判断两个对象是否是同一个引用
if (this == obj) {
return true;
}
//2.判断obj是否null
if (obj == null) {
return false;
}
//3.判断是否是同一个类型
// if (this.getClass() == obj.getClass()) {
//
// }
//instanceof 判断对象是否是某种类型
if (obj instanceof Student) {
//4.强制类型转换
Student s = (Student) obj;
//5.比较熟悉
if (this.name.equals(s.getName()) && this.age == s.getAge()) {
return true;
}
}
return false;
}
tips: instanceof比较的是前面的实际类型是不是后面对象实际类型的子类或同类,是的话返回true,否则返回false,所以true的情况下要强制转换为同类
3.5finalize()方法
finalize:译:最终确定,把(计划、旅行、项目等)最后定下来;定案
当对象被判定为垃圾对象时,有JVM自动调用此方法,用以标记垃圾对象,进入回收队列;
垃圾对象:没有 有效引用(没有被赋予变量等) 指向此对象时,为垃圾对象;
垃圾回收:由GC销毁垃圾对象,释放数据存储空间;
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象;
手动回收机制:使用System.gc();通知JVM执行垃圾回收。(说是手动,其实还是JVM自动回收,只不过是被人为的告诉JVM一声)。
//Student类里
protected void finalize() throws Throwable{
System.out.println(this.name+"对象被回收了...");
} //TestStudent类里
new Student("aaa",32);
new Student("bbb",32);
new Student("ccc",32);
new Student("ddd",32);
new Student("eee",32);
System.gc();
System.out.println("回收垃圾");
2022-09-26 20:06:06
java基础之常用类1的更多相关文章
- 【Java基础】常用类
常用类 字符串相关的类 String类:代表字符串,使用一对 "" 引起来表示. public final class String implements java.io.Seri ...
- Java基础总结--常用类以及包的访问权限
-----Object---所有类的根类1.怎么得到的:通过对所有对象不断的向上抽取共性,具备所有对象的共性的东西2.常用的方法* equals(Object obj):比较两个对象的引用是否指向同一 ...
- Java基础之常用类
1.Collections类: (1)此类完全由在 collection 上进行操作或返回 collection 的静态方法组成. (2)静态方法摘要: static <T> boolea ...
- java中的常用类(二)
java中的常用类(二) Math类 Math类的声明:public final class Math extends Object Math类是与数学计算有关的类,里面的方法都是静态方法,直接使用类 ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...
- Java基础之File类的使用
Java基础之File类的使用 1.File类的构造方法和常用方法 2.对File中listFile(FileNameFilter name)学习 3.与File文件类相关的实现 File类的构造方法 ...
- Java基础:Object类中的equals与hashCode方法
前言 这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢. 一切皆对象 对于软件工程来说面向对象编程有一套完整的解决方案:OOA.OOD.O ...
- Java基础和常用框架的面试题
前言 最近学校也催着找工作了,于是刷了一些面试题,学习了几篇大佬优秀的博客,总结了一些自认为重要的知识点:听不少职场前辈说,对于应届毕业生,面试时只要能说到核心重要的点,围绕这个点说一些自己的看法,面 ...
- JAVA异常处理、常用类、反射、集合
异常 异常:在Java中是指被一个方法抛出的对象. 分类:检查异常.运行时异常.错误 运行时异常(uncheckd):RuntimeException和其子类 检查异常(checkd/搜检异常):指E ...
随机推荐
- 初学者对html的认知
首先是关于本人对一个新事物的理解路线 对html的认知: what:首先我得知道它是什么?html是一门超文本标记语言,它不是一门编程语言 why:它为什么会存在?它存在的意义是什么?随着互联网的发展 ...
- Linux系列之添加和删除软件命令
前言 在基于Debian的Linux发行版中,默认的软件管理器是Advanced Packaging Tool, 也就是apt.本文将简单介绍下面有关添加和删除软件的命令: apt-cache sea ...
- 2535-springsecurity系列--关于授权角色“ROLE”前缀的问题
版本信息 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...
- 2521-Shiro系列-基本使用
在springboot中使用SHiro作为安全框架,非常简单,灵活性也比较高 在springboot中使用Shiro不用像官网教程那样,官网是将配置文件写在INI文件和XML配置中 springboo ...
- YII学习总结5(视图)
<?php namespace app\controllers; use yii\web\Controller; class HelloController extends Controller ...
- 八个解决你80%需求的CSS动画库
八个解决你80%需求的CSS动画库 点击打开视频讲解 在学习和工作的过程中,我们总免不了要写各种各样的css动画,给某个部分添加动画效果,如果觉得自己写的动画效果单一乏味,不妨试试这8个CSS动画库, ...
- BZOJ4569 [Scoi2016]萌萌哒(并查集,倍增)
类似\(ST表\)的思想,倍增\(log(n)\)地合并 你是我家的吗?不是就来呀啦啦啦.还有要来的吗?没了!那有多少个家就映射多少答案呀 倍增原来这么好玩 #include <iostream ...
- 总结-LCT
题单: https://www.zybuluo.com/xzyxzy/note/1027479 LuoguP3203 [HNOI2010]弹飞绵羊 动态加边,删边 #include <cstdi ...
- Jira使用浅谈篇一
本篇参考: https://www.jianshu.com/u/9dd427d9ad94 Salesforce 生命周期管理(二)Agile & Scrum 浅谈 我们都知道 salesfor ...
- Spring源码-xml解析
Spring使用SAX解析xml.SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. ...