zoukankan      html  css  js  c++  java
  • 17java类与对象&构造器

    类与对象的关系

    • 类是对象的模板!!!类是对对象的抽象;对象是具体的实例。
    • 类是一种抽象的数据类型,它是对某一类事物整体的描述/或定义,并不能代表某一个具体的事物
      • 动物,手机,Person类,Car类............
    • 对象是抽象概念的具体实例。能够体现出特点,展现出功能的是具体的实例,不是一个抽象的概念。
      • 张三是人的一个具体实例

    创建与初始化对象

    • 使用new关键字创建对象
    • 使用new关键字创建的时候,出了分配内存空间之外,还会给创建好的对象进行过默认初始化,以及对类中构造器的调用
    • 类中的构造器也称为构造方法,是在进行创建的时候必须调用的。构造器有以下两个特点:
      1. 必须和类的名字相同
      2. 必须没有返回类型,也不能写void

    以前写程序每个类都写了main方法,都是为了测试程序方便,但是一名优秀的工程师是不会这样做的。正确的做法是:一个完整的工程只有一个启动类(main方法,程序的入口),其他的类用来完成特定的功能。如下:

    package oop.OopDemo;
    
    public class Student {//学生类
        //属性:字段
        String name;
        int age;
        //方法
        public void say() {
            System.out.println("I'm "+name+" and I'm "+age+" years old.");
            //System.out.println("I'm "+this.name+" and I'm "+this.age+" years old.");
        }
    }
    
    package oop.OopDemo;
    
    public class Application {
        public static void main(String[] args) {
            //先实例化,在调用来里面的对象的属性和方法
            Student student1 = new Student();
            Student student2 = new Student();
            student1.name = "ffd";
            student1.age = 5;
            student2.name = "gfj";
            student2.age = 5;
            student1.say();//调用Demo01类里面的say方法输出demo01对象
            student1.say();//调用Demo01类里面的say方法输出demo02对象
            System.out.println(student1.name);
            System.out.println(student2.name);
        }
    }
    

    运行结果:

    分析:

    • 一般使用Application作为主类(程序 的入口)的类名其余的根据相应的功能取名即可。
    • 我们先看Student类,定义了一个学生类Student,这是一个学生对象的抽象,里面包含了学生的共性:name,age 和一个say方法(当然还可以自定义很多其他的属性和方法)。需要注意的是:(一般的)类只能包含两个内容:属性和方法
    • 再看Application类(主类,程序的入口),使用Student类里面的属性或者方法需要先把Student类实例化,然后的调用方法就和普通的类的对象相同了。
    • 这和上节的引用类型几乎相同,只是这里的主类和普通类不在同一个.java文件中。
    • Question:普通类里面如果对象的属性前面用不用this进行引用有什么区别?

    构造器

    下面直接用操作构造器的代码来进行说明:

    //类
    package oop.OopDemo;
    
    public class Person {
    	//属性:字段(自定义)
        String name;
        int age;
    	//方法
        public Person() {//这是一个无参构造器,如果过不写是默认存在的
            this.name = "fada";//这个不是默认存在的
        }
    
        public Person(String name) {//构造器支持方法的重载
            this.name = name;
        }
    
        public Person(int age) {
            this.age = age;
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    
    //主类
    package oop.OopDemo;
    
    public class Application {
        public static void main(String[] args) {
            Person person = new Person();//使用new关键字实例化了一个对象
            System.out.println(person.name);
        }
    }
    

    运行结果:

    Post Script:

    • Alt+Insert生成构造的快捷键
    • 为什么要使用“this.”?
      因为构造器的参数可能与自定义的属性(字段)相同,加上this.表示这是自定义的属性(字段)而不是形式参数
    • 构造器:
      1.没有返回值类型
      2.构造器的名称和类名相同
    • 作用:
      1.在main方法里面new的本质就是在调用构造方法
      2.初始化对象的值
    • 注意:
      1.无参构造器是默认存在的,即使不写,class文件里面也有
      2.定义了有参构造器之后,如果想使用无参构造器,必须显式定义(就是写出来)

    经测试,在方法的构造器里面对属性(字段)进行初始化后,在main方法里面使用该类的对象对相应的字段进行初始化,是可以成功的,那么现在问题来了:我在类里面可以对属性(字段)进行初始化,在 main方法里面也可以,甚至在其他方法都可以,那么构造器的好处到底体现在哪里?慢慢研究吧。

    发现了一个IDEA的bug:就是上面的一个程序(主类)的实例化Person的对象的语句,如果我按照如下的顺序输入:

    1. 键入new Person,会自动填充为:new Person()
    2. 同时按下Alt+Enter,再次按下Enter,会自动填充为Person person = new Person();这句话没有任何问题,但是在编辑器中就是会报错“‘;’expected”
    3. 我的解决办法是把末尾的“;”删除再加上。也可以直接运行,虽然报错,但是是可以正常运行并输出的。
    自学java,请多多指教!
  • 相关阅读:
    windows nginx
    stdClass 标准
    array_merge
    array_pop
    array_push
    array_unique
    GMT与UTC简介(转)
    curl-手册
    13.5. zipfile — Work with ZIP archives
    7. Input and Output
  • 原文地址:https://www.cnblogs.com/fanfada/p/13768506.html
Copyright © 2011-2022 走看看