字段和属性和构造函数的最详细的解释

using System;
using System.Collections.Generic;
using System.Text;

namespace _20200406
{
    class Wife
    {
        /*java 的设计思想,属性私有化,行为公开化
         * 访问修饰符
         * private
         */
        //数据成员**********************************************************
        //字段:存储数据
        private string name;
        //属性:保护字段 本质就是2个方法
        private string sex= "女";
        /*属性
         * 对字段起到保护作用,可实现只读、只写功能。set访问器和get访问器的有无来实现
         * 本质就是对字段的读取和写入方法。
         * 语法:
         * [访问修饰符]  数据类型  属性名
         * {
         *      get {   return 字段 ;    }
         *      set {   字段 = value ;  }  
         * 
         * }
         * 通常一个共有属性和一个私有字段对应。
         * 属性只是外壳,实际上操作的私有字段。
         * 其实访问器就是一个方法前面已经讲过了
         * 属性是中间商,转手就把数据给字段
         * 以后开发不需要写字段+方法,直接写属性即可
         * 为了增强理解,我这里的代码多对照着看看
         * 有些字段就不需要属性,因为他不需要被类的外面访问
         * 写属性的目的就是为了保护字段的读写属性
         */
        public string Sex
        {
            get
            {
                //读取时保护
                return sex;
            }
            //显然性别就是只读的,不能写入,哈哈,不然媳妇就性别不对了
        }
        /*我们可以看到其实字段和属性的区别
         * 字段首字母小写
         * 属性首字母大写
         * 
         * 当我们定义private字段的时候,需要再定义两个public方法,完成数据的存和取,从而达到保护数据的目的
         * C#的祖师爷觉得这样做太麻烦,当然这也是Java的设计思想
         * 所以C#单提出了public 属性的方式,当在类中定义了public sex属性的时候,
         * 需要再初始化 get 和set 两个方法,其实作用类似 前面的private字段 定义的两个public方法
         * 因此,当对象进行new实例化之后,可以直接通过对象.sex 进行属性的设置。
         * 就不需要像private字段那样,通过方法对字段赋值,然后再通过方法获得值。
         * 方便了很多,当然任何的方式都要视具体的情况而定
         */
         //字段-age
        private int age;
        //属性-age-明白了吗
        public int Age
        {
            get { return this.age; }
            set 
            {
                //这个就是写入数据的时候调用的方法
                //判断的是value 而不是age 注意与下面的法法的区别
                //注意,set方法没有传入的参数,所以这里要用value
                //写入时保护
                if (value <= 19 && value >= 18)
                {
                    //注意这里不在是而是value
                    //this.age = age;
                    this.age = value;
                }
                else
                {
                    throw new Exception("我不要");
                }
            }
        }

        //构造函数*********************************************************
        /*提供了创建对象的方式,常常用于初始化类的数据成员。
         * 一个类若没有构造函数,那么编译器会自动提供一个无参数构造函数
         * 一个类若有构造函数,那么编译器就不会自动提供无参数的数构造函数了
         * 特点:没有返回值,与类同名 创建对象时自动调用(不能手动调用)
         * 其本质就是一个方法,在new 对象的时候调用的方法
         * Wife  wife03=new Wife("阿萨",18); 
         * 其实可以在初始化的时候,直接赋值,那么就需要在定义构造函数的时候
         * 定义好形参变量,在new对象的时候,就可以直接操作了,非常方便,感谢祖师爷
         * 以前我对构造函数的理解也不够深刻,现在茅塞顿开
         * 
         * 另外插播一条设计模式:单例
         * 也就是将构造函数私有化,由public Wife()-->private Wife()
         * 这样外界就无法new出来一个新对象了,同时系统也不会给一个默认的新的构造函数
         */

        //如果在new对象的时候,还是想先不传参数进来,也就是仍然沿用系统默认的构造函数
        //那么就在这个类的内部,在定义一个系统默认的无参的构造函数,实现重载的功能
        //如下:
        public Wife()
        {
            Console.WriteLine("new新对象 就请调用");
        }
        //我们看,可以做任意多个有必要的重载方法
        //另外name 字段,显然我没有进行属性保护,是可以直接访问的。
        //多多思路,感谢祖师爷吧
        public Wife(string name)
        {
            //this 这个关键字 在没有歧义的情况下也可以不写,可以省略
            //既然有,就表示歧义是常见情况,为了提高代码的可读性,感谢祖师爷
            this.name = name;
            Console.WriteLine("new新对象 就请调用");
        }
        public Wife(string name, int age)
        {
            this.name = name;
            //下面这句其实可以写成this.age=age;也可以执行,没有任何问题
            //但是,这就相当于直接对字段赋值了,不会再执行属性中的代码块了
            //也就是说起不到保护的作用了,
            //为什么两种都可以呢?因为这是在类的内部,当然都有权限访问
            this.Age = age;
            Console.WriteLine("new新对象 就请调用");
        }
        //上面的三个初始化构造函数还可以重构,有继承的概念在里面
        //重构如下
        /*
         *public Wife()
         *{
         *    Console.WriteLine("new新对象 就请调用");
         *}
         *public Wife (string name):this()
         *{
         *    this.name = name;
         *}
         *public Wife (string name , int age):this(name)
         *{
         *    this.Age = age;
         *}
         *每个方法会自动调用“:this()”对应参数和无参数的那个构造函数
         * 显然这种方式未来在维护更复杂类的时候,他的耦合性更低,修改起来更加便捷
         * 相信我,需求变动是常有的事
         */


