一、Java与C++区别
Java:
Public class A{
Public static void main(String[] args){
System.out.printIn(“hello world”)
}
}
C++:
#include<iostream>
using namespace std;
int main()
{
cout<<“Hello,world”<<endl;
return 0;
}
1. 组织形式
- Java:Java中,一切皆是类,所有数据或方法都要放在类中。
- C++:有 struct 结构、enum 枚举、union 联合等各种组织形式。
2. 数据类型和类
- Java:除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。
- C++:允许将函数和变量定义为全局的。
3. 命名空间
- Java:Java用包代替了C++的命名空间。通过包,Java可以针对类名进行类似于命名空间分解的操作。我们只需“import”导入包。
- C++:
(1) namespace 名称{//声明}。在命名空间中定义的任何东西都局限于该命名空间内。
namespace namespace_name {
// 代码声明
}
为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称:
name::code; // code 可以是变量或函数
(2) 示例
#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
int main ()
{
// 调用第一个命名空间中的函数
first_space::func();
// 调用第二个命名空间中的函数
second_space::func();
return 0;
}
结果:
Inside first_space
Inside second_space
(3) using指令
使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。
#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main ()
{
// 调用第一个命名空间中的函数
// 使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。
func();
return 0;
}
结果
Inside first_space
using 指令也可以用来指定命名空间中的特定项目,例如:
#include <iostream>
using std::cout;
int main ()
{
cout << "std::endl is used with std!" << std::endl;
return 0;
}
4. 声明类和方法
- Java:Java对于类和方法不必提前声明,直接使用即可。
- C++:需要提前声明类和方法,否则会导致编译错误。
5. 指针
- Java:没有指针。用new创建一个对象的时候,会获得一个引用(“句柄”),引用并不一定局限于创建时的位置。它们可根据情况任意定义:
String s = new String("Hello");
- C++:有指针引用。在创建时必须进行初始化,且不可重定义到不同位置。
6. 内存分配
- Java:Java中有垃圾自动回收机制,会自动清理引用数为0的对象。
- C++:需要考虑如何避免内存泄漏。
7. 结构
- Java:所有对象都是从根类 Object 统一继承。在Java中,无论如何都只有一个分级结构。
- C++:可以在任何地方启动一个新的继承树,所以最后往往看到包含了大量树的“一片森林”。
8. 跳转
- Java:采取“break”或“continue”跳出当前的多重嵌套循环。
- C++:goto
9. 多线程
- Java:Java内建了对多线程的支持。利用一个特殊的Thread类,我们可通过继承创建一个新线程(放弃了run()方法)。若将synchronized(同步)关键字作为方法的一个类型限制符使用,相互排斥现象会在对象这一级发生。在任何给定的时间,只有一个线程能使用一个对象的synchronized方法。在另一方面,一个synchronized方法进入以后,它首先会“锁定”对象,防止其他任何synchronized方法再使用那个对象。只有退出了这个方法,才会将对象“解锁”。在线程之间,我们仍然要负责实现更复杂的同步机制,方法是创建自己的“监视器”类。递归的synchronized方法可以正常运作。若线程的优先等级相同,则时间的“分片”不能得到保证。
二、Java基础语法
- 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
- 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
- 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
- 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
- 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行。
三、继承
1. 继承格式
通过extends关键字可以申明一个类是从另一个类继承而来的。
class Parent{
}
class children extends Parent {
}
2. 关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
(1) extends关键字
public class Animal {
private String name;
private int id;
public Animal(String myName, String myId) {
//初始化属性值
}
public void eat() {
//吃东西方法的具体实现
}
public void sleep() {
//睡觉方法的具体实现
}
}
public class Penguin extends Animal