java基础一点也不基础

Flink aggregate()函数使用遇到的一点小问题 在使用aggregate()函数的时候,一直报错,先贴代码吧 一直不知道是什么原因,只是说方法不匹配,想想可能是keyBy函数的返回key值类型不对,改成String类型,果然是这个问题。 因为是java写,所以要注意这个问题: scala好像不需要注意这个点 : 使用对象: package com.aliyun.market; import co... 阅读详情

(新建的群1039047324,欢迎对技术感兴趣的朋友加入,群内可以接私活,聊技术,分享工作中容易踩的坑,以及如何避免踩坑,分享最新架构视频)

1 创建对象的有哪几种方式
创建对象是否一定要通过构造器,当然不是。

1)  通过new 创建对象。这种方法需要用到构造器

    Demo demo1=new Demo();Java String类为什么是final的
    Demo demo2=new Demo(1,"有参构造器");

2) 通过反射 newInstance()创建对象。这种方法用到构造器

  Demo demo2=(Demo) Class.forName("Demo").newInstance();

3) 通过object类的clone方法。需要实现Cloneable接口,重写object类的clone方法。无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。

  Demo demo4=(Demo) demo2.clone();

4) 反序列化。java 中常常进行 JSON 数据跟 Java 对象之间的转换,即序列化和反序列化。
当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口,虽然该接口没有任何方法。不会调用任何构造函数。

2 Java String类为什么是final的 

  1. 为了实现字符串池
  2. 为了线程安全
  3. 为了实现String可以创建HashCode不可变性

    首先你要理解final的用途,在分析String为什么要用final修饰,final可以修饰类,方法和变量,并且被修饰的类或方法,被final修饰的类不能被继承,即它不能拥有自己的子类,被final修饰的方法不能被重写, final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。

在了解final的用途后,在看String为什么要被final修饰:主要是为了”安全性“和”效率“的缘故。

final修饰的String,代表了String的不可继承性,final修饰的char[]代表了被存储的数据不可更改性。但是:虽然final代表了不可变,但仅仅是引用地址不可变,并不代表了数组本身不会变,请看下面图片。

 

如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。


    因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。


    因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。


   字符串常量池,在大量使用字符串的情况下,可以节省内存空间,提高效率,String不可变性是最基本的一个前置条件。

 

3 反射中,Class.forName和classloader的区别?

Java中class是如何加载到JVM中的:
1.class加载到JVM中有三个步骤
    装载:(loading)找到class对应的字节码文件。
    连接:(linking)将对应的字节码文件读入到JVM中。
    初始化:(initializing)对class做相应的初始化动作。
2.Java中两种加载class到JVM中的方式
    1:Class.forName(“className”);
        其实这种方法调运的是:Class.forName(className, true, ClassLoader.getCallerClassLoader())方法
        参数一:className,需要加载的类的名称。
        参数二:true,是否对class进行初始化(需要initialize)
        参数三:classLoader,对应的类加载器
    2:ClassLoader.laodClass(“className”);
        其实这种方法调运的是:ClassLoader.loadClass(name, false)方法
        参数一:name,需要加载的类的名称
        参数二:false,这个类加载以后是否需要去连接(不需要linking)
        
    两种方式的区别
        forName("")得到的class是已经初始化完成的
        loadClass("")得到的class是还没有连接的
        一般情况下,这两个方法效果一样,都能装载Class。
        但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。

比如:连接数据库

    java使用JDBC连接数据库时候,我们首先需要加载数据库驱动。
    Class.forName(“com.mysql.jdbc.Driver”);//通过这种方式将驱动注册到驱动管理器上
    Connection conn = DriverManager.getConnection(“url”,“userName”,“password”);//通过驱动管理器获得相应的连接
    查看com.mysql.jdbc.Driver源码:

public class Driver extends NonRegisteringDriver
  implements java.sql.Driver
{
    //注意,这里有一个static的代码块,这个代码块将会在class初始化的时候执行
  static
  {
    try
    {
        //将这个驱动Driver注册到驱动管理器上
      DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
      throw new RuntimeException(“Can’t register driver!”);
    }
  }
}

