一、基本概念
类和对象:
1、类是对现实世界的物体的特征和行为抽象出来的一个概念。在计算机中可以理解定义一种数据类型。 比如牛、羊、这些概念名词是对具体的各种牛这个生物的抽象。而类也就与之相似,只是在类中要更加详细的抽象出这个生物的属性和行为。属性:可以理解成这个生物的共同特点,例如:牛就拥有品种、皮毛颜色、繁殖方式等特点。行为:这个生物的都能做到事情,例如:牛吃草、牛睡觉等等(在计算机世界中行为一般用方法来表示)。
2、对象是类这个概念的具体化,类的实体。通俗理解就是牛这个名字的实例就是一头头具体的牛,或是奶牛、水牛等等。
3、面向对象的特征:封装、继承、多态。
实现语法:
1、类:
Public class 类名{
权限privated/protected/public 数据类型 属性名1;
权限privated/protected/public 数据类型 属性名2;
、、、;
权限privated/protected/public 方法名();
2、对象
类名 对象名 = new 类名();
内存角度理解:
凡是new的数据都保存在堆区,那么对象也不例外。当执行到上诉生成对象的代码的时候(类名 对象名=new 类名())的时。首先,加载类的class文件进入方法区,随后栈区开辟一个“对象名”的空间,然后堆区开辟一个空间保存对象属性数据和方法地址,再将堆区开辟的空间的地址放在栈区的“对象名”中保存。总之可以将对象理解成一种保存再堆区的数据类型。
二、对象三大特性之封装
封装:简单来说就是隐藏一个对象行为具体的动作流程。实列:生成一个对象A,A拥有方法a,方法a可以接受一个数字,然后将这个数字处理后返回成一个字符串。开发时候往往用:String result=A.a(25);怎么将25变成一个·字符串的我们并不能知道,也不需要知道。我们只需要知道它需要什么,能够产生什么效果就欧克。
优点:1、提高代码的安全性。2、提高代码的复用性。3、提高可用性。
三、对象三大特性之继承
继承:高度抽象向具体化抽象的转变。例如:牛这个概念是一个高度抽象化的,它代表水牛、奶牛等各种牛的抽象。我们现在需要产生一个不那么高度抽象的概念-水牛。水牛一定拥有牛的全部的属性和方法,在开发中为了减少代码的冗余度,我们采用继承的概念。也就是水牛继承牛的全部可继承的属性和方法,然后添加水牛特有的属性和方法。
java继承的特点
单一继承:只有一个父类。
多层继承:父类可以继承自其他类。
成员变量:子类实际上继承父类的所有成员变量,但是,对于privated修饰的成员属性是不能直接调用或者使用的,在内存之中privated的属性是确实存在的。可以通过父类提供的相关可调用的方法进行间接访问。
成员方法:子类继承父类的虚方法表。虚方法表:由父类继承父类的父类的虚方法表,并且在其中添加父类特有的方法,以及如果父类发生重写会对其进行覆盖。总之:虚方法表是在父类添加其特有方法以及重写方法后的从最开始的父类到现在这个父类的所有方法的总和。
方法加入虚方法表条件:
1、非privated权限修饰。
2、非static静态方法。
3、非final修饰的方法。
不可继承的方法:构造方法。
java继承的语法
class 类名 extends 父类
内存角度:
当开始new一个有继承的子类对象时,首先,在方法区载入父类的class文件,然后子类class文件。随后在堆区开辟空间保存一个子类的属性以及继承自父类的属性,保存子类继承自父类的虚方法表的所有方法地址,子类特有的方法地址。同样栈区对象名保存堆区的开辟空间的地址。
四、对象三大特性之多态:
多态:简单来说,父类(接口)变量名可以接受并且保存子类(实现类)对象在堆区数据保存的地址。例如:
class 父类{}
class 子类 extends 父类{}
psvm{
父类 变量名=new 子类()
}
多态特点
编译看左,运行看右。
成员变量调用:成员变量调用看左边,也就是父类。只能调用父类的属性。
方法调用:看右边,也就是调用子类的方法。实际保存的地址指向的对象方法。
内存角度理解:
在执行到代码(父类 变量名=new 子类())堆区开辟空间。我们可以将开辟的空间分成三部分,一部分保存父类的成员变量,一部分保存子类的成员变量,一部分保存子类的方法地址。在通过多态访问成员变量时,因为变量类型是父类,编译时只能在保存父类成员变量的区域找。因此调用成员变量只能调用到父类的成员变量。
在调用方法时,编译先在父类的虚方法表里找,如果有才能通过编译。然后再实际运行的时候则是找子类的方法表的地址,然后加载子类的方法进入栈区。
多态的缺点:
不能调用子类的特有方法,只有通过向下转型的方式,转为子类才能够调用特有子类特有的方法。
五、静态相关知识总结
静态(static):它是一个特殊的修饰符。可以用来修饰变量,方法。
静态变量:静态变量可以理解为常量。常量:初始化后不可变的量。一次初始化后不可再改变。在类中被static修饰的属性可以称之为类属性或者全局属性。因为该类生成的所有对象都拥有该属性且属性值相同,改变时同步改变。
静态方法:静态方法在内存之中随着类加载到方法区同步加载。而这时堆区可能没有产生实际对象。因此这意味着:静态方法不能调用非静态的方法和非静态属性。
静态方法调用:通常使用类名.方法名。也可以使用对象名.方法名(不推荐)
六、其他相关知识总结
this:谁调用指向谁。
在方法加载到栈中执行时,开辟一个变量空间(this)保存当前方法调用者的堆区地址值。
final:修饰符。
1、final修饰的类不能在被继承。
2、final修饰的方法不能在被重写。
3、final修饰的变量初始化后不能再被赋值,近似静态变量。
4、final修饰的成员变量和static修饰的成员变量的异同:
同:都初始化化后不可修改。
异:final修饰的成员变量不会该类的所有对象共享。static修饰的成员变量该类的所有对象 共享
5、static final:修饰后该对象的所有类共享,且不可再被修改。