java面向对象笔记_Java面向对象笔记

面向对象

Java 编写的代码都位于某个类的内部, 即每个.java文件就是一个Java类文件类是构造对象的模板和蓝图 , 由类构造对象的过程称为创建类的实例

封装(数据隐藏)与对象有关的重要概念。从形式上看封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式对象中的数据称为实例域

操纵数据的过程称为方法

每个特定类的实例的一组实例域值的集合是对象的当前状态

对象对象的三个主要特征对象的行为 (可以对对象施加那些操作)

对象的状态 (当施加那些方法是,对象应如何响应)

对象的标识 (如何辨别具有行为与状态的不同对象)

类之间的关系依赖(“uses-a”)如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类

聚合(“has-a”)类A的对象包含类B的对象

继承(“is-a”)用于表示特殊于一般关系。(子类是特殊,父类是一般)

对象与对象变量

构造器

在Java程序设计语言中,使用构造器构造新实例, 构造器是一种特殊的方法。构造器的名字于类名相同。构造一个对象时需要在构造器前面加一个new操作符。

在构造对象时,构造器就会运行, 以便将实例域初始化为所希望的状态。构造器于类同名

每个类可以有一个以上的构造器

构造器可以有0个、1个或多个参数

构造器没有返回值

构造器总是伴随着new操作一起调用

对象变量对象变量不是一个对象

对象变量并没有实际包含一个对象,而仅仅引用一个对象。

final 实例域必须确保在每一个构造器执行之后,这个域值被设置,并且在后面的操作中,不能够再对它进行修改

final 修饰符大都应用于基本类型域,或不可类的域

final 关键字值是表示存储在变量中的对象引用不会再指示其他对象。不过这个对象可以更改

静态域如果将域定义为static, 每个 类中只有一个这样的域。

它属于类而不属于任何独立的对象。故也被称为类域

静态常量

public static final xxx

静态方法静态方法是一种不可能向对象实施操作的方法, 不能访问实例域,但是可以访问静态域。

可以在以下两种情况下使用静态方法一个方法不需要访问对象状态,其所需参数都是通过显式参数提供

一个方法只需要访问类的静态域

方法参数java 总是按值传递

java中方法参数的使用情况一个方法不能修改一个基本数据类型的参数

一个方法可以改变一个对象参数的状态

一个方法不能让对象参数引用一个新的对象

对象构造

this指示隐式参数,也就是所构造的对象

重载

如果多个方法有相同的名字、不同的参数、便产生了重载。

默认域初始化

如果在构造器中没有显式地给域赋予初值,那么就会自动地为默认值:数值为0、布尔值为false、对象应用为null。

调用另一个构造器关键字this引用方法的隐式参数

如果构造器的第一个语句形如this(…),这个构造器将调用同一个类的另一个构造器。

数据域的初始化在构造器中设置值

在声明中赋值

初始化代码块

调用构造器的具体步骤所有数据域被初始化为默认值(0、false或null)

按照在类声明中出现的次序,依次执行所有域初始化语句和初始化快

如果构造器第一行调用了第二个构造器,则执行第二个构造器主体

执行这个构造器的主体

将类放入包中要想将一个类放入包中,就必须将包的名字放在源文件的开头,包中定义类的代码之前。

将包中的文件放到与完整的包名匹配的子目录中。

包作用域

标记为 public的部分可以被任意的类使用;

标记为private 的部分只能被定义它们的类使用;

类路径

类路径是所有包含类文件的路径的集合

文档注释

应当为以下几个部分编写注释包

公有类与接口

公有的和受保护的构造器及方法

公有的和受保护的域

。。。。

类设计技巧一定要保证数据私有

一定要对数据初始化

不要在类中使用过多的基本类型

不是所有的域都需要独立的域访问器和域修改器

将职责过多的类进行分解

类名和方法要能够体现它们的职责

优先使用不可变的类

继承

定义子类1

2

3public class extends Employee{

}

在设计类的时候,应该将通用的方法放在超类中,而将具有特殊用途的方法放在子类中。

覆盖方法

关键字this有两个用途引用隐身参数

调用该类其他的构造器

关键字super的两个用途调用超类的方法

调用超类的构造器

super关键字

super不是一个对象的引用,不能将super赋值给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字

在子类中可以增加域、增加方法或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。

子类构造器1

2

3

4public (String name, double salary, int year, int month, int day){

super(name, salary, year, month, day);

bonus = 0;

}可以通过super实现对超类构造器的调用。

使用super调用构造器的语句必须是子类构造器的第一条语句。

如果子类的构造器没有显式地调用超类的构造器,则将自动地调用超类默认的构造器(没有参数的)

如果超类没有不带参数的构造器,并且在子类的构造器中又没有显式地调用超类的其他构造器,则Java编译器将报告错误。

一个对象变量可以指示多种实际类型的现象被称为多态

