文章目录 一、使用 对象名.成员名 访问 Groovy 类的成员 二、使用 对象名.'...成员名' 访问 Groovy 类的成员 三、使用 对象名['成员名'] 访问 Groovy 类的成员 四、完整代码示例 一、使用 对象名.成员名 访问 Groovy 类的成员 ---- 对 对象名.成员名..." student.age = 16 使用 对象名.成员名 访问成员 , 相当于执行 getter 方法 ; // 使用 对象名.成员名 访问成员 , 相当于执行 getter 方法 println student.name...‘成员名’ 访问 Groovy 类的成员 ---- 可以使用 对象名....age' 执行结果 : Han 32 三、使用 对象名[‘成员名’] 访问 Groovy 类的成员 ---- 使用 对象名[‘成员名’] 访问 Groovy 类的成员 , 相当于调用类的 getAt 方法
前言 Kotlin 中类的扩展方法并不是在原类的内部进行拓展,通过反编译为Java代码,可以发现,其原理是使用装饰模式,对源类实例的操作和包装,其实际相当于我们在 Java中定义的工具类方法,并且该工具类方法是使用调用者为第一个参数的...,然后在工具方法中操作该调用者; 理论上来说,扩展函数很简单,它就是一个类的成员函数,不过定义在类的外面。...接收者类型是由扩展函数定义的,接收对象是该类型的一个实例 可以像调用类的成员函数一样去调用这个函数: println("Kotlin".lastChar()) n 从某种意义上说,现在已经为String...不管String类是用Java、Kotlin,或者像Groovy的其他JVM语言编写的,只要它会编译为Java类,就可以为这个类添加自己的扩展。 在这个扩展函数中,可以像其他成员函数一样用this。...和在类内部定义的方法不同的是,扩展函数不能访问私有的或者是受保护的成员。 3.3.1导入和扩展函数 对于定义的一个扩展函数,它不会自动地在整个项目范围内生效。
下面关于构造方法的说法不正确的是?...A 构造方法也属于类的方法,用于创建对象的时候给成员变量赋值 B 构造方法不可以重载 C 构造方法没有返回值 D 构造方法一定要和类名相同 考点:考察求职者对构造方法的的理解 出现频率:★★★★★ 【...面试题分析】 所谓构造方法, 1,使用关键字new实例化一个新对象的时候默认调用的方法; 2,构造方法所完成的主要工作是对新创建对象的数据成员赋初值。...使用构造方法时需注意以下几点: 1.构造方法名称和其所属的类名必须保持一致; 2.构造方法没有返回值,也不可以使用void; 3.构造方法也可以像普通方法一样被重载(但不能被重写); 4.构造方法不能被...static和final修饰; 5.构造方法不能被继承,子类使用父类的构造方法需要使用super关键字 所以参考答案是(B)
C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么呢?...那么为什么赋值运算符不可以重载为类的友元函数?像同样都是双目运算符的+为什么它就可以呢?...,执行赋值语句a = 7;程序会去调用类A中相应的赋值运算符重载函数,而不会像上面原来那样去调用有参构造函数。...像最初的赋值语句a = 7,执行时,实际做的操作是a(7)。而当类中有定义赋值运算符重载成员函数,执行赋值语句时,程序就只会去调用相应的赋值运算符重载函数。 ...像类A里有成员函数f(),当 复制代码 代码如下: A a; A* p = &a; p->f(); //虽然类A中没有自己定义运算符->重载成员函数,但这里仍可这样使用 然而,当我们把->运算符重载为类
外部类依旧不能访问静态内部类的成员,但是可以通过静态内部类作为调用者访问静态内部类的成员。...在外部类中可以像使用其它类一样使用内部类,但是不能够在外部类的静态成员中访问非静态内部类。...在外部类以外使用非静态内部类需要通过外部类的对象来调用内部类的构造方法,参考以下代码。...; } } 在外部类以外使用静态内部类需要外部类调用内部类的构造方法创建内部类,参考以下代码。...使用匿名内部类使代码更加简洁。由于匿名内部类不能是抽象类,所以上述代码实现了接口中所有抽象方法。在继承父类实现匿名内部类时,必须实现父类的抽象方法,可以重写父类中的非抽象方法。
2 继承用private和protected访问修饰符可见性 属性方法private不可以被继承 属性方法protected类外部不可见,可以被继承 属性方法public 所定义的类成员可以在任何地方被访问...self:表示当前类的作用域,与this不同的是它不表示类的某个特定实例,在类之外的代码中不能使用self,而且它不能识别自己在继承中层次的位置。...接口常量和类常量的使用完全相同。 它们都是定值,不能被子类或子接口修改。...,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法...nm){ echo "isset()函数测定私有成员时,自动调用"; return isset(this->nm){ echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br
成员内部类就是将内部类作为一个外部类的成员,地位跟变量,方法一样。 内部类一个很大的特点就是,就算我在外部类定义了一个私有变量,外部无法访问,但是内部类依然可以访问。...内部类 来看一下内部类的一些特点 1.内部类的实例化与普通类的实例化有区别,因为内部类是外部类的成员,所以使用 外部类 . 内部类 的方法表示要实例化的内部类。...局部内部类 名字依然很好,局部内部类跟局部变量很相似,一般定义在方法里面,而且只能在方法内部使用。出了方法,方法内的变量就没法使用了,局部内部类也一样,在方法外不可以调用。 ?...局部内部类 局部内部类有点像一次性使用的类,因为如果需要公用和重复调用,最好设计成外部类,而局部内部类只在方法内可以使用,方法调用完了,局部内部类也就没作用了。...总之记住一点,怎么使用局部变量,就怎么使用局部内部类。 匿名内部类 局部内部类有点像一次性使用的内部类,其实还有一种就是一次性使用的内部类,那就是匿名内部类。
当然也是可以的。但是像这种情况,使用继承就会非常香。 为什么这种情况可以使用继承呢? 大家想,要定义学生类,学生是人吗? 当然是人,这是毫无疑问的。 那它具备人的属性吗?当然具备。...那这里的不可见是什么意思呢? 这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。...就可以理解成好比是你爸爸的私房钱,你看不到,也不能花,不论你是什么继承。 所以,如果一个类的成员是私有的,除了在类外不能被直接访问,它的子类虽然可以继承,但也不能直接访问(不可见的)。...如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 那其实这里感觉就有点像子类里面有一个父类的自定义类型的成员一样。...那我们看到其实和构造一样,也是去自动调了父类的拷贝构造,完成父类部分的拷贝。 那我们自己实现拷贝构造呢? 我们发现对于父类成员也不能像正常的那样写。
ps:主要是其内部使用了private final修饰成员,如果想修改,需要使用到反射技术 string方法的修改效果是通过新建StringBuilder来实现的,更老的版本使用StringBuffer...内存结构如下图所示: Java和C++的一个不同点是, 在Java中不可能直接操作对象本身,所有的对象都由一个引用指向,必须通过这个引用才能访问对象本身,包括获取成员变量的值,改变对象的成员变量,调用对象的方法等...那么在String中,明明存在一些方法,调用他们可以得到改变后的值。这些方法包括substring, replace, replaceAll, toLowerCase等。...这也是为什么像replace, substring,toLowerCase等方法都存在返回值的原因。...也是为什么像下面这样调用不会改变对象的值: String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1',
旧标准中我们使用private版本的构造函数来控制构造,但如今如果要控制拷贝最好用=delete 我们对一个类的拷贝和资源管理通常表现为两种:像值的类,像指针的类。...像值的类需要它拷贝前后两个对象完全独立,改变副本不会产生影响;像指针的类通常使用shared_ptr来管理,当需要手动管理时,一般采用引用计数法来保持指针引用记录 管理资源的类通常额外定义了一个swap...当我们需要显式调用递增递减运算符时,我们需要对后置版本的参数传递一个任意int值,这样编译器才能区分出版本 重载函数调用运算符让我们可以像使用函数一样使用类的对象,称为函数对象,函数对象常常用作泛型算法的实参...重载 overload,指对一个同名方法进行了几种不同参数的实现 可以将一个派生类对象转换为基类对象,此时派生类独有的部分将被截断,其基类部分被处理而派生类部分被忽略 有时我们不希望派生类独有的部分被截断则需要使用类指针来调用重载的函数或使用指针所指的成员...,对于实现的内容我们一样可以使用=default简化 如果基类中的基本操作函数不可访问或被删除,则派生类中的对应成员是被删除的因为我们无法使用基类来操作那些成员 C11中,我们可以用using重用基类定义的构造函数
中,祖父类的成员不能直接访问。...因此,我们不能改变 Java 中基类成员的保护级别,如果某个数据成员在基类中是公共的或受保护的,那么它在派生类中仍然是公共的或受保护的。与 C++ 一样,基类的私有成员在派生类中不可访问。 ...与 C++ 不同,在 Java 中,我们不必记住那些由基类访问说明符和继承说明符组合而成的继承规则。 5) 在 Java 中,方法默认是虚拟的。在 C++ 中,我们明确使用虚拟关键字。...8) 在C++中,会自动调用父类的默认构造函数,但是如果我们要调用父类的参数化构造函数,就必须使用Initializer list。...和C++一样,Java中会自动调用父类的默认构造函数,但是如果我们要调用参数化构造函数,那么就必须使用super来调用父构造函数。请参阅以下 Java 示例。
(2)可见性:static修饰全局变量或函数时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。这个函数也只能在本文件中调用,不能被其他文件调用。...所以对于静态资源来说,它是不可能知道一个类中有哪些非静态资源的;但是对于非静态资源来说就不一样了,由于它是实例化对象出来之后产生的,因此属于类的这些东西它都能认识。...,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。...结论4: 类的非静态成员函数可以调用用静态成员函数,但反之不能。...结论5:类的静态成员变量必须先初始化再使用。 结合上面的五个例子,对类的静态成员变量和成员函数作个总结: 一。静态成员函数中不能调用非静态成员。 二。非静态成员函数中可以调用静态成员。
不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。...接口 oop模式中接口也是比不可少的一部分,接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。...接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。...然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。...3、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。 4、接口没有构造函数,抽象类可以有构造函数。
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: ? 上面的例子中两个构造函数的结果是一样的。...初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数: ?...因为 const 对象或引用类型只能初始化,不能对他们赋值。 ? ? 初始化数据成员与对数据成员赋值的含义是什么?有什么区别? 首先把数据成员按类型分类并分情况说明: ?...因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供...结果是 m_x 将有一个不可预测的值。有两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。
如果你需要一个行为像值类型的引用类型,你可以使用record;如果你需要整个对象都是不可变的,且行为像一个值,那么你也可考虑将其声明为一个record类型。 那么什么是record类型?...一个位置记录可以像下面这样调用父类构造函数。...同其他类型一样,record的基类依然是object。 要注意的是: 记录只能从记录继承,不能从类继承,也不能被任何类继承。...record不能定义为static的,但是可以有static成员。...Clone方法用于创建新的record对象,这个方法是不能在record类型里面自定义的。
这个类型主要是让我们可以将一组整型常量组织在一起,像一个简单的文件夹一样 C原本只有一种枚举类型:不限定作用域的枚举。C11加入了限定作用域的枚举。...,否则编译器会认为此函数声明无效,后面的取地址符也不可少,这是因为成员函数到函数指针间没有自动转换规则 我们调用成员函数的方法和使用成员类差不多,区别是标志着函数名的括号仍然不可少,这是因为调用运算符的优先级太高了...,由于成员指针不是可调用对象,因此最常用的方法仍然是使用标准库模板function。...union和struct可对照着看,union的特性是任意时刻只允许其中一个成员有值,然后同样可以和struct一样有丰富的成员,当作一个简单的类来使用,默认的访问控制符是public union不能继承其他类...对象赋值,我们必须自定义这些操作 使用volatile前要问自己使用这个特性是不是真的有意义,是不是真的需要 C++有时候需要调用其他语言编写的函数,对于这样的函数编译器尽管检查调用的方法和C++函数一样
综上所述,选择final来修饰外部方法的成员,让其引用地址保持不变、值也不能被改变保证了外部类的稳定性。...高效,jvm在调用final方法时会转入内嵌机制进行inline优化(inline优化是指:在编译的时候直接调用方法代码替换,也就是内嵌,而不是在运行时调用方法。...所以其实,private方法,默认就是final的,会使用内嵌机制调用。so,能private的就private掉吧),大大提高执行效率。 如下现象?你怎么解释final修饰的c是不可变的呢?...其实这里并不是这样的,因为你new出来的A对象是两个,然后这个c是成员变量属于对象的,所以地址值是不一样的,所以根本就不是同一个,谈何不变呢?...使用场景 匿名内部类的使用也是非常非常多的,所以理解为什么,能够更好的使用内部类,从而可以更优美的去规划自己的代码结构 总结 任何一向规定、规范都不是凭空制定而且也不可能随便下定义的。
那么如果像往常一样去定义,会写很多重复的内容。 这时候C++就提供了一种语法叫做继承。...成员 派生类的protected成员 派生类的protected成员 派生类的private成员 基类的private成员 在派生类中不可见 在派生类中不可见 在派生类中不可见 1.这里的不可见是指基类的私有成员还是被继承到了派生类对象中...基类对象不能赋值给派生类对象。 这里不是类型转换,是类似与切割的方式: 子类给父类赋值其实只是让子类中的父类成员给赋值,多余的就不要了,这就像切割一样。...构造函数: 首先要知道,在子类当中,父类的成员要调用父类的构造函数才能初始化,这里父类的构造函数我们用的缺省值,如果将缺省值去掉,还是像这样去创建子类对象是会报错的。...组合:例如头和眼睛,眼睛应该在头上,但是他们细节没相似之处,不能说头是眼睛。 继承和组合要根据实际情况去使用,如果都差不多就用组合。
不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。...,调用对象的方法等。...那么在String中,明明存在一些方法,调用他们可以得到改变后的值。这些方法包括substring, replace, replaceAll, toLowerCase等。...这也是为什么像replace, substring,toLowerCase等方法都存在返回值的原因。...也是为什么像下面这样调用不会改变对象的值: String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1', '0');
现在我们在VIP的类中加一个到期时间,如果VIP到期,当他买买买的时候,调用的是普通玩家未打折的方法。 我们要在VIP中调用普通玩家的方法,上面不是说被覆盖了不可见么?...其实我们是可以在子类中通过super关键字来调用父类被覆盖的方法的。 super关键字调用 super和this 看了上面的例子,是不是联想到我们曾经学过的this,他们确实有点像,但是也有区别。...相似 1.没有重名的时候,都会隐身,当有重名的时候必须现身。参数与成员变量重名,使用this,父类成员变量与子类成员变量重名,使用super。 1 2.他们都可以调用构造器。...this调用自己类中的构造器,而super可以调用父类中的构造器。 super除了调用被子类重写后被隐藏的成员变量和方法,还有一个重要的作用就是调用父类构造器。...和this一样,第一行只能出现this或者super之一,要么调用自己的构造器,要么调用父类构造器。
领取专属 10元无门槛券
手把手带您无忧上云