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、过滤器与监听器之类的知识,但是只有一小部分
java加密算法AES\DES\RSA示例及常用知识学习杂记
程序员考试刷题讲座问题/杂记 使用hackerrank、codecademy、codesignal解决练习题 修改数组,比较 公共和静态是默认的? (是在讲座中) 所以局部变量没有默认值,但实例(类)变量有 使用随机 第 9 课的幻灯片 44 ...
zxing.java源码解析 个人技术博客 前言 开卷有益。 写在最前,长期以来,技术学习并没有养成分享的习惯。没有好好成体系的整理自己所学的知识,时间长了也容易遗忘。 仓库名起名PlayPen,这个名字源于我上一家公司一...
Java 数据库 Linux 杂记 :bullseye: :hot_beverage: :floppy_disk: :cloud: :memo: :black_nib:本仓库有来源自己总结,网上收集,视频笔记,如果有区别之处,可以联系我进行删除。 :scroll:笔记仓库: ...
---杂记 2020/3/25-2020/4/12 矫情下,莫认真 接下来奉上近日学习内容 ok这也是本人的一幅作品,有兴趣的同学可以收藏下。。。。 哈哈哈哈 这些天,我不是很想复习专业课,想打游戏,但是吧,我想我说是个程序员...
Miscellany是当前版本 1.7.10 的 Minecraft mod 下载 -
leetcode上升的温度 勤学强记,温故知新 好记性不如烂笔头 数据库核心技术总结 JAVA 集合底层原理和源码解析 Java 并发 Docker Elasticsearch Java 查漏补缺 算法练习总结 动态规划 数据结构系统梳理 ...杂记
项目快速说明使用说明杂记1.项目简要说明该项目包括开发一个相当简单的棋盘游戏。 玩家掷骰子,在棋盘上向前移动,解决掉落的方块的影响,然后计算机要求他们猜测一个单词。 然后,游戏者将给出线索词,并且计算机...
Spring.NET杂记 9.1.简介 9.2.PathMatcher 9.2.1.通用规则 9.2.2.匹配文件名 9.2.3.匹配子目录 9.2.4.大小写需要考虑,斜线可以任意 第十章. 表达式求值 10.1.简介 10.2.表达式求值 10.3.语言参考 10.3.1.文字...
Not Safe For Wine ...[H00] 杂记 完整用户指南: 一世。 测试人员登录信息 我们要求所有用户在我们的网站上创建一个帐户。 出于我们的测试目的,在注册帐户时,请使用以下信息: 名字:John 姓:
杂记当前内容: Domino StateManager:一个包含StateManager实现的数据库,该实现将视图状态写入到随附的NSF而不是文件系统中frostillicus.wrapbootstrap.ace_1.3:用于 。 请注意,实际主题不包括在内-其js,css等...
技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 ...
编程新手真言的初版到最终的第五版,作者的编程感悟及编写这个文档的历程,了解面向底层开发的C及面向业务的面向对象的语言,及游戏开发实例