Java基础知识之类与对象

类与对象

提示:笔记适用于有些基础的同学


关于这部分你需要知道:

	a. 什么是类
	b. 什么是对象
	c. 识别类,从实际应用中识别出类,例如商品,订单,客户…..抽象出类
	d. 理解类之间的常见关系
	e. 了解封装的意思,目的和优点
	f. JDK, 提供了 jdeprscan 工具来检查你的代码中是否使用了 Java API 已经废弃的特定。
	g. 用户如何自定义类。
	h. 在一个源文件中,只能有一个公共类,但可以有很多的非公共类。
	i. 什么是构造器,以及构造器的特点
	j. 三种赋值方式:构造器中设置值,声明中赋值,初始化快
	k. 类的设计技巧
    I.抽象类的特点是什么

知识点汇总

  1. 类 (class) 是构造对象的模版或蓝图。我们可以将类想象成制作饼干的模具,将对象想象成饼干。由类构造 (construct) 对象的过程称为创建类的实例 (instance).

  2. 封装 (encapsulation)----->> 就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。对象中的数据称为“实例字段”,操作数据的过程称为“方法”。封装的关键在于绝对不能让类中的方法直接访问其他类的实例字段。程序只能通过对象的方法与对象数据进行交互。这是提高重用性和可靠性的关键。

  3. 继承 (inheritance)----->>自定义类,或扩展其他的类都可以,实际上所有类都源自于一个超类“Object”。在扩展一个已有的类时,新类具有被扩展类的所以所有属性和方法。使用者只需要在新类中提供新类适用的方法和数据字段就可以了。通过扩展一个类建立一个新类的过程称为“继承”(inheritance)

  4. 类之间存最常见的关系:
    a. 依赖:如果一个类的方法需要使用或操作另一个类的对象,我们就说一个类依赖于另一个类。例如“订单”类需要使用“客户”类查看信用状态。

    b. 聚合:包容关系意味着类 A 的对象包含类 B 的对象。例如 “订单”类包含一些“商品”对象。

    c. 继承:一般来说类 A 扩展类 B,类 A 不但包含从类 B 继承的方法,还会增加一些额外的功能。

    注意 ⚠️:应该把相互依赖的类降至最少,减少类之间的耦合。

  5. 类的设计技巧:
    a. 一定要保证数据私有
    b. 一定要对数据进行初始化
    c. 不要在类中使用过多的基本类型
    d. 不是所有字段都需要单独的字段访问器或字段修改器
    e. 分解有过多职责的类
    类名和方法名能够体现出他们的功能和作用

  6. 自定义类

Class ClassName
{
	Field1
	Field2
	…....
	Constructor1
	Constructor2
	…....
	Method1
	Method2
	…....
		
}
  1. 构造器的特点:
    a. 构造器与类名相同
    b. 每个类可以有一个以上的构造器
    c. 构造器可以有 0 或 多个参数
    d. 构造器没有返回值
    e. 构造器总是伴随着 new 操作符一起使用
    ⚠️ 不要在构造器中实例局部变量
//例如:
private String n //应改在这里声明变量
public ConstructorName(String name)
{
	String n = name // error 因为局部变量只能在构造器中使用。
}
  1. 初始化块:
    在一个类的声明中可以包含多个代码块,只要构造这个类的对象,代码块就会被执行,并且运行构造器主体前,代码块将会先运行。但是由于复杂的规则,所以建议总是将初始化代码块放到字段定义之后。

抽象类

a. 抽象方法充当占位方法,这些方法的具体实现在子类中。
b. 包含一个或多个抽象方法的类必须被声明为抽象类,不过有些程序员认为抽象类里不能包含具体的实现方法,但是书中建议,尽量将通用的字段和方法放到超类中。
c. 扩展抽象类的情况有两种,一种是在子类中保留父类中部分或所有抽象方法仍为定义,但这样就必须将子类标记为抽象类,另一种就是实现父类的所有抽象方法,这样子类就不是抽象类了
d. 抽象类不能实例化
e. 可以创建一个抽象类的对象变量,这个变量只能引用非抽象类的对象。
Person p = new Student(“name”);

受保护访问

  1. 我们知道最好将字段标记为 private,而方法是 public。 任何声明为 private 的内容对其他类都不可见,当然子类也包括在内。

  2. 如果想要限制超类中某个方法或字段仅允许子类访问,那么就需要将该方法或字段设置为 protected。

  3. 总结三个访问控制机制:
    i. 仅对本类可见-----private
    ii. 对外部完全可见-----public
    iii. 仅对本包和所有子类可见-----protected
    iv. 对本包可见------默认,不需要修饰符

