Java面向对象(上)

Java面向对象(上)

一、面向对象的思想

1、面向过程:

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤逐一实现,使用的时候依次调用就可以了。

2、面向对象:

面向对象就是把构成问题的事物按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。

3、面向对象的特点:

(1)封装性:封装性是面向对象的核心思想,有两层含义,一层含义是指吧对象的属性和行为看成是一个密不可分的整体,将这两者“封装”在一起(即封装在对象中);另一层含义是指“信息隐藏”,将不想让外界知道的信息隐藏起来。

(2)继承性:继承性主要描述的是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行拓展。

(3)多态性:多态性是指在一个类中定义的属性和方法被其他类继承后,他们可以具有 不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义。

 二、类与对象

在java中,类与对象是最基本、最重要的单元。类表示某类群体的一些抽象基本特征,对象表示一个个具体的事物。

例如:学生可以是个类,而具体的一名学生,就可以称为对象。这名具体的学生会有自己的姓名和年龄等信息,这些信息在面向对象的概念中称为属性;学生可以看书和打篮球,而看书和打篮球这些行为在类中就称为方法。

1、类的定义

类是java中一个重要的引用数据类型,所有的java程序都是基于类的。

类是对象的抽象,用于描述一组对象的共同特征和行为。类中可以定义成员变量和成员方法,其中,成员变量用于描述对象的特征,成员变量也被称为对象的属性;成员方法用于描述对象的行为,可简称为方法。

类的定义格式如下:

class 类名{
    成员变量;
    成员方法;    
}

1.2、局部变量与成员变量的不同

在java中,定义在类中的变量为成员变量,定义在方法中的变量称为局部变量。如果在某一个方法中定义的局部变量与成员变量同名,这种情况是允许的,此时,在方法中通过变量名访问到的是局部变量而非成员变量。

2、对象的创建与使用

在java程序的类中,想要使用一个类则必须要有对象。在java程序中可以使用“new 关键字”创建对象,具体格式如下:

类名 对象名称 = null;
对象名称 = new 类名 ();

具体实现的图示如下:

从上图可以看出,对象名称uu(也就是Student类型变量uu)保存在栈内存中,而对象的属性信息则保存在对应的堆内存中

(即0x0001是地址值,不存储在栈内存中,它指向堆内存中0x0001的地址) 

当我们创建完对象后(即Student uu = new Student;)可以使用对象访问类中的某个属性或方法,对象属性和方法的访问通过“.”运算符实现,具体格式如下:

对象名称.属性名
对象名称.方法名

下面我举一个例子进行介绍:

package com.sdbi.hang;

class Student {
    String name;//声明姓名的属性

    void read() {
        System.out.println("大家好,我是" + name);
    }
}

public class example {
    public static void main(String[] args) {
        Student uu1 = new Student();//创建第一个Student对象
        Student uu2 = new Student();//创建第一个Student对象
        uu1.name = "小明";//为uu1对象的name属性赋值
        uu1.read();//调用对象的方法
        uu2.name = "小花";//与上文一样
        uu2.read();
    }
}

运行结果如图:

从上图可以看出,程序分别实例化了两个Student对象uu1和uu2,分别指向其各自的堆内存空间(内存地址)

3、对象的引用传递

类属于引用数据类型,引用数据类型就是指内存空间可以同时被多个栈内存引用。下面我用一个例子来说明对象的引用传递。

package com.sdbi.hang;

class Student {
    String name;//声明姓名的属性
    int age;//声明年龄属性

    void read() {
        System.out.println("大家好,我是" + name + "年龄" + age);
    }
}

public class example {
    public static void main(String[] args) {
        Student uu1 = new Student();//声明uu1对象并实例化
        Student uu2 = null;//声明uu2对象,但不对其进行实例化
        uu2 = uu1;//uu1给uu2分配空间使用权
        uu1.name = "小明";//为uu1对象的name属性赋值
        uu1.age = 20;//定义uu1年龄20岁
        uu2.age = 40;//定义uu2年龄40岁
        uu1.read();//调用对象的方法
        uu2.read();
    }
}

运行的结果如下图所示:

通过这张图片发现,两个对象输出的内容是一样的,这是因为uu2对象获得了uu1对象的堆内存空间使用权。其实就是对uu1的age属性赋值20之后,过对uu2的age属性赋值40,之后uu2的值把uu1的值覆盖掉,所以输出是40。

