Java 程序设计 第3章 类与对象 笔记

简介: Java 程序设计 第3章 类与对象 笔记

3.1 面向对象程序设计概述

3.1.1 面向对象的基本思想

面向对象(Object Oriented,OO)的基本思想是按照人类习惯,把实体抽象成对象,每个对象封装了数据及对数据的操作

3.1.2 类和对象

举例:类:汽车(这个概念) ;

         对象:一辆真实具体的汽车。

类可以看成是对象的抽象,描述具有一组具有相同特征的对象。

对象中的两个东西:数据 和 操作 在Java中通过 成员变量 和 成员方法 来表示 数据 和 操作

3.1.3 Java的面向对象技术

Java是一种完全面向对象的程序设计语言。

3.2 类的创建

3.2.1 类的定义

类的定义包含两部分:成员变量和成员方法。 Java中类定义的格式为:

类的修饰符 class 类名  [extendx 父类名] { //类头

成员变量的定义;                                        //类体

成员方法的定义;

}

类修饰符用于说明类的访问性(如public)和其他性质(如final,abstract等)

一个Java源文件最多能有一个public类,且源文件名必须和public类名相同。

extends 表示该类是从父类派生出来的。

3.2.2 成员变量

也称数据成员,用于描述类的属性,定义格式如下:

成员变量修饰符  数据类型  成员变量名;

(修饰符表示可访问性和性质)

3.2.3 成员方法

方法的作用:1.对成员变量进行各种操作;2.与其他类对象进行交流时,作为类和外部交互的接口,所以成员方法大多是公有的。定义格式:

成员方法修饰符  返回值类型  方法名(参数表) {

};

类定义示例:

一个圆,本身没有什么特别的,可以用来熟悉一下类的写法。

 
public class Circle {
  private double x;
  private double y;
  private double radius;
  public double getX() {
    return x;
  }
  public void setX(double x1) {
     x = x1;
  }
  public double getY() {
    return y;
  }
  public void setY(double y1) {
    y = y1;
  }
  public double getRadius() {
    return radius;
  }
  public void setRadius(double r) {
    if(r>=0)
      radius = r;
    else
      radius = 0;
  }
  public double getPerimeter() {
    return 2*3.14*radius;
  }
  public double getArea() {
    return 3.14*radius*radius;
  }
  public String toString() {
    return "Circle:Center=["+getX()+","+getY()+"];Raduys="
        +getRadius(); 
  }
}

3.3 对象的创建和使用

3.3.1 创建对象

类是一种数据类型,是对事物的抽象。 在程序中不能直接使用类,(就像你不能开一辆概念上的车子)

必须通过创建类的实例(即对象)来使用它。

创建对象的形式:

形式1:先声明对象的引用

  类目 引用变量名;

如:Circle circle1;

然后实例化:

 引用变量名 = new 类名();

如:circle1 = new Circle();

 

形式2.:将1的声明和实例化合在一起:Circle circle1 = new Circle();

3.3.2 构造方法与对象初始化

在Java中,使用构造方法(constructor)是生成实例对象的唯一方法。

构造方法时一种特殊的方法,通过new运算符调用,用来创建对象。

1.构造方法的创建

和创建其他成员方法相同,只是方法名和类名相同,且没有返回值(不要填void,返回值类型直接省略)

构造方法可以重载。

构造方法示例:

public class Xyz{
  private int x;
  public Xyz(){
   x = 0;
  }
  public Xyz(int i){
  x = i;
 }
}

2. 构造方法的调用

上面已经说过,用new调用,用于生成对象。

3.默认的构造方法

如果没有定义构造方法,系统会自动生成一个默认构造方法。

如果定义了构造方法,则不会自动生成默认构造方法。

一般情况下,我们都是自己定义构造方法的。

4.构造方法的重载(this)

有些构造方法可能会调用另一个构造方法,可以通过this来调用那个方法。

例如:

  public Circle(double x1,double y1,double r1) {
    x = x1;
    y = y1;
    radius = r1;
  }
  public Circle() {
    this(0,0,0);  //使用this,调用另一个构造函数
  }

3.3.3 对象的使用

使用对象的数据和方法:

对象引用.数据;

对象引用.方法(参数表);

 

public class CircleTest{
  public static void main(String[] args) {
    Circle c1 = new Circle();
    Circle c2 = new Circle(1.1,1.1,2);
    Circle c3 = new Circle(c2);
    
    System.out.println(c1.toString()+";周长="+c1.getPerimeter()
    +"面积="+c1.getArea() );
    System.out.println(c2.toString()+";周长="+c2.getPerimeter()
    +"面积="+c2.getArea() );
    System.out.println(c3.toString()+";周长="+c3.getPerimeter()
    +"面积="+c3.getArea() );
  }
}

3.3.4 this关键字  指向自身的指针

