Java是如何在运行时识别对象和类的信息的?
一般讲是两种:
1. “传统的”RTTI,他假定我们在编译时已经知道所有的类型。
2. 反射,并允许在运行时发现和使用类的信息。
反射可以拿到任何类的信息,包括内部类和匿名类,可以调用任意方法,访问和修改域(final类不能修改)。对于private等修饰词,只需要setAccessible(true)一下即可,很牛逼的呢。
RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
package nihaokid;
import java.util.Arrays;
import java.util.List;
abstract class shape
{
void draw(){System.out.println(this+".draw()");}
abstract public String toString();
}
class circle extends shape
{
@Override
public String toString() {
return "circle";
}
}
class sqare extends shape
{
@Override
public String toString() {
return "sqare";
}
}
public class testRTTI
{
public static void main(String[] asd)
{
List<shape> shapelist = Arrays.asList(new circle(),new sqare());
for(shape a:shapelist)
a.draw();
}
}
输出:其实就是多态而已
circle.draw()
sqare.draw()
为使用类而做的准备 写道
1. 加载。获取到字节码,创建class对象
2. 链接。验证类中的字节码,为静态域分配存储空间,解析其他类引用。
3. 初始化。初始化超类,静态语句执行。(静态中,先初始化块,再初始化变量。)
泛型杂记 写道
Class<? extends Number> integer = int.class;//可以 <? extends A & B>
Class<Objact> ss = String.class;//编译错误
class A{};
class B extends A{};
Class<A> hello = B.class.getSuperclass();//编译时错误
Class<? super B> hello = B.class.getSuperclass();//可以
泛型的擦除问题:核心动机--使得泛化的客户端可以用非泛化的类库来使用。“迁移兼容性”
泛型对传入的值进行编译期检查,对传出的值进行值的转换。
任何在运行时需要知道确切类型信息的操作都将无法知道
class Erased<T>{
private final static int Size = 100;
private static void f(Object arg){
if(arg instanceof T){}//Error
T var = new T();//Error
T[] array1 = new T[Size];//Error
T[] array2 = (T)new Object[Size];//Unchecked warning
}
}
class AA{};
class BB extends AA{};
List<? extends AA> list = new ArrayList<BB>();
list.add(new BB());//编译错误
list.add(new AA());//编译错误
list.add(new Object());//编译错误
内部类杂记 写道
1、隐藏你不想让别人知道的操作,也即封装性。
2、一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!
内部类的功能在于,每个内部类都能独立的继承一个接口的实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多重继承的解决方案变得完整,并且内部类允许继承多个非接口类型(类或抽象类)。通过内部类分别继承一个基类,外部类创建内部类的对象,并使用内部类的方法,变相地实现了多继承。
java内部类有什么好处?为什么需要内部类?
1、举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。
2、真正的原因是这样的,java中的内部类和接口加在一起,可以解决常被C++程序员抱怨java中存在的一个问题:没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。
静态内部类和非静态内部类的区别
1、和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。
2、在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。
类型杂记 写道
Class类中的isInstance()方法可以更灵活的代替instanceof表达式。
Class.forName()和clazz.class的区别
同样是拿到class类型,但前者会初始化该类,而后者不会,即在执行静态初始化器和静态初始化块。
前者在运行时获取,需要加异常,后者编译时检查,显然前者灵活,后者安全。
分享到:
相关推荐
除了Java基础之外,还有一小部分web方面的知识,如:JSP、EL表达式、JSTL、过滤器与监听器之类的知识,但是只有一小部分
5. **学习杂记**:学习加密算法不仅需要理解算法原理,还要熟悉Java提供的加密API。实践是提升技能的关键,通过编写示例代码,理解如何创建密钥、初始化Cipher对象、处理加密和解密过程。同时,了解加密过程中的常见...
- **jre**:Java 运行时环境,包含了运行 Java 程序所需的库和虚拟机。 - **src.zip**:源代码归档文件,通常包含了一个项目的全部源代码。 以上是对给定文件中提到的基础知识点的详细解释,涵盖了计算机编程领域的...
然而,Eclipse需要Java运行环境支持,因此你需要先安装JRE(Java Runtime Environment)和JDK(Java Development Kit)。JRE提供运行Java程序所需的环境,JDK则包含开发工具。下载并安装jre-6u23-windows-i586.exe和...
本篇将深入探讨Java多线程的相关知识,结合《java随笔杂记.doc》文档中的内容,我们将覆盖以下几个方面: 1. **线程的创建方式** - 实现`Runnable`接口:创建一个实现了`Runnable`接口的类,然后将其实例传递给`...
在Java并发编程中,AbstractQueuedSynchronizer(AQS)是一个重要的抽象类,它是实现锁和其他同步组件的基础。AQS通过一个int类型的state变量来管理锁的状态,这个状态可以是独占模式(exclusive mode)或共享模式...
在本篇《SpringMVC杂记(五) JSR303数据验证》中,我们将深入探讨SpringMVC框架如何集成并使用JSR303(JavaBeans Validation)来进行数据验证,这是一种强大的验证机制,可以确保应用程序接收到的数据是合法且符合...
首先,Listener(监听器)是Java Servlet规范中的一部分,主要用于监听特定事件并执行相应操作。常见的Listener包括HttpSessionListener、ServletContextListener和ServletRequestListener等。例如,...
3. **Java编译**:Java Compiler将R文件、Java源代码、aidl转换的Java接口统一编译为.class文件。 4. **DEX生成**:通过dx工具将.class文件转换为Dalvik可执行的.dex文件。 5. **资源打包**:将处理后的资源文件、...
### STS、Maven与Nexus操作指南及配置详解 ...综上所述,通过详尽配置STS、Maven以及Nexus,可以建立一个高效的Java项目开发与构建环境,不仅提升了代码管理效率,还优化了依赖组件的下载和更新流程。
【Linux基础命令杂记】 在Linux环境中,掌握基础命令对于日常运维和开发工作至关重要。这里列举了一些常用的Linux命令,以及如何在Linux系统中与MySQL数据库交互。 1. **登录远程MySQL**: 使用命令 `mysql -h ...
```java @SessionAttributes("stepData") public class WizardController { // ... } ``` 这样,名为"stepData"的模型属性将在用户在向导的不同步骤之间导航时保持其值。 2. 多步骤流程管理: 在每个步骤中...
"Miscellany: Raizunne 杂记的 Minecraft mod 存储库"是一个专注于1.7.10版本的Minecraft模组集合,为游戏带来了一系列丰富多样的新元素和功能,让玩家在游戏中享受到更多元化的乐趣。 首先,我们要明确,...
程序员考试刷题讲座问题/杂记 使用hackerrank、codecademy、codesignal解决练习题 修改数组,比较 公共和静态是默认的? (是在讲座中) 所以局部变量没有默认值,但实例(类)变量有 使用随机 第 9 课的幻灯片 44 ...
zxing.java源码解析 个人技术博客 前言 开卷有益。 写在最前,长期以来,技术学习并没有养成分享的习惯。没有好好成体系的整理自己所学的知识,时间长了也容易遗忘。 仓库名起名PlayPen,这个名字源于我上一家公司一...
Java 数据库 Linux 杂记 :bullseye: :hot_beverage: :floppy_disk: :cloud: :memo: :black_nib:本仓库有来源自己总结,网上收集,视频笔记,如果有区别之处,可以联系我进行删除。 :scroll:笔记仓库: ...
#### 六、杂记 - **Namenode和Secondarynamenode的关系**: Namenode是HDFS的核心组成部分,负责管理文件系统的命名空间及客户端对文件的访问。而Secondarynamenode的主要职责是辅助Namenode,它定期合并fsimage文件...
jbpm,全称为Java Business Process Management,是一款开源的工作流管理系统,用于实现业务流程自动化。它在企业级应用中广泛使用,特别是在需要管理复杂工作流程的系统中。通过对jbpm的学习,我们可以深入理解业务...
通过阅读这个系列,你可以深入了解面向底层的C语言,以及面向业务的面向对象编程语言,比如JAVA和C++,同时还能接触到游戏开发的实例。 C语言是计算机科学中的基石,它让你能够直接与硬件交互,理解内存管理、指针...