实际上所谓的引用传递,就是将一个堆内存空间的使用权给多个栈内存空间使用,每个栈内存空间都可以修改堆内存空间的内容,运行结果图的分析如下:

 

从以上的四幅图中可以发现堆内存、栈内存空间的变化,在程序的最后,uu2对象将age的值修改为50,因此最终结果uu1的age属性值是50。

4、访问控制

针对类、成员方法和属性,java提供了四种访问控制权限。这四个访问权限由小到大依次是:

下面具体介绍一下控制权限

  • private:属于私有访问权限。用于修饰类的属性和方法。类的成员如果用到了private,该成员就只能在本类中进行访问。
  • default:属于默认访问权限。即在类中的属性或方法没有任何的访问权限声明时就会默认为此访问权限,默认的访问权限可以被本包之下的其他类调用,但是不能跨包调用。
  • protected:属于受保护的访问权限。只能被本包及不同包的子类访问。
  • public:属于公共访问权限。即可以在全局范围都可以访问。

三、封装性

1、为何要封装

封装可以被认为是一个保护屏障,防止本类的代码和数据被外部程序随机访问。所以需要封装。

2、如何封装

类的封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类提供的方法实现对内部信息的操作访问。

在定义一个类时,将类中的属性私有化,即使private关键字修饰类的属性,被私有化的属性只能在类中被访问。如果外界想要访问私有属性,则必须通过getter和setter方法设置和获取属性值。

四、构造方法

我们在java中实例化一个对象后,,如果要为这个对象的属性赋值,必须通过直接访问对象的属性或调用setter方法才可以实现,如果需要在实例化对象时为这个对象的属性赋值,可以通过构造方法来实现。(构造方法也称为构造器)

1、定义构造方法

构造方法是一个特殊的成员方法,在定义时需注意一下几点

  1. 构造方法的名称必须与类名一致、
  2. 构造方法名称前不能有任何返回值类型。
  3. 不能再构造方法中使用return返回一个值,但是可以单独写return语句作为方法的结束。

2·1、构造方法的重载

在一个类中可以定义多个构造方法,只要每个构造方法的参数类型不同或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法为不同的属性赋值。

2·2、默认构造方法

在java中的每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,方法体中没有任何代码。

通常构造方法使用public修饰。

五、this关键字

在一个类中,当成员变量与局部变量重名时,需要使用到this关键字分辨成员变量与局部变量,java中的this关键字语法比较灵活,主要作用有三点

  1. this关键字调用本类中的属性。
  2. this关键字调用成员方法。
  3. this关键字调用本类的构造方法。

六、代码块

简单来说代码块就是用{}括起来的一段代码。代码块具体可以分为四种,分别是:

  1. 普通代码块
  2. 构造块
  3. 静态代码块
  4. 同步代码块

七、static关键字

在定义一个类时,只是在描述某事物的特征和行为,并没有产生具体的数据。只有通过new关键字创建该类的势力对象时,柴夔开辟栈内存和堆内存,在堆内存中么个对象会有自己的属性。如果希望某些属性被所有对象共享,就必须将其声明为static属性。如果属性使用了static关键字进行修饰,则该属性可以直接使用类名称进行调用。

1、静态属性

如果在java程序中使用static修饰属性,则该属性称为静态属性(也称为全局属性),经验属性可以使用类名直接访问,访问格式如下:

类名。属性名

备注:

static挂年至只能修饰成员变量,不能修饰局部变量,否则编译器会报错。

2、静态方法

如果想要使用类中的成员方法,就需要先将这个类实例化,而在实际开发时,如果想不创建对象的情况下,通过类名就可以直接调用某个方法,要实现这样的效果,只需要在成员方法前加上static关键字,使用static关键字修饰的方法通常称为静态方法。

备注:

静态方法只能访问静态成员,因为非静态成员需要先创建对选哪个才能访问,即随着对象的创建,非静态成员才会被分配内存。而静态方法在被调用时可以不创建任何对象。

3、静态代码块

用static关键字修饰的代码块称为静态代码块。当类被加载时,静态代码块会之星,由于类只加载一次,因此静态代码块只执行一次。通常使用静态代码块对类的成团变量进行初始化。

 

posted @ 2022-04-03 10:59  HeartCloud  阅读(247)  评论(0编辑  收藏  举报
-->