Java基础知识点(反射、异常、IO流、变量...)

1|0Java基础知识点(反射、异常、IO流、变量...)

1|11.反射

Java反射机制是在运行状态下,对于**任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

反射的应用场所:反射是框架设计的灵魂

大量使用了动态代理,而动态代理的实现也依赖反射

Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring通过 XML 配置模式装载 Bean 的过程:

  1. 将程序内所有 XML 或 Properties 配置文件加载入内存中

  2. Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息;

  3. 使用反射机制,根据这个字符串获得某个类的Class实例;

  4. 动态配置实例的属性。

==优点==:在运行期间确定对象,绑定对象,操作对象,最大限度的发挥了Java的灵活性

==缺点==:反射会跳过类型检查等,导致安全问题。例如通过反射跳过泛型的编译前类型检查

总结

业务代码中不建议使用Java反射

开发框架中一定会用到Java反射

1|22.Java异常

异常主要分为ErrorException两种

  • Error类以及他的子类的实例,代表了JVM本身的错误---错误不能被程序员通过代码处理

  • Exception以及他的子类,代表程序运行时发送的各种不期望发生的事情。可以被Java异常处理机制使用处理,是异常处理的核心。

try{} catch{ } finally{} 的执行顺序:

  1. 先执行try中的语句,包括return后面的表达式;

  2. 有异常时,执行catch中的语句,包括return后面的表达式,无异常时跳过catch语句;

  3. 然后执行finally中的语句,如果finally里面有return语句,执行return语句,程序结束;

  4. finally{}中没有return时,无异常时执行try中的return,如果有异常则执行catch中的return。前两步执行的return只是确定返回的值,程序并未结束,finally{}执行之后,最后将前两步确定的return的返回值返回。

Throws VS Throw

==区别一:==

throws:跟在方法声明后面,后面跟的是异常类名

throw:用在方法体内,后面跟的是异常类对象名

==区别二:==

throws: 可以跟多个异常类名,用逗号隔开

throw:只能抛出一个异常对象名

==区别三:==

throws:表示抛出异常,由该方法的调用者来处理

throw:表示抛出异常,由该方法体内的语句来处理

==区别四:==

throws:throws表示有出现异常的可能性,并不一定出现这些异常

throw:throw则是抛出了异常,执行throw一定出现了某种异常

1|33.IO流

IO流的作用是在==本地磁盘和网络上进行操作==

一般==文本文件==使用==字符流==来处理

一般==非文本文件==使用==字节流==来处理

I/O 是针对内存 in :硬盘—>内存

out:内存—>硬盘

InputStream:字节输入流

Reader:字符输入流

OutputStream:字节输出流

Writer:字符输出流

BIO:Blocking IO 同步阻塞IO模式,数据的读取写入必须阻塞在一个线程内等待其完成

NIO:Non-Block IO

1|44.Switch关键字

switch可以作用于char byte short int 以及他们的包装类,switch不可以用在long double float boolean

JDK之后可以作用于枚举类,在JDK1.7之后,可以作用于String

1|55.Java语言采用何种编码方式

Java语言采用==Unicode==编码标准,它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。

1|66.static关键字

static关键字的主要用途就是方便在没有创建对象时调用方法和变量,优化程序性能

==static变量==

static修饰的变量被称为静态变量,也被称为类变量,可以直接通过类名来访问它。静态变量被所有的对象共享,在内存中只有一个副本,仅当在类初次加载时会被初始化,而非静态变量在创建对象的时候被初始化,并且存在多个副本,各个对象拥有的副本互不影响。

==static方法==

static方法不依赖于任何对象就可以进行访问,在static方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用,但是在非静态成员方法中是可以访问静态成员方法/变量的。

==static代码块==

静态代码块的主要用途是可以用来优化程序的性能,因为它只会在类加载时加载一次,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。如果程序中有多个static块,在类初次被加载的时候,会按照static块的顺序来执行每个static块。

1|77.无参构造器的作用

Java程序存在继承,在执行子类构造方法时,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。如果父类只定义了有参数的构造函数,而子类的构造函数没有用super调用父类那个特定的构造函数,就会出错。

1|88.变量

成员变量 又称为 全局变量,可以分为类变量实例变量

 类变量实例变量局部变量
定义位置 类中,方法外(static) 类中,方法外(无static) 方法中
初始值 有默认初始值 有默认初始值 无默认初始值
存储位置 方法区
生命周期 类何时被加载和卸载 实例何时被创建及销毁 方法何时被调用及结束调用

1|99.值传递

Java只有值传递

  1. 传递基本数据类型,是用的值传递

public class Main {
   public static void main(String[] args) {
       int a = 1;
       printValue(a);
       System.out.println("a:" + a);
  }
   public static void printValue(int b){
       b = 2;
       System.out.println("b:"+ b);
  }
}
b:2
a:1
  1. 传递对象,传递的是一个引用的副本,只是这个副本引用和原始的引用指向的同一个对象,所以副本引用修改过对象属性之后,通过原始引用查看对象属性肯定也是被修改过的。

public class Main2 {
   public static void main(String[] args) {
       Preson p = new Preson();
       p.name = "zhangsan";
       printValue(p);
       System.out.println("p.name: " + p.name);
  }
   public static void printValue(Preson q){
       q.name = "lisi";
       System.out.println("q.name: "+ q.name);
  }
}
class Preson{
   public String name;
}
q.name: lisi
p.name: lisi

1|1010.常用的Object方法

Object clone():创建与该对象的类相同的新对象

boolean equals(Object):比较两对象是否相等

void finalize():当垃圾回收器确定不存在对该对象的更多引用时,对象垃圾回收器调用该方法

Class getClass():返回一个对象运行时的实例类

int hashCode():返回该对象的散列码值

void notify():唤醒等待在该对象的监视器上的一个线程

void notifyAll():唤醒等待在该对象的监视器上的全部线程

String toString():返回该对象的字符串表示

void wait():在其他线程调用此对象的 notify() 方法或 notifyAll()方法前,导致当前线程等待

1|1111.新建对象的方式

  • new 创建新对象、调用了构造函数

  • 通过反射机制、调用了构造函数

  • 采用clone机制、没有调用构造函数

  • 通过序列化机制、没有调用构造函数

  •  

__EOF__

本文作者CaiDingChao
本文链接https://www.cnblogs.com/CaiDingChao/p/16557965.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   寂灭无言  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示