在运行时能够自动地选择调用哪个方法的现象称为动态绑定

继承层次由一个公共超类派生出来的所以类的集合称为继承层次

在继承层次中,从某个特定的类到其祖先的路劲被称为该类的继承链

多态

is-a规则表明子类的每个对象也是超类的对象

置换法则: 表明程序中出现超类对象的任何地方都可以用子类对象置换

方法调用编译器查看对象的声明类型和方法名。

编译器查看调用方法时提供的参数类型

如果是private方法、static 方法、final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,这种调用方式称为动态绑定。

当程序运行时,并且采用动态绑定调用方法,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。

在覆盖方法的时候,子类方法不能低于超类方法的可见性。

如果超类方法是public,子类方法一定要声明为public.

final类和方法1

2

3public final class Executeve extends{

....

}

如果在定义类的时候用了final修饰符就表明这个类是final类。final类不允许定义子类1

2

3

4

5public class Employee{

public final String getName(){

return name;

}

}

类中的特定方法也可一被声明为final。这样子类就不能覆盖这个方法

如果一个类被声明为final,其中的方法被自动的成为final但是不包括域

强制类型转换

将一个子类的引用赋给一个超类变量,编译器是允许的。但将一个超类的应用赋给一个子类变量,不许进行类型转换。只能在继承层次内进行类型装换。

在将超类转换成子类之前,应该使用instanceof 进行检查1

2

3if (staff[1] instanceof Manager) {

boss = (manager)staff[1];

}

抽象类1

2

3

4public abstract class Person{

.....

public abstract String getDescription();

}

只需要列出方法,而不需要具体实现 即 抽象方法充当着占位的角色,它们的具体实现在子类中

除了抽象方法外,抽象类还可以包含具体数据和具体方法。

扩展抽象类可以有两种选择:在抽象类中定义部分抽象类方法或不定义抽象类方法,这样就必须将子类也标记为抽象类

定义全部抽象方法,这样子类就不是抽象的了。

受保护访问

最好将类中的域标记为private,而将方法标记为public任何声明为private的内容对其他类都是不可见的(包括子类)。

如果希望超类中的某些方法或某个域允许被子类访问,就需要将方法或域声明为protected

总结Java用于控制可见性的4个访问修饰符private: 仅对本类可见

public: 对所有类可见

protected: 对本包和所以子类可见

无修饰符(默认): 对本包可见修饰符当前类同一包内子孙类其他包publicYYYY

protectedYYYN

default(无修饰符)YYNN

privateYNNN

Object

equals 方法

Object类中的equals方法用于检测一个对象是否等于另外一个对象

Java语言规范要求equals方法具有以下特性:自反性:对于任何非空引用x, x.equals(x)应该返回 true

对称性:对于任何引用x和y, 当且仅当y.equals(s)返回true,x.equal(y)也应该返回true。

传递性: 对于任何引用x和y,当且仅当y.equals(x)返回true,y.equals(z)返回true,x.equals(z)也应该返回true

一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果。

对于任意非空引用x, x.equals(null)应该返回false。

hashCode方法

由于hashCode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址。

如果存在数组类型的域,那么可以使用静态的Arrays.hashCode方法计算一个散列码,这个散列码有数组元素的散列码组成。

toString方法

用于反回对象值的字符串。

绝大多数的toString方法都遵循的格式:

类的名字,随后是一对方括号扩起来的域值。

在调用x.toString()的地方可以用“”+x替代。只要对象域一个字符串通过操作符”+”连接起来,Java编译就会自动地调用toString方法。

泛型数组ArrayList类

ArrayList类是一个采用类型参数的泛型类。为了指定数组列表保存的元素对象类型,需要用一对尖括号将类名括起来加在后面。1ArrayList staff = new ArrayList();

add方法: 将元素添加到数组列表中。

ensureCapacity方法:顾明思意就是当你却定数值中的元素个数,即不再进行更改时。使用该方法确定(固定)数组大小

trimToSize(): 将数组列表的存储容量削减到当前尺寸。

访问数组列表元素:

set(i, xxx) : 设置第i个元素

get(i): 访问第i个元素。由于get方法只能返回Object, 因此,使用get方法必须对返回值进行类型转换 Employee e = (Employee) staff.get(i)

remove(int index): 删除一个元素,并将后面的元素向前移动。

对象包装器于自动装箱什么是包装器?

所有基本类型都有一个于之对应的类,这些类就被称为包装器。

自动装箱:1list.add(3)将自动地变换成list.add(Integer.valueOf(3))

如果在一个条件表达式中混合使用Integer和Double类型,Integer值就会拆箱,提升为double,再拆箱为Double

参数数量可变的方法

省略号...表明这个方法可以接收任意数量的对象

枚举类1public enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE}

所有枚举类型都是Enum类的子类。

toString() 方法能够返回枚举常量名。

valueOf() 返回枚举的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值