------------android培训、java培训、期待与您交流! ----------
面向对象(上)
面向对象和面向过程有什么区别:
面向过程设计思想:
分析出解决问题所需要的步骤,然后把这些步骤一步一步的实现
以算法为核心
自顶向下设计,要求一开始必须对问题有很深的了解
将大问题转化为若干个小问题来求解
用函数来作为划分程序的基本单位
优点:直接面向问题
易于掌握与理解,符合人们的思维习惯
缺点:对于需求明确,规模不大,变动较小的问题非常适合
数据与操作分离开,对数据与操作的修改变提很困难
数据的安全性得不到保证
对于 “需求不明确、变动较大、规模很大的问题” 显得力不从心
面向对象设计思想:
确定该问题由哪些事物组成,先用类模拟出该事物
通过类间接的解决问题
自下而上设计,从问题的一部份着手,一点一点地构建出整个程序
用类来作为划分程序的基本单位
对于需求不明确、变动较大、规模很大的问题非常适合
类:
什么是类:
把一类事物的静态属性和动态可以执行的操作组合在一起所得的这个概念就是类
类是抽象的,用来模拟一类事物
为什么需要类:
因为单个的数据类型无法满足我们的要求,我们想要把数据和它的操作结合在一起,
这们大大的提高了数据的安全性和可操作性。
对象:
而用类创造出的实体是就对象,具体的存在的事物。
内存分配:
举例:
在java中如果一个引用变量指向了某块堆内存,那么我们就可以认为这个引用变量表示的就是该变量指向 的那块内存
class A { int i; int j; } class TestMemo { public static void main(String[] args) { A aa = new A(); //相当于C语言的 (A *)malloc(sizeof(A)); // new A(); 在堆中动态分配一块区域,被当做了A对象 // aa本身的内存是在栈中分配的 // 堆中内存的地址付给了aa // aa指向堆中的内存,aa代表了堆中的内存 // aa.i 代表: aa这个静态指针变量所指向的动态内存中的A对象的i这个成员 // aa.j 代表: aa这个静态指针变量所指向的动态内存中的A对象的j这个成员 aa.i = 10; aa.j = 20; System.out.printf("%d, %d\n", aa.i, aa.j); //int i = 10; } }
访问控制符:
什么是访问控制符:
向一类事物添加特定的访问权限
为什么需要访问控制符:
有些时候,我们不希望不明确的外部操作来访问类内部特有的操作或属性,这时就需要用到访问控制符
我们每个人的都自己隐私,比如 “日记” 你可不希望向每个人都公开
类的访问控制符有四种:
public:
公开的、可以通过外部访问的方式访问类内部的public成员
private:
私有的、不可以通过外部访问的方式访问类内部的private成员
protect:
同包可见+不同包的子类可见
default :
表示默认,不仅本类访问,而且是同包可见。
说明:
在一个类的内部,所有的成员可以相互访问,访问控制符是透明的。
构造函数:
什么是构造函数:
一种特殊的函数,它的工作只是简单完成类中成员的初始化工作
为什么需要构造函数:
在创建对象时,我们常常需要对对象的属性初始化,而构造函数就是帮我们完成这些初始化的工作
声明一个对象,系统首先会为该对象分配内存,然后立即调用该对象的构造函数
特点:
构造函数名与类名是相同的
不能有返回值
可以有参数,也可以没有参数
可以有多个构造函数
说明:
在java每个类里至少有一个构造方法,如果程序员没有在类里定义构造方法,系统会自动为这个类产生一个默认的构造方法,如果程序员为类定义了构造方法,系统就不再提供默认的构造方法了。
任何一个类被生成时都会调用该类的构造函数
无论一个类有多少个构造函数,生成是只会调用其中的某一个构造函数
关键字this:
什么是this:
表示当前对对象的引用
this是一个系统隐含的指针被自动附加在非静态的成员函数的参数列表中
为什么需要this:
比如在一个方法中,调用其他对象变量或方法时,可以使用对象的对象名,而调用自己所在对象的方法或变量时,不知道别人给起了什么名字,所以就可以使用this
说明:
当前时刻,哪个对象调用该函数,那么this就指向当前调用该函数的对象,系统会自动在该函数的参数列表中添加一个隐藏的this指针,并且把调用该函数的对象的地址赋给this指针,
关键字this代表当前正在调用该方法的那个对象,具体可分为两种情况
在普通方法中,关键字this代表方法的调用者
在构造方法中,关键字this代表了该方法要次运行所创建的那个新对象
关键字static:
什么是static
static 是java中很常用的修饰符,它被用来控制变量的存储方式和可见性
为什么需要static:
有时候我们希望一个事物只能有一个对象,这时个就需要用static修饰
说明:
在静态方法里只能直接调用同类中的其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员,这是因为对于非静态的方法的变量,需要先创建类的实例对象后才能用,而静态方法在使用前不用创建任何对象。
静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
静态方法只能访问类的静态成员,但是非静态方法却可以访问类中的所有成员。(包括静态成员)
数组:
什么是数组:
为n个相同同类型的变量连续分配字节数相同的存储空间
数组元素可以是基本类型也可以是引用类型
创建和使用数组的方法:
第一种:
int[] arr1; //等价int arr1[] 栈分配arr1
arr1 = new int[3];//堆分配的存放3个连续整数的数组,初始为0,arr1指向这个数组
arr1[0] = 0;//分别分配内容
arr1[1] = 1;
arr2[2] = 2;
第二种(常用):
int[] arr1 = new int[]{0, 1, 2};
第三种:
int[] arr1 = {0, 1, 2};
引用类型数组:
引用类型元素组成的一维数组在使用过程中存在着两级指向关系
定义一个类MyDate,构造函数MyDate(int d, int m, int y)
MyDate[] m;
m = new MyDate[10];//堆区,数组内放的是10个连续的指向 //MyDate对象的引用,初始为null,m指向数组
for(int i = 0; i<10; i++)
{
m[i] = new MyDate(i+1,i+1,1990);//堆区分配一个MyDate对象,m[i]指向该对象
}
多维数组:
int[][] xx = new int[2][3]//等长数组
int[][] xx = {{3,2,7},{1,5},{6}}//不等长数组,和引用类型数组类似
数组的拷贝:
System类中的arraycopy函数
public static void arraycopy(Object arr1, int pos1, Object arr2, int pos2, int length)
数组的排序:
java.unti.Arrays类中的sort方法(此类不是java.lang下的类所以要导入import java.unil.*;)
例:int[] a={3,2,1};
Arrays.sort(a);//由小到大排序
for(int i = 0; i<a.length; i++)
{
System.out.println(a[i]);
}