【 java 底子问题 第一篇 】

[复制链接]
发表于 2025-5-26 03:10:59 | 显示全部楼层 |阅读模式
目录

1.概念
1.1.java的特定有哪些?
1.2.java有哪些上风哪些劣势?
1.3.java为什么可以跨平台?
1.4JVM,JDK,JRE它们有什么区别?
1.5.编译型语言与表明型语言的区别?
2.数据类型
2.1.long与int类型可以互转吗?
2.2.数据类型变化形式有哪些?
2.3.类型转换会出现哪些问题?
2.4.为什么用bigDecimal 不消double?
2.5.装箱与拆箱会出现什么问题?
2.6.Integer为什么会存在一个缓存池?
3.面向对象
3.1.怎么理解面向对象?
3.2.说一下封装继续多态?
3.3.多态体如今哪几个方面?
3.4.重写与重载的区别?
3.5.抽象类与平凡类的区别?
3.6.抽象类与接口的区别?
3.7.抽象类可以加final关键字吗?
3.8.表明一下静态变量与静态方法?
3.9.为什么静态不能调用非静态?
3.10.为什么非静态内部类可以访问外部类?
4.关键字
4.1.final


1.概念

1.1.java的特定有哪些?



  • 平台无关性:"一次编译终身运行",就是说java编译器会将源代码先编译成字节码(不同机器上只要源代码相同,那么就字节码一定相同),然后JVM会将字节码翻译成对应的机器码(JVM有不同体系的版本,JVM会根据你的环境进行翻译),总的来说就是字节码保证编译一致,然后根据不同的JVM翻译对应机器码
  • 面向对象:java是一个面向对象的语言,更方便代码的维护和使用
  • 内存管理:java拥有垃圾接纳机制,开发人员不必要自己手动删除内存(不必要考虑这么多),由垃圾接纳机制来自动实现内存开释



1.2.java有哪些上风哪些劣势?

上风:(特定那里)


  • 跨平台:java有平台无关性
  • 内存管理:拥有垃圾接纳机制
  • 面向对象:使代码更好维护和使用
  • 强大的生态体系:如Spring百口桶,其他的工具包等等
  • 稳固性:支持企业恒久使用,版本向后兼容

劣势:


  • 内存消耗大:JVM虚拟机本身就必要一定的内存
  • 启动时间长:由于必要JVM将字节码翻译成机器码
  • 代码复杂:由于java过于面向对象,一个简单的程序的代码复杂(麻烦)
1.3.java为什么可以跨平台?

java在编译时,java编译器会直接将源代码编写成字节码文件,等到你必要运行时,会根据你的JVM虚拟机版本不同,然后通过不同的JVM将字节码翻译成机器码(让机器识别)
1.4JVM,JDK,JRE它们有什么区别?

JVM:JVM是java虚拟机,是java程序运行的环境
JDK:JDK是java的一个开发工具包(各种类,工具)
JRE:JRE是java运行的环境,是java程序所需的最小环境


1.5.编译型语言与表明型语言的区别?

编译型:在运行之前必要编译,将源代码编写成字节码或者机器码(C++),如果它编写成机器码,在本机上可以直接识别机器码,从而它的运行速度快,跨平台性差
表明性:不必要编译,它会在运行时逐行表明代码,因运行速度慢,跨平台性好
2.数据类型

2.1.long与int类型可以互转吗?

可以:但是你必要考虑数据的溢出与丢失
比如:你将long类型转成int类型,如果你的long类型的数很大,大到int无法全部接收,那么就会出现数据的丢失
比如:你将int类型转成long类型,如果你的int类型的数很小,那么用long接收,由于long精度大,其他位将用0填充,出现数据溢出
  1. public class TypeConversion {
  2.     public static void main(String[] args) {
  3.         long bigLong = 2147483648L; // 超出 int 最大值(2147483647)
  4.         int intValue = (int) bigLong; // 强制转换
  5.         
  6.         System.out.println("原始 long 值: " + bigLong);  // 输出 2147483648
  7.         System.out.println("转换后的 int 值: " + intValue); // 输出 -2147483648(溢出)
  8.     }
  9. }
复制代码
2.2.数据类型变化形式有哪些?

