day04
★01
数组定义的两个格式。
数组在操作时容易出现的问题:
ArrayIndexOutOfBoundsException
数组角标越界异常。操作数组时,访问到了数组中不存在的角标。
arr=null;
NullPointerException
空指针异常。指针已经不指向任何实体了,但还要拿着这个指针进行实体操作,这是不允许的。
20120217 am
★02数组(遍历)
♂EditPlus 问题:
键入回车键,现有代码不换行,只是鼠标下移;重启EditPlus 软件后,回复正常。
&遍历,通常要用到for循环。
System.out.println(arr);
打印的是数组实体的内存存放地址。输出数组的地址没什么意义。
1.arr.length 如何获取数组长度
2.用了一个小功能,对数组进行了基本的操作。
★03 数组,获取最值
♂max作为角标来比较时,最后打印的max怎么回事,max不是角标吗,怎么突然变成了数组元素?
视频时间:13:45
解答:int max=getMax_2(arr); 在主函数中这一语句,已经将返回的最大值赋给了max,所以这时的max已经不是角标号了。而是return后的数组最大值。
&boolean型数组,默认值是false
★04
数组排序:选择排序。
定义一个数组,并打印出来,需要一段固定结构的代码,可以将此定义为一个函数。
★05 冒泡排序
:相邻的两个元素进行比较,如果符合条件换位。
&冒泡排序第一圈:最值出现;
&在堆内存中频繁换位置的操作,转移到栈内存中。
1,明白排序的算法,
2,应付面试。
&运行错误,Arrays.sort 未达到想要的运行结果。视频时间17:10
★06
无论什么排序,都需要对满足条件的元素进行位置的置换。
所以可以把这部分相同的代码单独提取出来,单独封装成一个函数。
swap
★07
数组的查找操作,折半查找。详见编译练习文件。
★08
十进制——二进制
打印结果,用void型;
★09
十进制——十六进制
★10
查表法来获取内容
字符数组在内存中一被定义,它的初始化值:
空位:"\u0000" java 中的Unicode编码。
★11 十进制——二进制
两种方法:
1)同1进行与运算,然后存储,继续右移1位的方式。
2)手动相同的算法机制,莫于2,取余存储。
&右移方法转换进制:
定义数组列表,定义指针,进行循环、临时存储,右移、从低位向高位打印。
由以上规律,见下一个:
★12 进制转换优化
★13数组
把数组作为元素存到数组中去,这样包含数组的数组,称之为二维数组。
&求二维数组中所有元素的和。
★14 二维数组的定义方法。
day05
★01 面向过程、面向对象;
★02 面向对象举例;
需求分析,开发,测试。分两部分来说
面向对象的特点,首先它是一种思想,它能让复杂问题简单化,从执行者转变成指挥者。
举例说明,结合实际场景来说。
&对象具备特定的功能,对象不是单单指人。
java:一切皆对象,万物皆对象。所想到的概念都可以是一个对象。
对象在程序中的体现:在解决问题的时候,先找对象。java中是否已经提供了相对应的对象。
有对象拿过来用,没有对象自己造一个对象。
★03
功能定在哪个事物中最合适,需要考虑。
面向对象的三个特征:封装、继承、多态。
以后的开发其实就是在找对象使用;没有对象就创建一个对象。
找对象,创建对象,使用对象并维护对象之间的关系。
&对象,多个功能的封装。
&类和对象的关系。类就是对现实生活中事物的描述,对象就是这类事物实实在在存在的个体。
现实生活中的对象:张三、李四。
描述:提取对象中的共性内容,对具体的抽象。
描述时,这些对象的共性有:姓名,年龄,性别,学习java的功能。
&在java中,描述是用类的形式来体现的;而对象,通过new操作符,所产生一个实体,这个实体在堆内存当中。
&描述事物就是在描述事物的属性和行为。
&映射到java中,描述就是class定义的类。
具体对象就是对应java在堆内存中用new建立的实体。
&类类型的变量指向对象
&多个引用指向同一个对象。
★04
一个程序会有很多类组成,只要一个入口就行;
★05
知识点:匿名对象。
匿名对象调用的属性没有意义。调用方法有意义。
使用方式一:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。
如果对一个对象进行多个成员调用,必须给这个对象取一个名字。
凡是简化的,都是有局限的,三元运算符,if else的简化,三元运算符必须要有运算结果。
使用方式二:可以将匿象作为实际参数进行传递。
需求:汽车修配厂。对汽车进行改装,将来的车都改成黑色,3个轮胎。
匿名对象可以作为实际参数进行传递。
堆中产生一个对象。
栈里面开辟一个show的空间。
★06 07 封装:
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
封装原则:
将不需要对外提供的内容都隐藏起来。
把属性都隐藏,提供公共方法对其访问。
函数,就是java代码中最简单的封装体。类也是封装体。包的概念。
private 封装后提供一种访问的方式。
对于变量的操作方式:设置值或获取值
成员变量有默认值。
&对于成员变量,方法,函数,入口等的设置只是有了一个初步的印象,person
speak age的例子,还不能顺利地用java语言写出来。
定义函数,变量,调用方法,必须弄清楚类,对象,方法、过程之间的关系,并一一对应到这一实例中去。
★08
想使用该类,则创建该类相应的对象;
对象建立则调用与之对应的构造函数。
构造函数的作用:可以用于给对象进行初始化。
当我们在堆内存中产生对象的时候,它需要一个初始化动作。
一出现就具备了基本的特性。
构造函数的小细节:当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。构造函数同其他函数一样,同样可以重载。
方法被对象调用。
★09 构造代码块
构造代码块定义的是不同对象的共性内容。
★10 this关键字
看上去,是用于区分局部变量和成员变量同名的情况;
this到底代表的是什么呢?
this代表本类的对象,代表它所在函数所属对象的引用。
简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
★11 this关键字的应用
比较是不是同龄人:
结果是boolean型;
★12 this关键字在函数之间的调用。
构造函数间调用需要this语句。this函数只能定义在构造函数的第一行。
day06
★01 static
静态:static
用法:是一个修饰符,用于修饰成员(成员变量,成员函数)。
&每个人都可以访问country,但是内存中只存在一份。这样节约内存空间。
静态修饰内容被对象所共享。
当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员
方法区、数据区、共享区。
对象的特有数据和共有数据。
static特点:
1、随着类的加载而加载。
也就是说:静态会随着类的消失而消失。说明它的生命周期最长。
2、优先于对象的存在
明确一点就是:静态是先存在的,对象是后存在的。
3、被所有对象所共享
4、可以直接被类名所调用。
实例变量和类变量的区别:
1、存放位置。
类变量随着类的加载而存在于方法区中。随着类的消失而消失。
实例变量随着对象的建立而存在于堆内存中。
2、生命周期:
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
&静态使用注意事项:
1、静态方法只能访问静态成员。
非静态方法可以访问静态成员。也可以访问非静态。
2、静态方法中不可以定义this,super关键字。
因为静态优先于对象存在。所以静态方法中不可以出现this。
3、主函数是静态的。
静态有利有弊
利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每个对象中都存储一份。可以直接被类名调用。
弊端:生命周期过长。
访问出现局限性。(静态虽好,只能访问静态)
★02
arguments 参数
主函数。
★03
★04 静态的应用(工具类)
通常工具里面定义的都是静态方法。
★05 面向对象(帮助文档的制作)
开始制作程序的说明书。java的说明书通过文档注释来完成。
类的说明书。
★06
静态代码块给类初始化
构造代码块给对象初始化的
构造函数给对应对象初始化
★07
这句都做了什么事情?
1,因为new用到Person.class。所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中,建立对象的特有属性,并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址赋给栈内存中的p变量。
★08 对象调用成员过程。
赋值的变换,有点晕。
非静态时前面省略this点;静态时前面省略Person点。
★09 单例设计模式
方法要想被调用,要么对象,要么类名。
对象肯定在堆里面。
这样就保证了一个类在内存中对象的唯一性。
★10 单例设计模式2
1,建立一个私有并静态的本类对象。
2,建立一个构造方法
3,共有并静态的返回方法。
开发一般用饿汉式,懒汉式容易出现问题:
CPU在某一时刻只处理一个程序。
多任务同时运行,真正是双核以上的情况。
记录原则:定义单例,建议使用饿汉式。