zoukankan      html  css  js  c++  java
  • 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();
        }
    }

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

  • 相关阅读:
    wpf中防止界面卡死的写法
    wpf list<T>与ObservableCollection<T>的区别
    wpf 将对象按照正圆的顺序排列的写法
    .net 如何高效地使用string(转)
    wpf 查找DataTemplate中的控件的实现方式
    wpf 属性变更通知类的实现
    wpf 3D图形的实现(转)
    SpringBoot之HandlerInterceptorAdapter
    websocket简单实现
    mockjs基本使用
  • 原文地址:https://www.cnblogs.com/610553824lyx/p/5984851.html
Copyright © 2011-2022 走看看