自动类型转换(隐式转换):如果:你使用long类型与int类型进行相加,它会默认将int类型隐式转换成long,再进行运算
  1. public class AutoConversion {
  2.     public static void main(String[] args) {
  3.         int a = 10;
  4.         long b = 20L;
  5.         long result = a + b;  // int 自动提升为 long
  6.         
  7.         System.out.println(result);  // 输出 30
  8.     }
  9. }
复制代码
逼迫类型转换(表现转换):如果:你使用long类型与int类型进行相加,那么最后的结果只能用long类型接收,如果你想要使用int类型接收,那么必要逼迫类型转换
  1. public class ForceConversion {
  2.     public static void main(String[] args) {
  3.         long a = 2147483648L;  // 超过 int 最大值(2147483647)
  4.         int b = (int) a;       // 强制转换
  5.         
  6.         System.out.println(b);  // 输出 -2147483648(高位截断)
  7.     }
  8. }
复制代码
字符串转换:使用包装类内里的方法进行转换,比如:你将char类型转换成int,那么它会根据ASCII码对应表转成对应数
  1. public class StringConversion {
  2.     public static void main(String[] args) {
  3.         // 1. 字符串 → 数值类型(需处理异常)
  4.         String str = "123";
  5.         int num = Integer.parseInt(str);  // 字符串转 int
  6.         double d = Double.parseDouble(str);  // 字符串转 double
  7.         
  8.         // 2. 数值类型 → 字符串
  9.         String s1 = Integer.toString(num);  // 方法1
  10.         String s2 = String.valueOf(d);      // 方法2
  11.         String s3 = "" + num;              // 方法3(隐式转换)
  12.         // 3. char → int(ASCII 码转换)
  13.         char c = 'A';
  14.         int ascii = c;  // 直接赋值,输出 65
  15.         int numericValue = Character.getNumericValue('9');  // 输出 9
  16.     }
  17. }
复制代码
2.3.类型转换会出现哪些问题?

数据丢失:小类型转大类型(精度不同,造成数据丢失)
数据溢出:大类型转小类型(高位全用0填充)
精度不同:float是单精度,double是双精度,两者转换精度会出现丢失
类型不同:不同类型的转换会出现编译错误
2.4.为什么用bigDecimal 不消double?

举例:你能使用十进制表现1/3吗?无法表现,一直在循环,而double是进行二进制运算的,比如:0.1你能使用二进制进行表现吗?也是一直循环,而double是有精度的,到达它的精度限度后,它不会在循环下去,因此会出现精度丢失问题
办理:使用bigDecimal(留意:如果你还是使用浮点数赋值给它,还是会出现该问题(默认浮点数就是double类型),因此使用字符串赋值)
  1. System.out.println(0.1 + 0.2); // 输出 0.30000000000000004(精度丢失)
复制代码
  1. import java.math.BigDecimal;
  2. public class BadExample {
  3.     public static void main(String[] args) {
  4.         BigDecimal a = new BigDecimal(0.1); // 用 double 初始化(错误!)
  5.         BigDecimal b = new BigDecimal(0.2);
  6.         BigDecimal result = a.add(b);
  7.         
  8.         System.out.println(result); // 输出 0.3000000000000000166533453694...
  9.     }
  10. }
复制代码
  1. import java.math.BigDecimal;
  2. public class GoodExample {
  3.     public static void main(String[] args) {
  4.         BigDecimal a = new BigDecimal("0.1"); // 用字符串初始化(正确!)
  5.         BigDecimal b = new BigDecimal("0.2");
  6.         BigDecimal result = a.add(b);
  7.         
  8.         System.out.println(result); // 输出 0.3
  9.     }
  10. }
复制代码
2.5.装箱与拆箱会出现什么问题?

装箱:就是将根本类型包装成包装类
拆箱:就是将包装类拆成根本类型
问题:由于java可以实现自动装箱与拆箱,如果你定义一个Integer类型,但是没有给它赋值,它会默认null,然后将它拆箱,但是null值是无法拆箱的,因此会出现空指针异常
2.6.Integer为什么会存在一个缓存池?

由于我们必要使用对应的包装类,但是每次都必要重新创建对象(消耗内存),并且进行一个运算就会创建一个对象(无关内存),因此为了节流内存,java将我们常使用的-128到127的对象已经创建好了,放在静态缓存池中,你使用.valueInt()这个方法进行赋值,它就会去复用池中对象(地址相同)
  1. Integer a = Integer.valueOf(100);  // 从缓存池获取(地址相同)
  2. Integer b = 100;                   // 隐式调用 valueOf(),复用缓存
  3. Integer c = new Integer(100);      // 强制创建新对象(地址不同)
  4. System.out.println(a == b);  // true(同一对象)
  5. System.out.println(a == c);  // false(不同对象)
