目录
1,编译语言的发展
1.1,面向机器语言
计算机设计之初,人们需要事先根据线路确定指令逻辑操作。计算机最初用的信息语言就叫机器语言,使用机器语言时需要面向计算机编程,用计算机语言来实现程序设计是一件非常复杂庞大的工程,同样的程序,针对线路设计的不同,不同的机器,需要重新设计。
1.2,面向过程语言
硬件的发展,C语言出现了,这些语言又被叫做面向过程语言。语言把代码组成过程叫做过程或者函数的块。每个块的目标是完成某个任务,而不用去考虑机器语言的细节,只需要按照具体要求去编写即可。
1.3,面向对象语言
随着面向过程的完善,人们想要写出方便维护,扩展,复用的代码。而C语言很难做到。C语言只能定义动作,而不能定义谁做这个动作。由此产生了一个核心的概念“对象”,一切围绕着对象。
一个简单的理解就是,想要完成某任务时,首先要想到,谁去完成,就是那个对象来完成,提到数据,就去想数据时那个对象的。
面向对象编程主要体现下列几个特点:
封装性:面向对象的核心之一,就是将数据和对数据的操作封装起来。通过抽象,将具体实例的共同特点抽象出来形成一般特点。例如英雄联盟的刺客,射手,会涉及到伤害值,技能数,基础成长数值等属性,还有行走,奔跑,嘲笑等行为,在游戏中我们将这些共有的属性抽取出来,给他一个概念:英雄类。这是当我们创建一个新英雄时,例如:艾希。这是艾希就是英雄类的实例。
继承性:代码的发展,就是一个重复使用的过程。于是为了不在重复造车,这里面向对象语言提出了继承的理念。例如这里的:人类是码农的父类。这时码农和人类是IS-A的关系。
在人类共有属性上,码农加以继承人类的属性,然后还可以添加自己特有的属性;比如摸鱼,加班。
多态性:多态性是一个有趣的面向对象的特征,他大致分为两种:一种是操作名称的多态,就是指可以向同名的操作,传递不同的信息,以达到让对象根据信息产生不同的结果。
例如:
我向程序员传递了涨薪,程序员发出不属于人类的笑声。
我向程序员传递了加班,程序员返回了一个砖头。
另一种是基于继承的多态,就是不同的子类声明的对象对某一个同名的继承方法,会产生不同的消息。例如:父类声明了一个可继承的方法:动物叫声
龙继承动物发出了芜湖。。。
鸡继承了动物发出了全民制作人大家好。。。
因此,类把数据和对数据的操作封装成了一个整体。
2, 类
类是一个java程序的基石,类是Java程序的“数据类型”,类包括类声明和类体。
基本格式为:
class A{
类体}
class是类名的关键字,不再赘述。类名声明的规则就是浅显易懂,一般遵从驼峰习惯,声明类必须要用英文单词来识别一个类。这样对于代码的可读可分享性来说,是一个莫大的帮助。
1.1 类体
类的目的就是抽象出一类事物的共有属性。也就是说类是用于创建可见实物的模板。这就是抽象的概念,见其形而知其意。抽象出来类要抓住事物的两个部分:属性和行为。就是肉体和灵魂。就是数据和对数据的操作。
·变量的声明:用来存储属性的值;
·方法的定义:给出对于变量的操作,即给出算法。
简单的例子:
class people{
int age;
int weight;
int getWeight( int w){
this.weight=w;
}
}
1.2 成员变量
类的内容分为两个部分:变量的声明,方法的定义。
声明变量这一部分所声明的变量就是成员变量。
1,成员变量的类型可以是java中的任一一种数据类型,常用的有基本类型,引用类型,数组。
2,成员变量的有效范围是在整个类中都有效。其有效性与位置无关。
1.3 方法
方法的定义包括:方法头和方法体
方法头:由返回的数值类型和方法名组成,无参方法方法头没有参数列表。
例子:
int sum(){}
int sum(int a,int b){}
需要返回数据,方法类型可以是任意数据类型。方法为void类型时,不需要返回值。
方法体:就是对于局部变量还有成员变量的操作。
1.4 局部变量
在方法中使用的变量,还有方法的参数都叫做局部变量。而且有效性和声明的位置有关,例如在一个循环语句中声明,那么他的有效范围就只在这个循环中。
需要注意的是,当局部变量和成员变量重名时,方法中使用的变量将会被局部变量覆盖。
局部变量没有默认值,在使用时需要先赋初值。
1.5 需要注意的问题
类体主要由两部分组成:变量的声明,方法的定义
对于成员变量的操作只能放在方法中,而且可以在声明变量的时候赋予初值。
如下:
class test{
int number1=11;
float number2=12.11f;
}
这是被允许的;但是不允许这样:
class test1{
int number;
double number1;
number=1;
number1=12.1;//这是不允许的,因为默认要求对于成员变量的操作要在方法中。
}
1.6 类的UML类图
UML类图实在面向对象发展过程中衍生出来的描述类的工具。
可以清晰明了的了解类的具体内容;例如:
第一层:一般是类名,正常字体代表他是具体类,如果是斜体则代表他是抽象类、
第二层:变量层,也叫属性层。给出的是类中主要的属性。格式是“属性名:属性类型”
第三层:方法层,也叫操作层。给出主要方法,格式是:“方法名:方法类型”
3 构造方法和对象创建
类是一种数据类型,静态类就是一种数据类型。
就是和int double 相类似的不过是一种特殊的数据类型。
类可以用来声明变量:
Class class;
int number;
这样看类确实是一种特殊的数据类型,用来声明变量的数据类型。用类声明的变量叫做对象,和基本数据类型不同,类声明对象后,还必须分配变量(对象所要被赋予的属性)。当使用一个类创建了对象时,也就是给出了一个类的实例。
类就是模板,没有类就没有对象。而构造方法和对象的创建息息相关。
1.1 构造方法
构造方法的作用就是初始化对象,给对象赋初值。构造方法是一种特殊的方法,在类中构造方法的名字必须与类名相同,而求不能声明构造方法的数值类型。允许构造器声明多个,这里也叫构造方法的重载。目的是给不同要求的对象赋初值。构造器的参数类型,个数均可不同。
而且当没有手动创建构造方法时,系统会默认改一个无参构造函数,以防报错。
多个构造方法的例子:
class Test1{
Test1(){}//无参构造
Test1(int a,int b ){//有参构造
}
}
1.2 创建对象
创建对象分为两部分:
对象的声明,为对象分配变量,例子:
1,Class class;
2,new Class();
new 运算符和类的构造器在这里为声明的对象分配变量,即创建对象。
class A{
int a;
double b;
A(){}
}
mian{
A a;//声明一个对象;
a=new A();//为对象分配变量,这里用的是无参构造
}
对象的内存分配:
ZL zl;
声明对象zl时内存没有任何数据,这是zl还是一个空对象。空对象是无法使用的。
new ZL();
分配变量语句大体分配两个步骤:
1,给类的成员变量分配内存:
例如:int a; double b;String name;
值得一提的是,基本数据类型在未初始化的情况下:默认是0.0
引用类型数据默认是:null
2, 分配完变量内存之后,计算出一个叫做引用的值。(引用代表着成员变量内存的位置和相关信息),就是把这些赋值给zl。这时所有的属性都归对象zl管辖使用了。
1.3 使用对象
抽象的目的是产生类,类的目的是创建具有行为和属性的对象。
对象使用 “ . ”运算符实现变量和调用方法。格式为:
对象.变量;
对象.方法;
一个类声明的两个对象如果有相同的引用。二者就有完全相同的变量,当用一个类创建了两个对象时,这两个对象的引用是不一样的。
垃圾回收机制;
当某个实体已经不再被某个对象拥有,就会释放内存。
若p1=p2;
p2的引用赋值给了p1;这时p1原来的实体就不被拥有了,这时就会回收原来p1占用的内存。
1.4 组合与复用
若一个对象组合了另一个对象;,则A可以委托B调用B的方法,就是组合实现代码复用。
通过对象实现复用用几个特点:
1,因为是组合对象来实现的复用,也称“黑盒复用”,这种对象只能委托所包含的对象调用其方法,这样当前对象对于所包含的对象细节一无所知。
2,随时可以更换所包含的对象,二者是弱耦合。
4 实例成员与类成员
1.1实例变量与类变量区别
成员变量细分为实例变量,类变量。
类变量又叫静态变量,用static修饰,例子:static int b;
1.2 实例变量和类变量的区别
1,不同的对象由于引用不同,所以实例变量也不同。
2,所有类共享类变量,分配类变量时,类变量占用同一块内存位置,所以对象共享类变量。
3,通过类名直接调用类变量。
static开头,默认在类被加载到程序之前就被加载到内存中,分配了内存空间。
而实例变量要在类创建对象之后才会有内存。每创建一个对象都会有不同的实例变量,而类变量一旦声明,就会被内存公开到类之前。
1.3 实例方法和类方法
int getnum(){}
static int getnum(){};
与变量相似,方法,类方法也是在类被加载到内存之前就被加载,分配内存接口。而实例方法要到字节码文件被加载到内存之后,才能调用实例方法。
同样我们可以使用类名调用类方法,例如一些常用类:String ,math等里面封装了一些static方法,直接用类名就能调用。
5 方法的重载
方法的重载是针对传入参数的:
重载的是传入的参数:英文叫做Overload重新加载
两个方法的参数不同是指:
参数的个数不同;
参数的个数相同,但是数据类型不同;
float getnum(int a,int b);
float getnum(float a,float b);
注意传值时要按照参数类型来写,否则将会引发歧义。
6 this关键字
this 的意思就是使用当前方法,属性的对象。
如果this用在构造方法中,就代表用该构造方法创建的对象。
注意this可以在实例方法中使用,不能在类方法中使用,因为类方法在对象声明之前就已经被加载到内存中了。
所以根本用不到this来指定当前对象。
小例子:关于pc cpu harddisk test的个人测试:这里不给出题目了。
public class PC {
Cpu cpu;
HardDisk hd;
void setCpu(Cpu cpu){
this.cpu=cpu;
}
void setHd(HardDisk hd){
this.hd=hd;
}
void show(){
System.out.println(cpu.getSpeed());
System.out.println(hd.getAmount());
}
}
public class Cpu {
private int speed;
public void setSpeed(int a){
this.speed=a;
}
public int getSpeed(){
return speed;
}
}
public class HardDisk {
private int amount;
public void setAmount(int amount) {
this.amount = amount;
}
public int getAmount() {
return amount;
}
}
public class test {
public static void main(String[] args) {
Cpu cpu=new Cpu();
cpu.setSpeed(2200);
HardDisk hd=new HardDisk();
hd.setAmount(200);
PC pc=new PC();
pc.setCpu(cpu);
pc.setHd(hd);
pc.show();
}
}
/*
这一题用到了对象的组合
也就是黑盒复用。
当前的对象。例如上面的,他所包含的对象随时可以更换。两者属于弱耦合关系。
pc.setCpu(cpu);
pc.setHd(hd);
当前对象pc只能通过它包含的对象cpu.hd 调用所包含对象的方法。而对算法是什么一无所知。这就是黑盒。
*/