java的类和对象

面向对象概述

万物可归类,万物皆对象
面向过程:算法是第一位,根据算法决定数据结构,以便于操作
面向对象:数据是第一位,再考虑相应的算法
类构造对象的过程称为创建类的实例
面向对象最重要的三个特点:
封装:将数据和行为组合在一个包中,对对象的使用者隐藏具体的实现方法。关键在于:一个类的方法不能直接访问另一个类的实例,只能通过对象的方法与对象进行交互。说明一个类的行为与属性与其他类的关系,低耦合,高内聚
继承:通过扩展一个类创建一个新类的过程。对象的状态不能完全描述一个对象,每个对象都有一个唯一的标识。说明的父类和子类的关系。继承避免了对一般类与特殊类之间共同特征进行重复的描述。
多态:着重强调类与类之间的关系。在封装与多态的基础上,存在父类引用指向子类对象,三者缺一不可
成员变量存在于堆内存中。
静态变量存在于方法区中。
成员变量与对象共存亡,随着对象创建而存在,随着对象被回收而释放。
静态变量与类共存亡,随着类的加载而存在,随着类的消失而消失。
成员变量所属于对象,所以也称为实例变量。
静态变量所属于类,所以也称为类变量。
成员变量只能被对象所调用 。
静态变量可以被对象调用,也可以被类名调用。

识别类:名词是状态,动词是方法
类之间的关系

  • 依赖:一个类的方法使用另一个类的对象,尽可能让两个类之间解耦
  • 聚合:一个类的对象包含另一类的对象
  • 继承:
    程序员经常使用UML绘制类图表示类之间的关系
  1. 预定义类
    Date类
    构造对象,确定初始状态,应用方法
    构造器:利用构造器构造新实例
    构造器的名字与类名相同
    对象与对象变量之间存在着区别
    //birthday引用了新构造的对象
    Date birthday = new Date();
    
    其中birthday是一个对象变量,new Date()是一个对象。认识到重要的一点:对象变量并不包含一个对象,而是引用一个对象。一个引用类型只有4个字节
    所有的java对象都保存在一个堆中,所有的变量都放在栈中
    localDate类
    不要使用构造器去构造,而是使用静态方法。不需要使用构造器
    更改器方法与访问器方法
    是否修改调用相应方法的对象值区别这两种方法
  2. 自定义类
    这些类没有main方法,有自己的实例字段和实例方法,会结合使用其他类,只有一个类中有main方法
    public关键字修饰的方法表明任何类的任何方法都可以调用这些方法
    private关键字确保只有该类自身的方法能够访问这些实例字段。
    构造函数(构造器)总是结合new运算符来调用,不能对一个已经存在的对象调用构造器
    构造函数没有返回值
    构造函数内部不能有与实例字段同名的局部变量,直接赋值就好,不需要再次声明。
    即:
 public Employee(String n, double s, . . .)
{
String name = n; // ERROR
double salary = s; // ERROR
. . .
}

直接使用

 public Employee(String n, double s, . . .)
{
name = n; 
 salary = s; 
. . .
}

** var关键词不能用于声明参数与字段,即是不能用于函数声明中参数的声明与类中实例字段的声明
对null值应用一个方法,会产生
nullpointerException**异常