复制代码
3.面向对象

3.1.怎么理解面向对象?

面向对象就是将现实生存中的各个事件抽象成对象
3.2.说一下封装继续多态?

封装:就是将共性的属性与方法封装到类中,隐蔽类中的细节,仅暴暴露你想要暴露的接口来与外界交互,增加了代码的安全性和扩展性
继续:子类共享父类的属性与方法,是代码实现复用,创建了类与类之间的联系,是类之间的结构更加清楚
多态:不同类对应不同消息的不同操作方式,是代码更加灵活
3.3.多态体如今哪几个方面?

方法重载:同一个类可以有多个方法名相同的方法(参数不同)
方法重写:子类重写父类的方法
接口实现:不同的类实现同一个接口,那么创建对象时,可以使用接口创建,调用方式一致
向上与向下转型:向上:父类转子类   向下:子类转父类
3.4.重写与重载的区别?

重写:子类重写父类方法,必要与父类方法名,返回类型,参数保持一致,只能修改其内部的代码
重载:在同一个类中你可以重载多个方法名相同的方法,但是区别在于参数不同(1.参数类型不同,2.参数数目不同,3.参数次序不同),满足一个即可
3.5.抽象类与平凡类的区别?

   实例化:抽象类不可以实例化,平凡类可以
  -----
  方法实现:抽象类方法可以实现可以只定义,而平凡类必要具体的方法实现
  3.6.抽象类与接口的区别?

   实现方式:抽象类必要继续extends,接口必要实现implements
  -----
  访问修饰符不同:两者的属性与方法默认修饰符不同
  -----
  方法实现不同:抽象类方法可以定义可以实现,接口只能定义
  -----
  变量:抽象类可以有实例变量和静态变量,而接口只有静态变量
  -----
  特点:接口是定义类的功能或行为,抽象类是描述类的共性和行为的
  3.7.抽象类可以加final关键字吗?

不可以,抽象类本身就是一个基类就是让其他类继续的,而类加上final会让该类无法被继续
因此两者互斥
3.8.表明一下静态变量与静态方法?

静态的东西只有当类加载完后,它就会加载,只会在内存中加载一次
3.9.为什么静态不能调用非静态?

静态只有当类加载完就会加载,因此静态会优先于非静态加载(必要实例化),你一个没加载的怎么能被调用呢?
比如:静态方法内里调用非静态方法,我静态方法都已经加载完了,而你非静态方法必须要实例化才能加载,没有实例化不加载,那么我怎么调用你呢?(不能确定非静态是否加载)
比如:反过来,就可以表明为什么非静态可以调用静态,因为非静态加载慢,它加载完就一定有静态加载完,因此可以调用
  1. public class Example {
  2.     static int staticVar = 10;  // 类加载时初始化
  3.     int instanceVar = 20;      // 对象实例化时初始化
  4. }
复制代码
  1. public class Example {
  2.     static void staticMethod() {
  3.         instanceMethod();  // 编译错误:无法调用非静态方法
  4.         System.out.println(instanceVar);  // 编译错误:无法访问非静态变量
  5.     }
  6.     void instanceMethod() {
  7.         System.out.println("非静态方法");
  8.     }
  9. }
复制代码
  1. public class Example {
  2.     static int staticVar = 10;
  3.     void instanceMethod() {
  4.         System.out.println(staticVar);  // 合法:静态成员已加载
  5.         staticMethod();                // 合法:静态方法已加载
  6.     }
  7.     static void staticMethod() {
  8.         System.out.println("静态方法");
  9.     }
  10. }
复制代码
3.10.为什么非静态内部类可以访问外部类?

就是当外部类实例化后,会将外部类的实例化地址(引用)当作参数传给非静态内部类,因此它可以根据引用来访问
4.关键字

4.1.final

修饰类代表类不能被继续
修饰方法代表方法不能被重写
修饰变量如果是根本类型,值不能被修改,是引用类型,值可以被修改,地址不能修改


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-10 02:42 , Processed in 0.079815 second(s), 30 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表