break 语句
break 语句我们在 switch 中已经见到了,它是用于终止循环的操作,实际上 break 语句在for、while、do···while循环语句中,用于强行退出当前循环,例如
for(int i = 0;i < 10;i++){ if(i == 5){ break; } }
continue 语句
continue 也可以放在循环语句中,它与 break 语句具有相反的效果,它的作用是用于执行下一次循环,而不是退出当前循环,还以上面的例子为主
for(int i = 0;i < 10;i++){ System.out.printl(" i = " + i ); if(i == 5){ System.out.printl("continue ... "); continue; } }
return 语句
return 语句可以从一个方法返回,并把控制权交给调用它的语句。
public void getName() { return name; }
面向对象
下面我们来探讨面向对象的思想,面向对象的思想已经逐步取代了过程化的思想 --- 面向过程,Java 是面向对象的高级编程语言,面向对象语言具有如下特征
- 面向对象是一种常见的思想,比较符合人们的思考习惯;
- 面向对象可以将复杂的业务逻辑简单化,增强代码复用性;
- 面向对象具有抽象、封装、继承、多态等特性。
面向对象的编程语言主要有:C++、Java、C#等。
所以必须熟悉面向对象的思想才能编写出 Java 程序。
类也是一种对象
现在我们来认识一个面向对象的新的概念 --- 类,什么是类,它就相当于是一系列对象的抽象,就比如书籍一样,类相当于是书的封面,大多数面向对象的语言都使用 class
来定义类,它告诉你它里面定义的对象都是什么样的,我们一般使用下面来定义类
class ClassName { // body; }
代码段中涉及一个新的概念 //
,这个我们后面会说。上面,你声明了一个 class 类,现在,你就可以使用 new 来创建这个对象
ClassName classname = new ClassName();
一般,类的命名遵循驼峰原则
,它的定义如下
“骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程式编写时的一套命名规则(惯例)。正如它的名称 CamelCase 所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一的可读性比较好的命名方式。
对象的创建
在 Java 中,万事万物都是对象。这句话相信你一定不陌生,尽管一切都看作是对象,但是你操纵的却是一个对象的 引用(reference)
。在这里有一个很形象的比喻:你可以把车钥匙和车看作是一组对象引用和对象的组合。当你想要开车的时候,你首先需要拿出车钥匙点击开锁的选项,停车时,你需要点击加锁来锁车。车钥匙相当于就是引用,车就是对象,由车钥匙来驱动车的加锁和开锁。并且,即使没有车的存在,车钥匙也是一个独立存在的实体,也就是说,你有一个对象引用,但你不一定需要一个对象与之关联,也就是
Car carKey;
这里创建的只是引用,而并非对象,但是如果你想要使用 s 这个引用时,会返回一个异常,告诉你需要一个对象来和这个引用进行关联。一种安全的做法是,在创建对象引用时同时把一个对象赋给它。
Car carKey = new Car();
在 Java 中,一旦创建了一个引用,就希望它能与一个新的对象进行关联,通常使用 new
操作符来实现这一目的。new 的意思是,给我一个新对象
,如果你不想相亲,自己 new 一个对象就好了。祝你下辈子幸福。
属性和方法
类一个最基本的要素就是有属性和方法。
属性也被称为字段,它是类的重要组成部分,属性可以是任意类型的对象,也可以是基本数据类型。例如下
class A{ int a; Apple apple; }
类中还应该包括方法,方法表示的是 做某些事情的方式。方法其实就是函数,只不过 Java 习惯把函数称为方法。这种叫法也体现了面向对象的概念。
方法的基本组成包括 方法名称、参数、返回值和方法体, 下面是它的示例
public int getResult(){ // ... return 1; }
其中,getResult
就是方法名称、()
里面表示方法接收的参数、return
表示方法的返回值,注意:方法的返回值必须和方法的参数
类型保持一致。有一种特殊的参数类型 --- void
表示方法无返回值。{}
包含的代码段被称为方法体。
构造方法
在 Java 中,有一种特殊的方法被称为 构造方法
,也被称为构造函数、构造器等。在 Java 中,通过提供这个构造器,来确保每个对象都被初始化。构造方法只能在对象的创建时期调用一次,保证了对象初始化的进行。构造方法比较特殊,它没有参数类型和返回值,它的名称要和类名保持一致,并且构造方法可以有多个,下面是一个构造方法的示例
class Apple { int sum; String color; public Apple(){} public Apple(int sum){} public Apple(String color){} public Apple(int sum,String color){} }
上面定义了一个 Apple 类,你会发现这个 Apple 类没有参数类型和返回值,并且有多个以 Apple 同名的方法,而且各个 Apple 的参数列表都不一样,这其实是一种多态的体现,我们后面会说。在定义完成构造方法后,我们就能够创建 Apple 对象了。
class createApple { public static void main(String[] args) { Apple apple1 = new Apple(); Apple apple2 = new Apple(1); Apple apple3 = new Apple("red"); Apple apple4 = new Apple(2,"color"); } }
如上面所示,我们定义了四个 Apple 对象,并调用了 Apple 的四种不同的构造方法,其中,不加任何参数的构造方法被称为默认的构造方法,也就是
Apple apple1 = new Apple();
如果类中没有定义任何构造方法,那么 JVM 会为你自动生成一个构造方法,如下
class Apple { int sum; String color; } class createApple { public static void main(String[] args) { Apple apple1 = new Apple(); } }
上面代码不会发生编译错误,因为 Apple 对象包含了一个默认的构造方法。
默认的构造方法也被称为默认构造器或者无参构造器。
这里需要注意一点的是,即使 JVM 会为你默认添加一个无参的构造器,但是如果你手动定义了任何一个构造方法,JVM 就不再为你提供默认的构造器,你必须手动指定,否则会出现编译错误。
显示的错误是,必须提供 Apple 带有 int 参数的构造函数,而默认的无参构造函数没有被允许使用。
方法重载
在 Java 中一个很重要的概念是方法的重载,它是类名的不同表现形式。我们上面说到了构造函数,其实构造函数也是重载的一种。另外一种就是方法的重载
public class Apple { int sum; String color; public Apple(){} public Apple(int sum){} public int getApple(int num){ return 1; } public String getApple(String color){ return "color"; } }
如上面所示,就有两种重载的方式,一种是 Apple 构造函数的重载,一种是 getApple 方法的重载。
但是这样就涉及到一个问题,要是有几个相同的名字,Java 如何知道你调用的是哪个方法呢?这里记住一点即可,每个重载的方法都有独一无二的参数列表。其中包括参数的类型、顺序、参数数量等,满足一种一个因素就构成了重载的必要条件。
请记住下面重载的条件
- 方法名称必须相同。
- 参数列表必须不同(个数不同、或类型不同、参数类型排列顺序不同等)。
- 方法的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为方法的重载。
- 重载是发生在编译时的,因为编译器可以根据参数的类型来选择使用哪个方法。
方法的重写
方法的重写与重载虽然名字很相似,但却完全是不同的东西。方法重写的描述是对子类和父类
之间的。而重载指的是同一类中的。例如如下代码
class Fruit { public void eat(){ System.out.printl('eat fruit'); } } class Apple extends Fruit{ @Override public void eat(){ System.out.printl('eat apple'); } }
上面这段代码描述的就是重写的代码,你可以看到,子类 Apple 中的方法和父类 Fruit 中的方法同名,所以,我们能够推断出重写的原则
- 重写的方法必须要和父类保持一致,包括返回值类型,方法名,参数列表 也都一样。
- 重写的方法可以使用
@Override
注解来标识 - 子类中重写方法的访问权限不能低于父类中方法的访问权限。