Java基础语法
- 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
- 类:类是一个模板,它描述一类对象的行为和状态。(个人理解C语言中结构体)
- 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。(个人理解C语言中函数)
- 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
1.输入输出
在Java中输出可以:
其中:
-
System 是一个类
-
out 是一个public static字段:它接受输出数据。
三者区别:
-
print() - 它在引号内打印字符串。
-
println() - 它在引号内打印字符串,类似于print()方法。然后光标移动到下一行的开头。
-
printf() - Tt提供字符串格式化(类似于C / C ++编程中的printf)。
输入
Java Scanner 类
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
下面是创建 Scanner 对象的基本语法:
示例:从用户获取整数输入
解释:
为了使用的对象Scanner,我们需要导入java.util.Scanner包。
然后,我们需要创建Scanner类对象。我们可以使用该对象从用户那里获取输入。
在上面的示例中,我们创建了一个名为Scanner类的spring对象。 然后,我们调用Scanner类的nextInt()方法以从用户获取整数输入。
同样,我们可以使用nextLong(),nextFloat(),nextDouble()和next()方法来分别从用户获取long,float,double和string输入。
2.数组
数组是相似类型数据的集合。它是一个容器,用于保存单一类型的数据(值)。
声明数组:
或
上面的语法语句做了两件事:
- 一、使用 int[5] 创建了一个数组。
- 二、把新创建的数组的引用赋值给变量 age。
二维数组声明
引用传递
概念:多个栈空间同时指向同一块堆内存
赋值语句从右向左执行,因此首先执行new int[] {1,2,3},则在堆上开辟12个字节的空间,每四个分别用来存放arr[0],arr[1],arr[2],并对它们进行初始化。然后在栈上为局部变量arr分配空间,并将堆空间的地址(首地址)存到栈空间的arr里面,此时栈上的arr的值就是堆上的数组空间的地址,因此二者建立了一定联系,这里用指向来表示。
再接着在栈上定义了一个局部变量x,并把arr的值赋给x,因此x里面也存的是堆空间的首地址,此时x也指向那块堆空间,利用x也可对堆空间的值进行操作,这便称为引用传递。本质:多个栈空间同时指向同一块堆内存。没有栈内存指向的堆内存也被称为垃圾空间。
注:在C语言里面曾经学过,在函数内部修改其它函数局部变量的值可以通过该变量的地址或者返回值的方式。因此我们可以利用引用传递来修改堆空间的值。
————————————————
以上引用传递内容来源:java数组的定义和使用_java定义一个数组-CSDN博客
数组常用操作
Java中提供了很多对数组操作的方法可以方便得实现对数组的各种操作。
1.数组长度: 数组名.length
2.数组排序: java.util.Arrays.sort(数组名) 升序
3.数组扩容:java.util.Arrays.(数组名称,新数组长度)
(这个很像C语言中的realloc函数)。
4.在数组中查找指定元素:Arrays.binarySearch(数组,指定元素)。
(看名字像是二分查找实现的)。
5.数组拷贝:System.arraycopy(源数组名称,源数组开始点,目标数组 名称,目标数组开始点,拷贝长度)。
3.循环
Java中有三种主要的循环结构:
- while 循环
- do…while 循环
- for 循环
在以上语法中,括号内的测试表达式(testExpression)为布尔表达式。如果测试表达式(testExpression)的计算结果为true.
while循环内的语句将被执行。
然后,再次评估测试表达式(testExpression)。
这个过程一直进行到测试表达式被评估为false为止。如果测试表达式的计算结果为false,
则while循环被终止。
do...while循环主体执行一次(在检查测试表达式之前)。只有这样,测试表达式才会被检查。
如果测试表达式被计算为true,则执行循环体中的代码,并再次计算测试表达式。这个过程一直进行下去,直到测试表达式被计算为false为止。
当测试表达式为时false,do..while循环终止。
for循环的工作
-
初始化(initialization)表达式只执行一次。
-
然后,评估测试表达式(testExpression)。在这里,测试表达式(testExpression)是一个布尔表达式。
-
如果测试表达式(testExpression)的计算结果为true,则执行for循环体内的代码。
-
然后执行更新表达式(update)。
-
再次,评估测试表达式(initialization)。
-
如果测试表达式为true,则执行for循环体内的代码,并继续执行更新表达式(update)。
-
这个过程一直进行到测试表达式(testExpression)被评估为false时为止。
-
如果测试表达式(testExpression)的计算结果为false,则for循环终止。
for循环和for-each循环之间的区别
为什么在处理数组时优先使用for-each循环,而不是for循环,我们来看下面的示例。
我们可以看到两个程序的输出是相同的。
当我们仔细分析这两个程序时,我们可以注意到for-each循环更易于编写,并使我们的代码更具可读性。这就是它被称为增强for循环的原因。
面向对象
1.封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
简介:所谓的封装就是把类的属性和方法使用private修饰,不允许类的调用者直接访问,我们定义如下一个类,可以看到所有的成员变量和成员方法都使用private修饰了。
又如:
在上面的实例中,我们有一个private字段age。因为它是私有的,所以不能从类外部访问它。为了访问age,我们使用了公共方法getAge()和setAge()。这些方法称为getter和setter方法。
如果尝试从Main类中访问age字段,则会出现错误消息。
2.继承
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
简介:所谓继承本质就是实现代码的复用,防止重复的代码多次书写,当一个类继承一个类的时候,该类中就会拥有另外一个类中的所有代码,举个例子看下面代码
可以看到继承的语法形式是class 子类名 extends 父类名,继承类就是子类,也叫派生类,被继承的类称为父类,基类或者超类(名字一般不做区分,均可使用)。
继承是is-a关系,只有当两个类之间存在is-a关系时,我们才使用继承。
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承 Object(这个类在 java.lang 包中,所以不需要 import)祖先类。
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
继承类型
继承有五种类型。
-
单一继承 - B类A仅从类继承。
-
多级继承 - B类从A类继承,然后C类从B类继承。
-
分层继承 - A类作为B,C和D父类。
-
多重继承 -类C从接口A和扩展B。
-
混合继承 -两种或多种继承的混合。
3.多态
多态是面向对象编程的重要概念。它只是意味着不止一种形式。也就是说,同一实体(方法,运算符或对象)在不同情况下的行为会有所不同。
例如:
在Java中,多态可以分为两种类型:
-
运行时多态
-
编译时多态
在Java中,可以通过方法重写来实现运行时多态。
假设在父类及其子类中创建了相同的方法。在这种情况下,将要调用的方法取决于用于调用该方法的对象。例如,
在上面的示例中,该方法makeSound()在两个不同的类中具有不同的实现。当我们运行程序时
-
表达式d1.makeSound()将调用Dog类的方法。这是因为d1是Dog类的对象。
-
表达式c1.makeSound()将调用Cat类的方法。这是因为c1是Cat类的对象。
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
最后
本文中关于面向对象内容讲解较少,部分内容取自Java中的封装,继承和多态(详解)_举例说明:封装和多态在java语言中的体现-CSDN博客
及菜鸟教程。