Class.forName(“com.mysql.jdbc.Driver”)方法以后,他会进行class的初始化,执行static代码块。
    也就是说class初始化以后,就会将驱注册到DriverManageer上,之后才能通过DriverManager去获取相应的连接。
    但是要是我们使用ClassLoader.loadClass(com.mysql.jdbc.Driver)的话,不会link,更也不会初始化class。
    相应的就不会回将Driver注册到DriverManager上面,所以肯定不能通过DriverManager获取相应的连接。

4 java反射原理 (反射是框架设计的灵魂)

1 ) JAVA反射机制是在运行状态中

对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2) 反射提供的功能:

在运行时判断任意一个对象所属的类
    在运行时构造任意一个类的对象
    在运行时判断任意一个类所具有的成员变量和方法
    在运行时调用任意一个对象的方法
(要想解剖一个类,必须先要获取到该类的字节码文件对象(class)。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.)

3) 关于class对象和这个class类

Class对象的由来是将class文件读入内存,并为之创建一个Class对象

4) class类 :代表一个类,是Java反射机制的起源和入口
用于获取与类相关的各种信息, 提供了获取类信息的相关方法
    Class类继承自Object类
    Class类是所有类的共同的图纸
    每个类有自己的对象,同时每个类也看做是一个对象,有共同的图纸Class,存放类的结构信息,能够通过相应方法取出相应的信息:类的名字、属性、方法、构造方法、父类和接口。

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。

没有公共的构造方法,方法共有64个太多了。

5) 反射的使用场景
    Java编码时知道类和对象的具体信息,此时直接对类和对象进行操作即可,无需反射。如果编码时不知道类或者对象的具体信息,此时应该使用反射来实现。比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息。在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息。

6) 获取反射入口(class对象)的三种方法

要想操作反射,必须先拿到反射的入口

1,通过通过Class.forName("全类名")

 2,对象.getClass()

3,类名.class (任何数据类型(包括基本数据类型)都有一个“静态”的class属性)

注意:在运行期间,一个类,只有一个Class对象产生。

3种方式常用第1种,第2种对象都有了还要反射干什么。第3种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第1种,一个字符串可以传入也可写在配置文件中等多种方法。

 

Java高级技术之List线程不安全的一点说明 1、List 是线程不安全的 学过Java的朋友都知道List是线程不安全的,什么是线程不安全,多个线程同一时刻对同一个全局变量(同一份资源)做写操作(读操作不会涉及线程安全)时,如果跟我们预期的结果一样,我们就称之为线程安全,反之,线程不安全。 ... 阅读详情

相关推荐

APK静态分析(取证角度)——理论部分

APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。

currify的博客 3211

java学不会_我害怕我JAVA学不会

我问过一些想学编程的人,很多人说我怕,我害怕我学不会,首先我想反问同学们一句你怕的话,如果我免费让你来学,那么请问你还怕吗?可能你就不会怕了,所以你怕的到底究竟是什么?我分了2种情况来分析一下:情况1:你害怕的是你学不会浪费你的金钱。但是我想说的是,咱们目前的学费是2本书的价格不到,请问你害怕的就是这个吗?如果你害怕的是这个,我感觉你确实是该考虑一下自己的格局,是否格局小了些难道仅仅因为这点钱,就...

weixin_29092579的博客 460

揭秘Synopsys EDA中的AI黑科技:DSO.ai如何改变传统芯片设计流程

本文深入探讨了Synopsys EDA中的AI黑科技DSO.ai如何革新传统芯片设计流程。通过数据驱动的方法论、功耗优化革命和时序收敛智能加速,DSO.ai显著提升了设计效率和质量,实现了从经验驱动到AI驱动的范式转变。文章还提供了实战指南,帮助团队跨越AI EDA的实施鸿沟。

weixin_29296241的博客 527

LTspice+C程序:以太网信号完整性仿真与参数优化指南

信号完整性是高速有线网络设计中的核心挑战,信号在传输线上的反射、损耗、串扰和抖动会直接导致丢包与速率降档。理解这些基本原理后,工程师需要借助仿真工具量化信号质量,其中眼图分析是评估电压裕度和时序裕度的关键手段。对于百兆/千兆以太网等场景,通过LTspice搭建传输线链路模型,用C程序自动生成PRBS激励、批量参数扫描并计算眼图指标,可以低成本完成预加重系数优化与信号完整性验证。这套方法不仅适用于以太网PHY、交换机等硬件调试,还能延伸到更高速率串行链路的趋势预判,帮助工程师在改板前锁定最优设计方案。本文将从