3.3.5 finalize方法与对象的销毁

Java提供自动内存管理,自动释放不需要再使用的对象。

Java Object类 提供了protected void finalize()方法,这个方法释放对象所占内存。

3.4 类的封装

3.4.1 封装的目的(易用、安全)

类把数据和方法封装起来,使外界使用类时不需要考虑类中的具体细节。

 

数据成员变量一般用private限制,让数据只能在类的内部访问,外部不可访问。保证数据的安全性。

3.4.2 类的访问控制

在Java中,根据类的作用和相关性,对类进行分组,称为包。

同一个包里的类是可以相互访问的,不同包内的类能否相互访问由类的控制符决定。

类的控制符和可见性:

                          public          无修饰符(默认)

同一包:         可见              可见

不同包:         可见              不可见

可以看出,public的类在不同包 也 可见。

 

3.4.3 成员的控制访问


public protected 默认 private
同一包 同一个类 可见 可见 可见 可见

同一个包的子类
可见 可见 可见 不可见
  同一个包的非子类 可见 可见 可见 不可见
不同包 不同包的子类 可见 可见 不可见 不可见
  不同包的非子类 可见 不可见 不可见 不可见

竖着看,public修饰的成员 是公有的,任何对象都能访问。

protected修饰的成员是被保护的,只有同一包或者子类可见。

默认的是包作用域,同一个包可见。

private 是私有的,只有自己可见。

3.4.4 类成员(静态static成员)

类中的特殊成员,不依赖特定的对象

1.类变量

类变量的作用:能被该类的所有实例共享,实现实例对象之间数据共享和通信。

如果所有实例对象都有一个常量属性,可以把其定义为类变量,节省内存。

定义类变量声明:加变量前加static

如: private static int count = 0;

类变量的访问:

可以通过类名或对象访问:

类名.类变量

对象.类变量

2.类方法

与类变量类似,类方法时static修饰的成员方法。 访问方式也和类变量类似。

类方法需要注意:

1.因为类方法不依赖对象,所以不存在this

2.类方法中出现的成员变量只能是静态的。

3.静态方法不能被子类重写。

 

3.5 类的导入与包

包(package)是类和接口的集合。

包具有以下几个方面的作用:

(1)划分类名空间 避免名称冲突

(2)控制类之间的访问

(3)帮助划分类

 

3.5.2 package语句

建立一个包时要使用package语句,格式为:

package pkg1[.pkg2[.pkg3...]];

功能是创建一个具有指导名字的包,该Java文件中的类和接口都放在这个包中。

例如:

package dbconnect;

package cn.edu.njupt.ch03

包的命名使用小写字母,采用点分方法 . 表示目录的层级。 cn.edu.njupt.ch03 与 cn\edu\njupt\ch03对应

注意:

如果用package语句,package语句必须放在文件的第一条可执行语句。

一个文件最多有一个package语句

如果一个源文件没有package语句时,系统会创建一个无名包(缺省包)。

 

3.5.3 import(导入)语句

使用import语句,导入其他包提供的类,简化书写。

例如有一个包 cn.edu.njupt.ch03,里面有一个类MyClass

package cn.edu.njupt.ch03;

public class MyClass{

...

}

在没有import的时候,如果在其他包中的类要使用MyClass,可以 使用

cn.edu.njupt.ch03,MyClass my = new  cn.edu.njupt.ch03.MyClass();

使用import,可以简化书写:

import  cn.edu.njupt.ch03.MyClass;

MyClass my = new MyClass();

 

也可以使用*(替换具体的类MyClass)来包含包内的所有类

import  cn.edu.njupt.ch03.*;


目录
打赏
0
0
0
0
48
分享
相关文章
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
|
12天前
|
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
42 0
|
12天前
|
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
23 0
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
重学Java基础篇—类的生命周期深度解析
本文全面解析了Java类的生命周期,涵盖加载、验证、准备、解析、初始化、使用及卸载七个关键阶段。通过分阶段执行机制详解(如加载阶段的触发条件与技术实现),结合方法调用机制、内存回收保护等使用阶段特性,以及卸载条件和特殊场景处理,帮助开发者深入理解JVM运作原理。同时,文章探讨了性能优化建议、典型异常处理及新一代JVM特性(如元空间与模块化系统)。总结中强调安全优先、延迟加载与动态扩展的设计思想,并提供开发建议与进阶方向,助力解决性能调优、内存泄漏排查及框架设计等问题。
47 5
|
5月前
|
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
258 58
|
6月前
|
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
111 2
|
6月前
|
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
102 3
|
6月前
|
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
114 1
【Java集合类面试三】、Map接口有哪些实现类?
这篇文章介绍了Java中Map接口的几种常用实现类:HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap,以及它们适用的不同场景和线程安全性。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等