-
类之间的关系:
1 依赖( dependence ), 即“ uses-a” 关系,如果一个类的方法操纵另一个
类的对象,我们就说一个类依赖于另一个类。
2聚合(aggregation ), 即“ has-a ” 关系,聚合关系意味着类 A 的对象包含类 B 的对象。
3继承( inheritance ), 即“ is-a” 关系,如果类 A 扩展类 B, 类 A 不但包含从类 B 继承的方法,还会拥有一些额外的功能. -
对象的生成:用构造器构造并初始化对象,构造器的名字应该与类名相同,像构造Data类对象,则new Data();
-
可以将对象传递给一个方法,也可以将一个方法应用于对象,如:
System.out.printTn(new DateO);
String s = new Date().toString(); -
对象变量:便于构造的对象可以多次使用,变量对象不是对象,并没有实际包含一个对象,而仅仅引用一个对象(初始化之后)不能将任何类的方法应用于这个变量上初始化:可以用新构造的对象初始化这个变量:
(Date deadline; )
deadline = new Date();
也让这个变量引用一个已存在的对象:
deadline = birthday
(已经存在Date birthday = new Date();) -
可以显式地将对象变量设置为null, 表明这个对象变量目前没有引用任何对象。如果将一个方法应用于一个值为 null 的对象上,那么就会产生运行时错误。
-
不要使用构造器来构造 LocalDate 类的对象。实际上,应当使用静态工厂方法 (factorymethod) 代表你调用构造器
-
只访问对象而不修改对象的方法称为访问器方法,但是更改器方法会使对象的状态改变
-
LocalData类中的一些方法:
• static LocalTime now( )
构造一个表示当前日期的对象。
• static LocalTime of(int year, int month , int day )
构造一个表示给定日期的对象。
•int getYear( ) •int getMonthValue( ) • int getDayOfMonth( )
得到当前日期的年, 月和曰。
•DayOfWeek getDayOfWeek
得到当前日期是星期几 作为 DayOfWeek 类的一个实例返回。 调用 getValue 来得到1 ~ 7 之间的一个数, 表示这是星期几 1 表示星期一, 7 表示星期日。
•LocalDate plusDays(int n)
• LocalDate minusDays(int n)
生成当前日期之后或之前 n 天的日期。 -
在一个源文件中, 只能有一个公有类,但可以有任意数目的非公有类。将程序中包含 main方法的类名提供给字节码解释器, 以便启动这个程序:比如java XXX
-
多个源文件的编译方法:例如,将 Employee 类存放在文件 Employee.java 中,将 EmployeeTest 类(公有类)存放在文件 EmployeeTest.java 中。
1.javac Employee*.java
2.javac EmployeeTest.java -
构造器总是伴随着 new 操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的;不要在构造器中定义与实例域重名的局部变量。
-
方法用于操作对象以及存取它们的实例域。例如:方法:
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise; } 这个方法其实有两个参数:第一个参数称为隐式 ( implicit ) 参数(this表示隐式参数), 是出现在方法名前的Employee 类对象。第二个参数位于方法名后面括号中的数值,这是一个显式 (explicit) 参 数 有些人把隐式参数称为方法调用的目标或接收者) -
Employee 类的方法可以访问 Employee 类的任何一个对象的私有域
-
final 修饰符大都应用于基本 (primitive ) 类型域,或不可变(immutable) 类的域(如果类中的每个方法都不会改变其对象, 这种类就是不可变的类。例如,String类就是一个不可变的类)。对于可变的类.使用 final 修饰符可能会对读者造成混乱,final 关键字只是表示存储在某一变量中的对象引用不会再指示其他 对象。但是这个对象是可以更改的
-
即使没有一个对象,静态域也存在。它属于类,而不属于任何独立的对象。
-
静态方法是一种不能向对象实施操作的方法,静态方法不能访问实例域但能访问静态域,也不需要用对象调用,可直接由类调用
-
在下面2种情况下使用静态方法:
•一 方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如:Math.pow)
•一个方法只需要访问类的静态域
(例如:Employee.getNextldh) -
实现一个改变对象参数状态大部分是将对象引用作为参数,因为方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。
-
下面总结一下 Java 中方法参数的使用情况: •一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。 •一个方法可以改变一个对象参数的状态。 •一个方法不能让对象参数引用一个新的对象。
-
不能有两个名字相同参数类型也相同却返回不同类型值的方法
-
对象没有子对象, 只有指向其他对象的指针。
-
this的另一个功能:如果构造器的第一个语句形如 this(…), 这个构造器将调用同一个类的另一个构造器。
-
Java 有自动的垃圾回收器,不需要人工回收内存, 所以 Java 不支持析构器。
-
标记为 public 的部分可以被任意的类使用;标记为 private 的部分只能被定义它们的类使用。如果没有指定 public 或 private , 这 个 部分(类、方法或变量)可以被同一个包中的所有方法访问。
-
关键字 extends 表明正在构造的新类派生于一个已存在的类。 已存在的类称为超类 ,基类或父类; 新类称为子类,派生类或孩子类如:
public class 超类 extends 子类
{
添加方法和域
} -
可以用关键字super解决继承时覆盖的问题
-
关键字 this 有两个用途: 一是引用隐式参数,二是调用该类其他的构造器 , 同样,super 关键字也有两个用途:一是调用超类的方法,二是调用超类的构造器。
-
一个对象变量(例如, 变量 e ) 可以指示多种实际类型的现象被称为多态( polymorphism)。在运行时能够自动地选择调用哪个方法的现象称为动态绑定
-
java不支持多继承
-
子类的每个对象也是超类的对象,“ is-a” 规则的另一种表述法是置换法则。它表明程序中出现超类对象的任何地方都可以用子类对象置换。例如,可以将一个子类的对象赋给超类变量
-
在 Java 中,子类数组的引用可以转换成超类数组的引用, 而不需要采用强制类型
-
如果是 private 方法、 static 方法, final 方法或者构造器, 那么编译器将可以准确地知道应该调用哪个方法, 我们将这种调用方式称为静态绑定( static binding )。 与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。
-
在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是,如果超类方法是 public, 子类方法一定要声明为 public
-
将方法或类声明为 final 主要目的是: 确保它们不会在子类中改变语义。(阻止了继承和覆盖)
-
将一个值存人变量时, 编译器将检查是否允许该操作。将一个子类的引用赋给一个超类变量, 编译器是允许的。但将一个超类的引用赋给一个子类变量, 必须进行类型转换, 这样才能够通过运行时的检査。
-
只能在继承层次内进行类型转换。 •在将超类转换成子类之前,应该使用 instanceof进行检查
-
类即使不含抽象方法,也可以将类声明为抽象类。
抽象类不能被实例化。也就是说,如果将一个类声明为 abstract, 就不能创建这个类的对象。 -
1 ) 仅对本类可见 private。
2 ) 对所有类可见 public
3 ) 对本包和所有子类可见 protected
4 ) 对本包可见—默认, 不需要修饰符。 -
Object: 所有类的超类
-
可以使用 Object 类型的变量引用任何类型的对象:
在 Java 中,只有基本类型(primitive types) 不是对象,例如数值 字符和布尔类型的值都不是对象,所有的数组类型不管是对象数组还是基本类型的数组都扩展了 Object 类 -
在子类中定义 equals 方法时, 首先调用超类的 equals。如果检测失败, 对象就不可能相等。如果超类中的域都相等, 就需要比较子类中的实例域。
-
使用 add 方法为数组添加新元素, 而不要使用 set 方法, 它只能替换数组中已经存在的元素内容。
-
如果在一个条件表达式中混合使用 Integer 和 Double 类型,Integer 值就会拆箱,提升为 Double,再装箱为 Double:
Integer n = 1;
Double x = 2.0;
System.out.println(true ? n : x); // Prints 1.0
包装器类不可以用来实现修改数值参数的方法,除非定义持有者holder类型 -
所有的枚举类型都是 Enum 类的子类。它们继承了这个类的许多方法。其中最有用的一个是 toString, 这个方法能够返回枚举常量名。例如, Size.SMALL.toString( ) 将返回字符串“SMALL” toString 的逆方法是静态方法valueOf。例如, 语句:将s设置成SMALL。
Size s = Enum.valueOf(Size,class, “SMALL”);! -
接口中的所有方法自动地属于 public。 因此,在接口中声明方法时,不必提供关键字public,不过,在实现接口时, 必须把方法声明为 public
-
接口绝不能含有实例域, 在 JavaSE 8之前, 也不能在接口中实现方法
-
要将类声明为实现某个接口 需要使用关键字 implements:
class Employee iipleients Comparable -
使用 instanceof检查一个对象是否属于某个特定类一样,也可以使用instance 检查一个对象是否实现了某个特定的接口:
if (anObject instanceof Comparable) { . . . } -
使用抽象类表示通用属性存在这样一个问题: 每个类只能扩展于一个类。假 设 Employee 类已经扩展于一个类, 例如 Person, 它就不能再像下面这样扩展第二个类了:class Employee extends Person, Comparable // Error
但每个类可以像下面这样实现多个接口://ok
class Employee extends Person implements Comparable -
一个类扩展了一个超类同时实现了一个接口,并从超类和接口继承了相同的方法。例如,假设 Person 是一个类,Student 定义为:
class Student extends Person implements Named { . . . }
在这种情况下,只会考虑超类方法,接口的所有默认方法都会被忽略。这就是类优先