Java学习笔记 -- 第六章 面向对象(一):类和对象

写在开头:从今天开始我们就进入到了Java面向对象的学习了,该部分是Java学习的重点同时也是难点。对该部分的理解深度直接将影响我们对Java的理解和使用。由于该部分内容较多,所以分为四个部分学习:一、类和对象的理解和使用;二、java内存底层的初步了解;三、面向对象的三大特征:继承、封装、多态;四、一些特殊的类:接口、字符串类、内部类等等。本文是对 面向对象(一):类和对象 做一个总结和归纳。同样的,其中也会穿插示例(包括源代码和运行结果)加深大家的理解。还是那句话:假传万卷书,真传一案例。让我们 生死看淡,不服就干!
PS:本文是个人学习笔记,用于个人复习。文章内容引用尚学堂java300集教学。

类和对象

    Ⅰ 面向过程和面向对象的区别
    Ⅱ 类的概念和定义
    Ⅲ 对象
    Ⅳ 类的管理

     示例

Ⅰ 面向过程和面向对象的区别

  区别:面向过程是执行者思维,解决简单问题可以使用面向过程;面向对象是设计者思维,解决复杂,需要协作的问题可以使用面向对象。
  联系:面向过程和面向对象是相辅相成的,都是解决问题的方式。宏观上,通过面向对象进行整体设计;微观上,执行和数据处理,仍是面向过程。

Ⅱ 类的概念和定义

  1. 类和对象的概念
      类可以看作一类对象的模板,对象可以看成该类的一个具体实例;
      类是用于描述同一类型的对象的一个抽象概念,类种定义了这一类对象所应具有的共同的属性、方法

  2. 类的定义
    (1) 类定义格式

    [修饰符] class 类名{
    	属性;
    	方法;
    	构造方法;
    }
    

    (2)属性field
      属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,java使用默认的值对其初始化。
      属性定义格式:

    [修饰符] 属性类型 属性名 = [默认值]
    
    数据类型 默认值
    整型 0
    浮点型 0.0
    字符型 ‘\u0000’
    布尔型 false
    所有引用类型 null

    (3)方法method
      方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。
      方法定义格式:

    [修饰符] 方法返回值的类型 方法名(形参列表){
    	语句块
    }
    

    (4)构造方法constructor
      构造方法用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。
      构造方法声明格式:

    [修饰符] 类名(形参列表){
    	语句块
    }
    

      构造方法的四个要点:
        - 构造方法虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造方法里使用return返回某个值
        - 构造方法通过new关键字调用
        - 如果我们没有定义构造方法,则编译器会自动定义一个无参的构造函数。如果定义则编译器不会自动添加
        - 构造方法的方法名必须和类名一致

      构造方法的重载:构造方法也是方法,只不过有特殊的作用而已。与普通方法一样,构造方法也可以重载。

Ⅲ 对象

  对象和类的关系:前面我们说过:类可以看作一类对象的模板,对象可以看成该类的一个具体实例。我们也可以通过一个类比来更加形象地理解这个关系。我们可以把对象比作一张汽车图纸,上边详细记载了一俩汽车所具备的部件和能进行的操作;而对象就是根据这张图纸制造出的一辆辆真实的汽车实例。
  对象的声明周期:
     - 创建对象(四步)
       + 分配对象空间,并将对象成员变量初始化为0或空
       + 执行属性值的显示初始化
       + 执行构造方法
       + 返回对象的地址给相关的变量
     - 使用
       + 通过变量引用操作对象
     - 回收
       + 对象没有被变量使用,则默认为是“垃圾”。会被垃圾回收器回收

Ⅳ 类的管理

  1. package包机制
      我们通过 package 实现对类的管理,package 的使用有两个要点:
        (1) 通常是类的第一句非注释性语句。
        (2) 包名:域名倒着写即可,再加上模块名,便于内部管理类。

      注意事项:
        - 写项目时都要加包,不要使用默认包。
        - com.gao 和 com.gao.car,这两个包没有包含关系,是两个完全独立的包。只是逻辑 上看起来后者是前者的一部分。

      JDK中的主要包

    Java中的常用包 说明
    java.lang 包含了一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用的功能
    java.awt 包含了构成抽象窗口工具集( abstract window toolkits )的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)
    java.net 包含执行与网络相关的操作的类
    java.io 包含能提供多种输入/输出功能的类
    java.util 包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数
  2. import导入
      如果我们要使用其他包的类,需要使用 import 导入,从而可以在本类中直接通过类名 来调用,否则就需要书写类的完整包名和类名。import 后,便于编写代码,提高可维护性。

      注意要点:
        - Java 会默认导入 java.lang 包下所有的类,因此这些类我们可以直接使用。
        - 如果导入两个同名的类,只能用包名+类名来显示调用相关类:

    java.util.Date date = new java.util.Date();
    

示例:创建一个学生类,并定义三个属性:学号(id),姓名(sname),年龄(age);和一个方法:打印学生信息studentInformation( )。
package Student;	//包名

//每一个源文件必须有且仅有一个public class,并且类名和文件名保持一致!
public class Student {
    //属性
    int id;         //学号
    String sname;   //姓名
    int age;        //年龄

	//无参构造方法
	public Student(){
	}
	
    //有参构造方法(方法名和类名保持一致)
    public Student(int _id, String _sname, int _age){
        id = _id;
        sname = _sname;
        age = _age;
        
    //我们对有参构造方法进行重载,使其只对学号与姓名进行赋值
    public Student(int _id, String _sname){
        id = _id;
        sname = _sname;
    }

	//方法(打印学生信息)
    void studentInformation(){
        System.out.println("Student ID: " + id );
        System.out.println("Name: " + sname );
        System.out.println("Age: " + age);

	//main方法
    public static void main(String[] args) {
        Student s1 = new Student(9527,"张三", 23);    //创建一个学生类的实例s1
        s1.studentInformation();    //调用学生类对象s1的方法studentInformation(),打印学生信息

		System.out.println("=================");	//分割线
		
		Student s2 = new Student(2333,"李四");     //创建一个学生类的实例s2
		s2.studentInformation();
    }

  我们创建了学生类Student,并且定义了三个属性:学号(id),姓名(sname),年龄(age);一个方法:打印学生信息studentInformation( )。
  我们声明了一个有参构造方法,使得其能通过传入实参对类对象的三个属性进行初始化;紧接着我们重载了这个构造方法,让它只对学号和姓名进行初始化。
  在main函数中,我们通过new关键字创建了两个Student类的实例s1和s2,由于传入的参数不同,这s1与s2调用的构造函数也不同。如果我们不传入任何实参,那么就会调用无参构造方法,系统会赋予成员变量默认值。接下来我们调用了s1和s2的方法,打印出了s1与s2的学生信息。

  可以看到,s1和s2都打印了三个属性的信息。特别的,这里s2的age属性数值为0,这是因为s2在构建时调用了重载后的构造函数,仅对id与sname进行了初始化,age则是系统默认值。

发布了11 篇原创文章 · 获赞 3 · 访问量 909

猜你喜欢

转载自blog.csdn.net/IceTiger_/article/details/105350172