weixin_34342992的博客 508

基于STM32的PID恒温恒湿控制系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了基于双路PID算法的恒温恒湿闭环控制系统,覆盖高精度温湿度采集、双模式控制、参数在线配置、异常安全保护、掉电记忆等全功能,全程采用无跳步保姆式教学,从硬件选型、接线、CubeMX配置、代码开发、调试排坑全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 347

MOOS-ivp实战:从零搭建水下机器人通信系统(Ubuntu 22.04版)

本文详细介绍了在Ubuntu 22.04系统上从零开始搭建MOOS-ivp水下机器人通信系统的完整实战流程。内容涵盖环境准备、核心安装、MOOSDB通信模型解析、自定义应用节点开发、以及调试监控工具链的使用,旨在帮助开发者快速掌握这一分布式机器人系统框架,构建稳定可靠的水下机器人通信与控制系统。

snow3的博客 636

这些Java基础不会,别说你入门了。

Java编程作为入门比较容易的编程语言,发展前景很好,非常适合零基础的小白入门学习。 一、Java编程基础 编程语言中通用的语法点,学会写出符合语法规范的代码,逐步适应与计算机进行沟通的方式,即“你告诉我要做什么,数据在哪里,我来执行”。 二、Java面向对象编程 学习面向对象的思想,以类和对象的方式,花式组织代码和数据,从而能够让你的程序解决更为复杂的问题。学完后可以深刻理解、Java、面向对象的思想带来的好处,并利用它们来解决实际问题。 三、、Java中的异常处理 当代码执行出现错误时,Ja

qq3164069700的博客 272

用Bus Hound和MIDIOX抓包分析USB MIDI数据流:从硬件接口到软件解析的完整实战

本文详细介绍了如何使用Bus Hound和MIDIOX工具抓包分析USB MIDI数据流,从硬件接口到软件解析的完整实战过程。通过解析MIDI协议、捕获Note On/Off事件、控制变更消息等实例,帮助开发者深入理解音乐数字接口的底层通信机制,并提供了常见问题的解决方案和调试技巧。

weixin_42692935的博客 407

自学Java,我一点都不后悔

Java的成长总是让人感到惊喜,它一直在进化。 Java1.4性能得到了提升;1.5增加泛型,线程池,注解;1.6性能提升;1.7又加了Try with Resource,switch String等小功能,多线程方面也有改进,性能提升,g1的gc策略;然后1.8加入lambda, stream等功能。 1995年5月正式发布Java 1996年,SUN公司发布了Java的第一个开具包 JDK1.0 1997年, JDK1.1 1998年,JDK1.2,大大改进了早起版本的缺陷,更名伟Ja..

Java_college的博客 230

【Python实战解析】从数据爬取到房价预测:一个完整的数据科学项目流程拆解

本文详细拆解了一个完整的Python数据科学项目流程,从爬取长沙二手房数据到房价预测模型构建。通过实战案例,介绍了数据爬取、清洗、可视化及模型优化的关键技巧,帮助开发者掌握Python在数据分析中的应用,提升程序开发能力。

weixin_30379531的博客 412

手把手教你学Simulink--控制策略与算法的DC-DC变换器领域仿真领域建模实例:基于Simulink实现一个双闭环控制Buck变换器的仿真建模

目录主要步骤1. 前期准备2. 构建Buck变换器模型3. 定义双闭环控制器4. 设置参考电压和反馈回路5. 实现双闭环控制器逻辑6. 仿真参数设置7. 运行仿真与结果分析示例整合代码片段1. Simulink模型2. 双闭环控制器参数调节3. 仿真结果分析总结双闭环控制是一种常见的控制策略,广泛应用于电力电子系统(如DC-DC变换器)中。它通过内外两个环路的协同工作,分别控制系统的动态性能和稳态性能。对于Buck变换器,通常采用电流内环和电压外环的双闭环控制结构。以下是一个手把手教程,帮助你基于Simul

MHD0815的博客 326

关于java中针对移位操作的一点不理解

