04 类与对象

一、类与对象

类的定义:定义了一组大体上相似的对象。一个类所包含的方法和数据描述一组对象的共同行为和属性。

对象:类的具体化,是类的实例。

类通过派生可以有子类,同样也可以有父类,形成层次结构。

编写类的模板: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();
    }
}

 

结论(静态初始化块的执行顺序):静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。

 

posted @ 2016-10-21 15:41  树深时见鹿``  阅读(92)  评论(0)    收藏  举报