        //方法成员**********************************************************
        public void SetName(string name)
        {
            //this 这个对象(引用)
            //this  关键字可以直接找到这个类的成员变量
            this.name = name;
        }
        public string GetName()
        {
            return this.name;
        }
        public void SetAge(int age)
        {
            if (age<=19&&age>=18)
            {
                this.age = age;
            }
            else
            {
                throw new Exception("我不要");
            }
        }
        public int GetAge()
        {
            return this.age;
        }

    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fastjson的ParserConfig是用于解析JSON字符串的配置类,它提供了一些可以定制的属性和方法,可以满足不同场景下的需求。 构造函数: ```java public ParserConfig(int featureValues, boolean fieldBased) ``` 参数说明: - `featureValues`:特性值,用于配置解析器的行为。 - `fieldBased`:是否基于字段解析。 属性方法: - `public static ParserConfig getGlobalInstance()`:获取全局的ParserConfig实例。 - `public static ParserConfig getGlobalInstance(Feature... features)`:获取全局的ParserConfig实例,并设置解析器特性。 - `public static void setGlobalInstance(ParserConfig config)`:设置全局的ParserConfig实例。 - `public ParserConfig configFromAnnotations(Class<?> clazz)`:从类注解中获取配置信息。 - `public void addAccept(String... names)`:添加可以被解析的类名。 - `public void addDeny(String... names)`:添加不可以被解析的类名。 - `public boolean isAccept(String className)`:判断是否可以被解析。 - `public boolean isDeny(String className)`:判断是否不可以被解析。 - `public void setAutoTypeSupport(boolean autoTypeSupport)`:设置是否开启自动类型支持。 - `public boolean isAutoTypeSupport()`:判断是否开启自动类型支持。 - `public void setAsmEnable(boolean asmEnable)`:设置是否开启ASM字节码增强。 - `public boolean isAsmEnable()`:判断是否开启ASM字节码增强。 - `public void setSafeMode(boolean safeMode)`:设置是否开启安全模式。 - `public boolean isSafeMode()`:判断是否开启安全模式。 - `public void addParserFeatures(Feature... features)`:添加解析器特性。 - `public void config(DeserializationConfig config)`:配置反序列化配置。 - `public void setDeserializer(Class<?> clazz, ObjectDeserializer deserializer)`:设置指定类的反序列化器。 - `public void addDeserializer(Class<?> clazz, ObjectDeserializer deserializer)`:添加指定类的反序列化器。 - `public ObjectDeserializer getDeserializer(Class<?> clazz, Type type)`:获取指定类的反序列化器。 - `public FieldDeserializer createFieldDeserializer(ParserConfig mapping, Class<?> clazz, FieldInfo fieldInfo)`:创建指定字段的反序列化器。 - `public Map<String, FieldDeserializer> getFieldDeserializers(Class<?> clazz)`:获取指定类的所有字段反序列化器。 - `public void addFilter(Class<?> clazz, SerializeFilter filter)`:添加指定类的序列化过滤器。 - `public SerializeFilter getFilter(Class<?> clazz)`:获取指定类的序列化过滤器。 - `public void addFilter(String className, SerializeFilter filter)`:添加指定类名的序列化过滤器。 - `public SerializeFilter getFilter(String className)`:获取指定类名的序列化过滤器。 - `public void addResolveTask(ResolveTask task)`:添加解析任务。 - `public List<ResolveTask> getResolveTaskList()`:获取解析任务列表。 - `public void setResolveStatus(int status)`:设置解析状态。 - `public boolean isPrimitive(Class<?> clazz)`:判断指定类是否为基本类型。 - `public boolean isPrimitive2(Class<?> clazz)`:判断指定类是否为基本类型或字符串类型。 - `public void setTypeResolverAdapter(TypeResolverAdapter typeResolverAdapter)`:设置类型解析器适配器。 - `public TypeResolverAdapter getTypeResolverAdapter()`:获取类型解析器适配器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值