对象

  1. 对象,在Java中要想使用对象就需要先构造对象,这就需要对使用构造器(constructor或称构造函数)构造新的实例。构造器是一种特殊的方法,用于构造并初始化对象。
    a. 构造器的名字与类名相同。
    b. 要想构造一个对象需要在构造器前面加上一个 new 操作符:例如 new Date()
    c. 如果想要多次使用对象,就需要将对象放到一个变量中:例如 Date birthday = new Date()
    d. ⚠️ 在Java中,任何对象变量的值都是对对象的引用,new 操作符的返回值也是一个引用。
  2. 更改器方法与访问器:更改器就是可以访问对象并且修改对象的方法.访问器就是只访问对象而不修改对象的方法,例如 LocalDate.getYear.

静态对象与静态方法

  1. 静态字段:
    a. 如果将一个字段定义为 static 那么,所有的该类实例后的对像都有这个字段,并且值相同。
    例如:
class Employ
{
	private static int nextId = 1;
	private int id;
}
//此时所有 Employ 声明的对象 nextId 都等于 1,换句话说,该静态字段属于类,而不属于任何单个的对象。
  1. 静态常量:
    静态变量比较少用,但是静态常量却很常用。例如:public static final double PI = 3.141592653589793; 如果没有 static, PI 就变成了Math 类的一个实例字段。需要通过 Math 类的一个对象访问 PI, 并且每个 Math 对象都有一个 PI 副本。
  2. 静态方法:
    a. 就是不在对象上执行的方法。例如 Math 类的 pow 方法就是一个静态方法。静态方法没有 this 参数的方法。
    b. 两种情况使用静态方法:
    i. 方法不需要访问对象状态
    ii.方法只需要访问类的静态字段

继承

  1. 关键字 extends 表示正在构造的新类派生于一个已存在的类。这个已经存在的类称为超类,基类或父类;新类称为子类,派生类或孩子类。子类比父类拥有更多的功能。所以在设计时最好将最一般的方法放在超类中,而将更特殊的方法放到子类中。
  2. 如果需要调用超类中的方法则需要使用 super 关键字
  3. ⚠️ 如果子类的构造器没有显示的调用超类构造器,将自动调用超类的无参构造器,如果超类没有无参构造器,子类又没有显示的调用超类的构造器,那么编译器会报错。
  4. 判断是否将类设计为继承关系,就看子类每个对象是不是也是超类的对象,例如“经理”这个对象其实也是“员工”对象,所以经理就可以继承员工。
  5. 如果不想类被继承,那么就需要在创建类时添加 final 关键字。public final class xxxxxxxx.
  6. 继承类 的设计技巧:
    a. 将公共操作和字段放在超类中
    b. 不要使用受保护字段
    c. 使用继承实现 “is - a”关系
    d. 除非所有继承都有意义,否则不要使用继承
    e. 在覆盖方法时不要改变预期行为。
    f. 使用多态,而不要使用类型信息

多态

  1. 在Java语言中,对象变量是多态的。一个父类类型的变量既可以引用父类对象也可以引用它的子类对象。

超类

所有类的超类 Object ;由于所有类都扩展了 Object,所以熟悉这个类提供的服务很重要。

  1. 可以使用 Object 类型的变量引用任何类型的对象

  2. Object 类中的 equals 方法用于检测一个对象是否等于另一个对象。Equals 具有以下特性:自反性,对称性,传递性,一致性。

  3. 用 ArrayList 生成动态数组。这么做的好处有很多,首先能动态调整数组大小,其次,如果空间用尽数组列表会自动创建新的空间,并将数据从小的空间拷贝到大的空间中。⚠️⚠️⚠️⚠️⚠️如果确定数组大小那么就可以调用 ensureCapacity 方法,这样可以减少add调用带来的开销。

  4. 另外可以使用 trimToSize 来帮助回收空间。但一定确保之后 数组列表大小不会改变。

对象包装器于自动装箱

  1. 有时需要将 int 这样的基本类型转换为对象。所有的基本类型都有与之对应的类。如 Integer, Long, Double, Short, Byte, Character, Boolean. 一旦构造了包装器就不能更改包装在其中的值,同时包装器不允许派生子类。
  2. 什么时候用呢? 如果想要定义一个整型数组列表,遗憾的是尖括号中不能是基本类型 ArrayList 这是错误的。而以应该是 ArrayList(); 但这种效率远低于 int [] 这种数组,所以除非必要否则少用。
  3. 在添加 int 类型数据时
List.add (3)
//会自动地变换成
list.add(Integer.valueOf(3)) 

这种变换被称为自动装箱

  1. 相反还有自动拆箱
int n = list.get(i);
//转化成
int n = list.get(i).intValue();

下一篇关于接口与lambda 表达式

所有知识点参考的书籍是

《Java 核心技术 卷 I》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值