java基础
java语言的优点
“平台无关性”:java语言可以一次编译到处运行,意思就是编译后的代码可以再多种平台上运行,由于java是解释型语言,编译器会把java代码编程为中间代码,然后在java虚拟机中运行,因此java可以跨平台
行,具有良好的可移植性
我的理解是:编辑器将java代码编译成适合于不同平台的中间代码
对public static void main(String[] args)理解?
public: 对任何类和对象都可以访问这个方法。
static : 表明main方法是一个静态方法,方法中的代码是存储在静态存储区的
只要类被加载后,说明代码就加载到了静态区域,就可以直接通过类名.main()直接访问, JVM启动后就可以按照上述方法的签名来找到方法的入口地址,找到就执行,找不到就报错。
java程序是怎样运行的?
java初始化:
(1)静态变量 先于 非静态变量 ,静态对象只初始化一次,非晶态的会初始化很多次
父类 先于 子类
变量 先于 代码块
==> 父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态代码块,父类构造函数、子类非晶态变量、子类非晶态代码块、子类构造函数
java创建对象
- new 创建
new 操作符的本意就是创建一个对象,首先看new后面的数值类型,知道了类型,然后才知道要分配多大的内存空间,分配完内存之后,再调用构造函数,填充这个对象的各个域(初始化),一个对象创建完毕后,把它的引用发布到外部去,在外部就可以通过引用来操纵这个对象。
new 创建的对象本体都在堆区,堆区主要放对象
栈区放引用 - clone
分配内存都一样,但是内存的大小是根据调用clone方法的对象的大小相同,然后再使用原对象对应的各个域,填充新对象,引用发布出去
浅clone: 如果对象中有些域也是引用,那么clone的只是引用
深clone: 因为有个super.clone(), 会引发引用指向的值都clone需要实现Cloneable接口,实现clone方法,并且在这个方法内部,把该对象引用的其他对象也clone因为有个super.clone(), 会引发引用指向的值都clone
什么是反射机制
反射机制就是在程序运行时能够获取自身的信息,
反射机制的作用
(1) 反编译: .class –> .java
(2) 通过反射机制来访问java对象的属性、方法、构造方法等。
反射机制的类:
java.lang.Class
java.lang.reflect.Constructor
java.lang.reflect.Field
java.lang.reflect.Modifier
一般步骤:先获取到类
Class c = Class.forName(“xxx”)
然后在获取这个类中的信息
java泛型
独特之处:java泛型只在程序源码中存在,在编译后的字节码文件中,都已经被替换为原来的原始类型(就是指被擦除了类型的泛型),并在相应的位置插入了强行转型代码。
用反射机制理解:在程序中定义了一个ArrayList泛型类型实例化为Integer的对象,如果直接调用add方法,那么只能存储整形的数据。不过当我们利用反射调用add方法的时候,却可以存储字符串。
Array不支持泛型,一般用List来代替Array
多态实现问题?
编译时多态
运行时多态
动态绑定&&静态绑定
用private, static,final修饰变量或者方法时,采用的是静态绑定
重载的方法是使用静态绑定完成,而重写的方法使用的是动态绑定
有利于java的效率
抽象类与接口类
(1) 抽象类和接口都不能实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
(2) 抽象类可以有普通成员变量,构造方法,静态方法,非抽象类的普通方法,接口中没有,而且只有抽象方法
(3) 都可以含有静态变量,接口类的变量只能是public static fianl
抽象类的静态成员变量访问类型可以是非public
(4)可以实现多个接口,但只能继承一个抽象类。
(5) 抽象类对类抽象,接口是对行为抽象
final 理解
(1) final 为用于标识变量的关键字,final标识的存储在常量池里
(2) final不能被子类的方法覆盖,但可以被继承。
(3) final 成员变量表示常量,赋值后不再改变
(4) final类不能被继承,防止任何继承类修改它的意义和实现
static理解
static表示全局,修饰成员变量和成员方法,