内存模型
Java虚拟机的内存可以分为三个区域:栈Stack、堆Heap、方法区Method area(实际上方法区也在堆里面)。
栈的特点:
1.栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(储存局部变量、操作数、方法出口等)。
2JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量等)。
3.栈属于线程私有,不能实现线程共享。
4.栈的储存特点是“先进后出,后进先出”。
5.栈是由系统自动分配,速度快。栈是一个连续的内存空间。
堆的特点:
1.堆用于储存创建好的对象和数组(数组也是对象)。
2.JVM只有一个堆,被所有线程所共享。
3.堆是一个不连续的内存空间,分配灵活 ,速度慢。
方法区(又叫静态区)
1.JVM只有一个方法区,被所有线程所共享。
2.方法区实际也是堆,只是用于储存类,常量相关信息。
3.用来存放程序中永远不变或唯一的内容。(类信息《Class对象》,静态变量,字符串常量等)。
构造器
用于对象初始化。特点有四:
1.通过new关键字调用。
2.构造器虽有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能再构造器里使用return返回某个值。
3.如果没定义构造器,则系统默认添加一个无参构造器,如果自己定义了一个,系统则不会添加。
4.构造方法名和类名一致。
构造器第一句总是:super();来调用父类对应的构造方法。流程是:向上追溯到Object,然后再依次乡下执行类的初始化块和构造方法,直到当前子类为止。先要把父类对象构造好以后,再构造子类对象。
也就是说在调用一个类的构造方法来构造一个对象的时候,一定会先调用父类的构造方法,建一个父类对象,如下如。
Static
Static修饰的成员变量和方法,从属于类,普通的变量和方法从属于对象。所以在静态的方法中无法调用非静态变量和方法。
Object类的toString和equals方法的重写。
对象转型
1.一个基类的引用变量可以指向其子类对象。Animal a = new Dog();
2.一个基类的引用不可以访问其子类对象新增加的属性和方法。
3.可以使用引用变量instanceOf(类名)来判断该引用型变量所指向的对象是否属于该类,或者该类的子类。
4.子类对象可以当做基类对象来使用成为向上转型(upCasting),反之成为向下转型(downCasting)。
多态
多态是指同一个方法的调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。
原理是动态绑定。
动态绑定是指“在执行期间”(而非编译期间)判断所引用对象的实际类型。根据其实际类型调用其相应的方法。
1.多态是方法的多态,不是属性的多态(多态与属性无关)。
2.多态的存在有三个必要条件:继承,方法的重写,父类引用指向子类对象。
3.父类引用指向子类对象后,该父类引用调用子类重写的方法,此时多态就出现了。
Final
final修饰变量时:被修饰的变量值不可再改变。
final修饰方法时:被修饰的方法不可再重写。
final修饰类时:被修饰的类不可被继承。
数组
数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后顺序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引来访问他们。数组就是一个对象,每一个元素就是该对象的成员变量。
特点:
1.长度确定。数组一旦被创建,它的大小是不可变的。
2.元素类型必须相同,不允许混合类型出现。
3.数组类型可以是任意数据类型,包括基本类型和引用类型。
抽象类
抽象类是一种模板模式。抽象类为所有的子类提供了一个通用的模板,子类可以在这个模板的基础上进行扩展。
通过抽象类,可以避免子类设计的随意性。
特点:
1.有抽象方法的类只能定义为抽象类。
2.抽象类不能实例化,即不能用new来实例化抽象类。
3.抽象类包含属性、普通方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
4.抽象类只能用来被继承。
5.抽象方法必须被子类所实现。
接口
接口就是必抽象类还抽象的抽象类,可以更加规范对子类的约束。全面而有专业地实现了:规范和实现的分离。
接口就是规范,定义一组规则。本质是契约,像人类的法律一样,制定好以后大家都遵守。
项目的具体需求是多变的,需以不变应万变进行开发,此处不变的就是‘规范’。因此开发项目往往都是面向切口的编程。
接口中只有常量和抽象方法。接口中的常量默认是public static final,方法默认是public abstract的。
接口不能创建实例,但是可以用于声明变量引用的类型。支持多继承。
内部类(inner Class)
把一个类定义在另外一个类里面。
作用:
1.内部类提供了更好的封装,只能让外部类访问,不能让其他类访问。
2.内部类可以访问外部类的私有属性,内部类被当做是外部类的成员,但是外部类不能直接访问内部类属性。
使用场合:
由于内部类提供了更好的封装特性,并且可以很方便访问外部类的属性。所以,通常内部类在只为所在外部类提供服务的情况下使用。
分类:
1.成员内部类(可以使用private,protected,public任意修饰)。
a.非静态内部类:非静态内部类必须寄存在一个外部类的一个对象里面。因此,如果有一个非静态内部类对象,那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
b.非静态内部类可以使用外部类的成员,但是外部类不能直接访问非静态成员。
c.非静态内部类不能有静态方法,静态属性,静态初始化块。
2.静态内部类
a.定义方式 static class ClassName{}
2.匿名内部类
适合那种只需要使用一次的类。比如,键盘监听器操作等等。
局部内部类:定义在方法里面,用的极少。