java学习笔记3--类与对象的基础

简介:

1、面向对象的程序设计方法概述

面向对象的程序设计

与结构化程序设计方法相比,更符合人类认识现实世界的思维方式,已成为程序设计的主流方向

涉及的主要概念:抽象、封装、继承、多态

对象

现实世界中:万物皆对象,都具有各自的属性,对外界都呈现各自的行为

程序中:一切都是对象,都具有标识 (identity), 属性和行为(方法),通过一个或多个变量来保存其状态,通过方法(method) 实现他的行为

将属性及行为相同或相似的对象归为一类,类可以看成是对象的抽象,代表了此类对象所具有的共有属性和行为,在面向对象的程序设计中,每一个对象都属于某个特定的类

抽象

忽略问题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面;计算机软件开发中所使用的抽象有:过程抽象和数据抽象

过程抽象:

–-将整个系统的功能划分为若干部分,强调功能完成的过程和步骤,而隐藏其具体的实现

–-任何一个明确定义的功能操作都可被看作单个的实体,尽管这个操作实际上可能由一系列更低级的操作来完成

–-基于过程抽象的两个标准程序设计技术过程:分解、递归技术

数据抽象

–-将需要处理的数据和这些数据上的操作结合在一起,抽象成不同的抽象数据类型

–-每个抽象数据类型既包含了数据,也包含了针对这些数据的操作

–-相对于过程抽象,数据抽象是更为合理的抽象方法

例:钟表

数据(属性)

int Hour;  int Minute;  int Second;

方法(行为)

SetTime();  ShowTime();

封装

  • 是一种信息隐蔽技术

  • 利用抽象数据类型将数据和基于数据的操作封装在一起

  • 用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的

  • 封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象

继承

  • 是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的派生类(也称为子类)

  • 在继承过程中派生类继承了基类的特性,包括方法和实例变量

  • 派生类也可修改继承的方法或增加新的方法,使之更适合特殊的需要

  • 有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量

PS:Java语言仅支持单继承

多态

  • 一个程序中同名的不同方法共存

  • 主要通过子类对父类方法的覆盖来实现

  • 不同类的对象可以响应同名的消息(方法) ,具体的实现方法却不同

  • 使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序方法同名问题

2、类与对象

在程序中,对象是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(Class),一个类是对一类对象的描述。类是构造对象的模板,对象是类的具体实例

类的声明

声明形式:

[public] [abstract | final] class 类名称 [extends 父类名称] [implements 接口名称列表] { 

     变量成员声明及初始化;

       方法声明及方法体;

}

class:表明其后声明的是一个类。

extends:如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后

implements:l如果所声明的类要实现某些接口,那么,接口的名字应写在implements之后

修饰符:可以有多个,用来限定类的使用方式

public:表明此类为公有类

abstract:指明此类为抽象类

final:指明此类为终结类  

先看一个钟表类的例子:

public class Clock
{  
    // 成员变量
    int hour ;
    int minute ;
    int second ;
   // 成员方法
   public void setTime(int newH, int newM, int newS) {  
      hour = newH ;  
      minute = newM ;  
      second = news ;  
   }
   public void showTime() { 
       System.out.println(hour + ":" + minute + ":" + second);
   }
} 

对象的声明

格式:  类名  变量名

例如:Clock是已经声明的类名,则下面语句声明的变量aclock将用于存储该类对象的引用:Clock  aclock;

声明一个引用变量时并没有对象生成

对象的创建

生成实例的格式:

  new <类名>()

 例如: aclock=new Clock()

其作用是:

在内存中为此对象分配内存空间

返回对象的引用(reference ,相当于对象的存储地址)

引用变量可以被赋以空值

例如:aclock=null;

数据成员

表示Java类的状态,声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性。在一个类中成员变量名是唯一的,数据成员的类型可以是Java中任意的数据类型(简单类型,类,接口,数组)

分为实例变量和类变量

–声明格式

  [public | protected | private]

  [static][ final][transient] [volatile]

  变量数据类型  变量名1[=变量初值],

             变量名2[=变量初值], … ;

–格式说明

public、protected、private 为访问控制符

static指明这是一个静态成员变量

final指明变量的值不能被修改

transient指明变量是临时状态

volatile指明变量是一个共享变量

类变量,也称为静态变量,声明时需加static修饰符,不管类的对象有多少,类变量只存在一份,在整个类中只有一个值,类初始化的同时就被赋值

适用情况:

类中所有对象都相同的属性

经常需要共享的数据

系统中用到的一些常量值

例:对于一个圆类的所有对象,计算圆的面积时,都需用到π的值,可在Circle类的声明中增加一个类属性PI
public class Circle { 
    static double PI = 3.14159265; 
    int radius; 
}
public class ClassVariableTester { 
    public static void main(String args[]) { 
         Circle x = new Circle();  
         System.out.println(x.PI); 
         System.out.println(Circle.PI); 
         Circle.PI = 3.14; 
         System.out.println(x.PI); 
         System.out.println(Circle.PI); 
    } 
}

执行结果:

3.14159265

3.14159265

3.14

3.14

final修饰符

实例变量和类变量都可被声明为final

final实例变量必须在每个构造方法结束之前赋初值,以保证使用之前会被初始化

final类变量必须在声明的同时初始化

类方法,也称为静态方法,表示类中对象的共有行为,声明时前面需加static修饰符,不能被声明为抽象的,类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用
//将摄氏温度(centigrade)转换成华氏温度(fahrenheit)
//转换公式为   fahrenheit = centigrade * 9 / 5 + 32
//除了摄氏温度值及公式中需要的常量值,此功能不依赖于具体的类实例的属性值,因此可声明为类方法
//转换方法centigradeToFahrenheit放在类Converter中
public class Converter { 
     public static int centigradeToFahrenheit(int cent) { 
         return (cent * 9 / 5 + 32);   
     }  
}
//方法调用
Converter.centigradeToFahrenheit(40);

get方法

功能是取得属性变量的值,get方法名以“get”开头,后面是实例变量的名字,一般具有以下格式:

public <fieldType> get<FieldName>() {

    return <fieldName>;

}

对于实例变量radius,声明其get方法如下:
public int getRadius(){
   return radius;
} 

set方法

功能是修改属性变量的值,set方法名以“set”开头,后面是实例变量的名字,一般具有以下格式:

public void set<FieldName>(<fieldType> <paramName>) {

    <fieldName> = <paramName>;

}

声明实例变量radius的set方法如下:
public void setRadius(int r){
     radius = r;
}

关键字this的使用

如果形式参数名与实例变量名相同,则需要在实例变量名之前加this关键字,否则系统会将实例变量当成形式参数。

在上面的set方法中,如果形式参数为radius,则需要在成员变量radius之前加上关键字this。代码如下:

public void setRadius(int radius){
     this.radius = radius;
}
目录
相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
164 57
|
15天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
66 8
|
2月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
79 17
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
3月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
62 17
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
140 4
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
87 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
74 4