最近在重温一些java的基础知识,翻阅think in java中关于移位这块时,提到了如下的一段文字: 针对char,byte和short类型的移位操作,都将先转换为int型,再进行移位,最终结果也将是int型。 但是只有数值右端的低5位才有效,是为了防止移位超过int自身的位数。译注:因为2的5次方是32,int自身是32位。 以上的文字我在看的时候,感觉自己不是特别理解,不知道...

matthieu 156

Fiori Elements 从入门到精通开发教程的文章目录

Fiori Elements 开发技术相对 SAP 其他历史悠久,发展成熟的开发技术来说,是一个新事物。正因如此,迄今为止国内深入讲解 Fiori Elements 应用的中文材料几乎没有。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4876

Java 中的覆盖@Override注解 写与不写的一点点理解

/*俺的菜鸟笔记      Java 中的覆盖@Override注解 写与不写的一点点理解      一般来说,写与不写没什么区别,JVM可以自识别      写的情况下:即说明子类要覆盖基类的方法,基类必须存在方法                          (控制类型public,protected,返回值,参数列表类型)与子类方法完成一致的方法,否则会报错(找不到被Overri

qq_26499965的博客 1672

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java语言不允许方法覆盖_[原]java语言中方法覆盖的一点思考

在java的继承中,我们可以在子类中定义一方法去覆盖父类中定义的同名同参方法,这叫方法覆盖。其中有一点让我几经思考:父类的私有方法不能被子类覆盖。我们先来看一个例程(引用孙MM的,呵呵)://Sub.java ,例程1class Base{private String showMe(){return "Base";}public void print(){System.out.print(sho...

weixin_39792472的博客 135

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

关于Qt for Android的一点思考---为啥是C,又为啥不可以是java?!

为啥是C,又为啥不可以是java?!android这个平台技术让人感觉为之疯狂!其实效率问题并没有那么严重,至少目前个人感觉还不是很明显。Dalvik VM可以堪称天才般的设计了,毕竟java存在很多年了,想对它进行改进真是很难做到的而Dalvik VM做到了。至于QT引入到android平台,其实更多的是出于一种商业上的考量而并非技术上的,QT在并行这一块及进程通讯这一块没有JAVA在ANDRO

无为小丑 1953

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JAVA程序员写简历的个人一点小建议,不喜勿喷

JAVA程序员写简历的个人一点小建议,不喜勿喷

十一的博客 927

java学不下去能学web安全吗,这半年学习 Web 安全的一点心得体会

原标题:这半年学习 Web 安全的一点心得体会来自公众号: 信安之路大家好,我是 Mirror(王宇阳),专科在读的大二学生;接触信安时间不长,大佬多多指教。信安之路成长平台网站开放后我就在双十一那天积极注册、上传报告,目的就是希望自己的笔记可以和更多人分享;到目前为止我上传了 12 份报告,总共获得 106 分。这段时间可以说是我踏入信安的见证吧! 大学我的专业是“Web 前端开发”,高中我学习...

weixin_39950772的博客 383

java学习中自己平时不注意的一点知识点1:基础知识第一部分

1、求两个数大小Math.max(a,b)求三个数最大值Math.max(Math.max(a,c),b) 2、Java SE包含构成Java语言核心的类。比如数据库连接、接口定义、数据结构、输入/输出、网络编程。 Java EE包含Java SE中的所有类,并且还包含用于开发企业级应用的类。 Java中,所有的程序都是在Java虚拟机(JVM)上运行的。 3、 JD...

anmodiao5169的博客 239

每天进步一点点

自制力不是很高!我需要用这种方式来锻炼!每天看一点写一点JAVA

forhappy0930的专栏 108

java 接口 抛出异常_Java接口抛出异常,但接口实现不抛出异常?

我读到这段代码的接口抛出一个异常,但实现它不抛出一个或赶上一个类,这是为什么?在java中合法还是安全?Java接口抛出异常,但接口实现不抛出异常?import java.rmi.*;public interface MyRemote extends Remote {public String sayHello() throws RemoteException;}import java.rmi.*...

weixin_35936869的博客 2074
上一篇: HashMap暴露了你的java基础功底
下一篇: 互联网高并发设计手段
微服务架构
博客等级 码龄10年 15粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值