一、类与对象
类的定义:定义了一组大体上相似的对象。一个类所包含的方法和数据描述一组对象的共同行为和属性。
对象:类的具体化,是类的实例。
类通过派生可以有子类,同样也可以有父类,形成层次结构。
编写类的模板:public/private class 类名{
public/private 数据类型 变量名;
public/private 数据类型 方法名(参数列表)}
public:存取与访问不受限制;
private:除非是属于类自己的方法,外界代码不能存取和访问。
* 先定义一个对象变量,再“创建(new)”一个对象,主要方式有直接调用类的方法;和存取类的字段。
【问】
早期我们经常这样定义变量 int value=100; 前面的示例中这样定义变量 MyClass obj = new MyClass(); 这两种方式定义的变量是一样的吗?
答:1、“引用”一个对象的变量称为“引用类型”的变量,有时又简称为“对象变量”;诸如int,float之类的变量称为“原始数据类型”的变量。2、当声明一个对象类型的变量时,实际上并没有创建一个对象,此变量为null;定义一个原始类型的变量时,会马上给其分配内存,MyClass obj=null obj为null,int value=100 value 为100。
【问】请输入并运行以下代码,得到什么结果?
答:1、当“=”施加与原始数据类型变量时,是比较变量所保存的数据是否相等。
2、当“=”施加与引用类型变量时,是比较这两个变量是否引用同一对象。
3、引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。
【问】如何比较两个对象的“内容”是否一样?
答:两个对象的“内容”,其实是指它们在某一时刻的所有字段的值,“内容相等”,其实是就“对应字段值”一致。 在Java中要比对两个对象的字段值,可以 “重写(override)”基类的equals()方法
【问】Equals( )方法从哪来?
答:当你定义一个类时,如果不显式指明它的“父亲”类是哪个,则默认是Object。 Object是Java的最顶层基类,其中定义了equals( )方法。
【动手动脑】以下代码为何无法通过编译?哪儿出错了?
如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
【问】如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
这是一个生造出来展示Java语法特性的示例类,在实际开发中不要这样写代码,应该尽量保证一个字段只初始化一次!
【问】使用上页幻灯片中定义的类,以下代码输出结果是什么?
运行结果分为两部分:
①“public int field = 100;”在“{field=200;}”之前
②“public int field = 100;”在“{field=200;}”之后
java字段初始化的规律
所有类的变量都默认初始化为null,比如String a; Integer b;数字类的原始数据类型默认初始化为0,比如int a; short b; char c;boolean默认初始化为false;
【动手动脑】请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
class Root { static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参数的构造器"); } } class Mid extends Root { static{ System.out.println("Mid的静态初始化块"); } { System.out.println("Mid的普通初始化块"); } public Mid() { System.out.println("Mid的无参数的构造器"); } public Mid(String msg) { //通过this调用同一类中重载的构造器 this(); System.out.println("Mid的带参数构造器,其参数值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的静态初始化块"); } { System.out.println("Leaf的普通初始化块"); } public Leaf() { //通过super调用父类中有一个字符串参数的构造器 super("Java初始化顺序演示"); System.out.println("执行Leaf的构造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }
结论(静态初始化块的执行顺序):静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。