JAVA和C++类的不同之处及其他

1,java中源文件中只能有一个public修饰的类,且这个类名字就是源文件名字。C++中public等修饰符一般都是修饰成员函数和变量的。----java中成员函数(包括构造函数)成员变量前面也可以有访问限制符。

2,java类中属性/成员变量/实例变量(类似C++中的全局变量)可以直接在类里面声明的时候赋值初始化,C++中一般使用构造函数(注:java中也会自动初始化,因为类似c中全局,如果是类中类就自动初始化为null,且java中类中类需要在外面new出来,而c++中直接在派生类构造函数中构造即可),但是java中局部变量(方法中的变量),必须先赋值再用,这和c中一样。

java中实例变量会被局部变量覆盖,这和C++中就相当于两种覆盖方式:1)main函数外的全局变量被覆盖,此时用::符号;2)类中函数和类中函数外的成员变量重名,需要用this->。

3,java中类对象定义只用new(除了8个基本类型,其余都是类,都需要new,String除外),而C++中直接int a;或者int a(参数);即可,只是java中new运算符的作用:产生一个对象,并返回它的引用,,也就是new Car()可以直接当做引用来使用

4,java中,main函数中使用未在本源文件定义的类时,都会去源文件所在文件夹寻找那个类的.class或.java。

5,c++中类都是以;结尾,java中是直接以}结尾。

6,java中this相当于c++中的对象(java中是引用),而c++中的this是指针。

7,

1 ) java中构造函数调用构造函数必须满足:1)第一行;2)使用:this(参数);

而C++中一般使用说明语句中内存覆盖:new (this)类名(参数);---->表示产生一个“类名”的对象,覆盖在this指针指向的内存。

2) java中可用super()调用父类构造方法【也可调用父类其他方法,只是这时不需要在第一行了】,而C++中可以直接在派生类构造方法后面显示调用。

8,java中只能单继承且用的关键词extends,而C++中可以多继承。

9,

1)类,实例变量,成员函数,局部变量,,,对于final、static和public,,只有局部变量不能使用public、和static。因为局部变量使用范围就是这个函数中所以不用访问修饰符,而且不能再外部使用所以不能使用static。

2)final、static都要放在访问修饰符后面,但这两者的位置则没有什么要求。

final:不允许类被继承,不允许方法被覆盖,不允许变量被改变(且变量必须要有初始值。)

          final修饰变量时相当于c++中的const。

static:修饰的方法不能被重载

3)访问修饰符:

  1. java中,抽象类中抽象方法可以为private之外任何,而接口中只能用public。且只要一个类中有抽象方法,不论是继承自接口还是其他抽象类,还是自己的,都要将其申明为abstract。
  2. JAVA中访问修饰符只是决定了类、方法或变量的【可见性】,而import能否导入和函数能否覆盖/继承,都是在可见的基础上。而方法、变量的可见性都是在包含它的类的可见基础上才可。

     对可见性主要针对:

  •     本类;private
  •     本包中所有源文件的类;默认
  •     本包中的类和子类(子类可能不在本包中);protected
  •     隔壁包中的类;public

4)静态方法不可以被继承,如要类似继承,则子类中也必须是静态方法。如果子类中不写成静态就会编译不通过。

且静态方法和非静态方法调用是不同的由于静态方法是在编译阶段就确定谁调用,从而和重载一样,是由引用类型决定最终执行的函数。

5)重载函数调用哪个,是由赋值的引用类型决定的。因为重载就是静态多态,在编译时就决定了调用哪个函数。

6)java默认使用了类似C++中的虚拟函数的功能----也就是父类引用调用子类覆盖函数时直接调用子类中的。--实现机制:编译时发现父类引用调用的这个函数在父类中的确有,编译通过。--然后实际运行时发现父类引用指向的是子类对象,所以调用了子类中的那个函数

C++中的虚函数和java中的覆盖函数与抽象函数的实现(其实和覆盖一样),如果返回的是基本类型,则子类必须和父类一样,如果返回的是类,则只要求子类的能赋值给父类即可。

10,java中instanceof和Class的使用

11,java中可同时实现接口和继承类,只时继承类要放在前面。如:public class A extends B implements C{}

12,System.out.println()含义:System是一个类,out是这类中一个静态变量(只不过这个变量类型是个类,而println是这个类中的一个方法)

13,成员内部类

1)静态函数不能访问非静态成员是因为没有this指针。

2)成员静态内部类:1】没有外部类的this指针,从而外部类的外部创建的时候不需要外部类的引用来传值给this指针。2】里面可以有静态函数或变量,但成员非静态内部类不可以有;3】虽然静态函数不能访问非静态变量,但成员静态内部类中还是可以声明成员非静态内部类的对象的

3)成员非静态内部类:1】有this指针,外部类的外部使用时需要外部类的引用。--注:有两个this指针的2】里面不能有静态变量;

14,局部内部类

1)里面不能含有静态函数或者变量;

2)静态函数中的局部内部类和非静态函数中的局部内部类的区别是:静态函数中没有this指针,从而不可以使用外部类中的变量,但非静态函数中的局部内部类是有的。

3)都能访问包含它的那个函数中用final修饰的变量。


总:对局部内部类和成员内部类,由于两者一方面都有类的性质(能被final,public,abstact,implements,extends修饰),另一方面有成员变量(能被static,final,public修饰)和局部变量(只能被final修饰)

15,匿名内部类

1)定义:没有名字,不能显示定义构造函数

2)作用:将抽象类或接口直接以本类型实例化

3)区别:将接口类型直接实例化的时候没有构造函数来传参,而将抽象类直接实例化是由构造函数需要传参的。

16,java中String用双引号,char用单引号。

猜你喜欢

转载自blog.csdn.net/u011776818/article/details/80724523