name=Objects.requireNonNullElse(n,"nuknown);
Objects.requireNonNull(n,"The name cannot be null");

方法中的参数
隐式参数–可以与this连用
显式参数
java中的所有方法都必须声明在类的内部,但并不是把他们设置为内联方法
java中为了保持封装的特性,不应该返回一个具有更改器方法的类对象,如果需要返回,首先就要对其进行克隆。
一个类的方法可以访问一个类的所有实例字段。
私有方法

大多数方法都是公共的,但是很多情况下的方法也被设计为私有的,比如说用于完成一些方法的辅助函数

如果类中的所有方法都不会改变其对象,这样的类就是不可变的。例如String类

所有的类都是Object的子类,而toString()方法是Object类定义的方法。所以所有对象都继承了toString()方法,所以就全都可以调用。

静态字段、静态常量、静态方法
静态字段属于类,不属于任何单个存在的对象,被称为类字段,静态字段的值可以通过方法修改,但是每个类只有一个这样的字段,每个对象没有自己的副本。

class Employee
{
private static int nextId = 1;
private int id;
. . .
}
静态常量的访问不需要通过对象来访问,直接类名.静态常量即可。例如Math.PI以及System.out.静态常量。静态常量不同于静态字段,可以被设置为public(,因为其被声明为final,在构造对象时必须初始化,而且不能在之后修改(外界任何对其试图的修改都不可能完成)。
public class Math
{
. . .
public static final double PI = 3.14159265358979323846;
. . .
}
静态方法是不在对象上执行的方法,静态方法不能访问普通实例字段,但是可以访问静态实例字段;静态方法不能在方法中调用非静态方法
**什么情况下使用静态方法
	方法不需要访问任何对象状态,只用显式参数
	方法只访问静态实例字段。**

静态工厂方法
直接使用静态方法构造对象
不使用构造器的原因:
构造器无法命名

方法参数
java总是按值调用,所以一般来说,方法参数的值都不能被改变。
但是有两种类型的方法参数
基本数据类型:不可改变
对象引用:可以改变,同时引用生成的那个对象,改变原对象的值。
java方法的作用:
方法不能修改基本数据类型的参数
方法可以改变对象参数的实例字段
方法不能让一个对象参数引用一个新的对象

多种编写构造器的机制
重载:多个方法有相同的名字、不同的参数,便出现了重载。
编译器根据方法首部中的参数类型与特定方法调用中所使用的值进行匹配,来选出正确的方法。这个过程叫做重载解析
注意:返回类型不是方法签名的一部分。

无参数的构造函数:如果类中声明了至少一个构造器,但是都不是无参数的构造器,那么调用构造函数初始化时不提供参数就是不合法的

显示字段初始化:在java中,允许直接声明实例字段时,就直接给其赋值。

class Employee
{
private String name = "";
. . .
}

构造函数显式参数的命名
调用另一个构造器的this方法
初始化块:初始化块先于构造器主体部分执行。如果代码块被static修饰,那么这一块是静态初始化块,静态初始化块只在类第一次加载的时候执行一次。
对象析构与finalize方法:java会自动完成垃圾回收,不需要人工回收内存,不支持析构器。如果调用到其他资源,将其回收利用十分有必要。

使用包的原因在于保证类名的唯一性,就像c++中的命名空间一样。如果两个人同时建立了同一个名称的类,只要将这些类放置在不同的包中,就不会产生冲突。
类的导入
一个类可以调用所属包中的所有类,以及其他包中的公共类。
一个包中的其他类很好理解,其他包中的公共类,就像我们一直用String类啊啥的,这些都是因为程序默认导入java.lang.* (import java.lang.* )。所以使用其他包的公共类,有两种方法。
第一种:类名前加上完整的包名

var deadline=new java.util.Date();
var today=new java.sql.Date();

第二种:在文件的首部加上import语句。
静态导入静态方法与静态字段,但是如果不是静态导入,应该是不能直接导入其他类的实例字段与方法的。
在包中增加类:将包的名字放在源文件的开头
如果一个文件头部没有放置package,那么这个源文件中的类就属于无名包。
类路径:类存储在文件系统的子目录中,类的路径必须与包名匹配。

类被多个文件共享的条件:虚拟机要搜寻一个类的时候,先查看java API中是否有这个类,然后去查找类路径
编译器对于一个类,如果没有指定这个类的包,那么就会首先查找包含这个包的类。
设置类路径
JAR文件
文档注释
类设计技巧
保证数据私有
保证数据自己初始化
不要使用过多的基本类型
分解有过多职责的类
类名体现其含义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值