面向对象(基础)

内存模型

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.匿名内部类

适合那种只需要使用一次的类。比如,键盘监听器操作等等。

局部内部类:定义在方法里面,用的极少。


字符串(String)

Java字符串就是Unicode字符序列,例如字符串“Java”就是J,a,v,a四个Unicode字符组成。Java没有内置字符串类型,而是在标准的Java类库中提供了一个预定义的String类。


















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值