基础Java学习——类与对象

发布于:2023-01-04 ⋅ 阅读:(579) ⋅ 点赞:(0)

目录

1,编译语言的发展

1.1,面向机器语言

1.2,面向过程语言

1.3,面向对象语言

2, 类

1.1 类体

1.2 成员变量

1.3 方法

1.4 局部变量

1.5 需要注意的问题

1.6 类的UML类图

3  构造方法和对象创建

1.1 构造方法

1.2 创建对象

 1.3 使用对象

1.4 组合与复用

4 实例成员与类成员

1.1实例变量与类变量区别

1.2 实例变量和类变量的区别

1.3 实例方法和类方法

5 方法的重载

6 this关键字

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 调用所包含对象的方法。而对算法是什么一无所知。这就是黑盒。
 */

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到