Java基础
Java基础
☕java ['dʒɑvə]
基础
数据类型
类型自动提升与强制转型
在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short
和int
计算,结果总是int
,原因是short
首先自动被转型为int
小的总是被转成大的, 大的放进小的里面就会溢出
数值型字面值
-
默认情况下,整形字面值是一个十进制整数
-
二进制整数字面值,在数字前使用
0b
或者0B
, 如0B1111(15) -
八进制整数字面值,在数字前使用
0
, 如07777(4095) -
十六进制整数字面值,在数字前使用
0x
或者0X
, 如0XFFFF(65535)补码运算中经常用到&0xff
- 0xFF的二进制表示就是:1111 1111
- 计算机存储数据机制:
- 正数存储的二进制原码,
- 负数存储的是二进制的补码。
- 补码是负数的绝对值反码加1。
String 类型
- String 类型不是基本类型,而是引用类型
String对象简单方法
-
获取字符串长度
string.
length()
-
从字符串中获取字符
s.
charAt(index)
-
从控制台读取字符串
- next()方法
Scanner input = new Scanner(System.in); String s = input.nextLine();
-
以空白字符为结束标志,如
\t
、\f
、\r
、\n
-
nextLine()方法
Scanner input = new Scanner(System.in); String s = input.nextLine();
- 以回车键为结束标志
-
字符串比较
-
操作符
==
只能检测string1 和string2是否指向同一个对象,而无法判断两个字符串变量内容是否相同 -
equals方法
string1.equals(string2)
-
compareTo方法
s1.compareTo(s2)
- 按字典顺序(Unicode码顺序)比较
- 相等返回 0
- s1小于s2, 返回值小于0
- s1大于s2, 返回值大于0
- 另外,使用>、<等比较操作符比较,会发生语法错误
-
-
字符串和数字间的转换
int intValue = Integer.parseInt(intString); double doubleValue = Double.parseDouble(doubleString);
- 如果不是数字型字符串,转换将导致运行时错误
- 数字转换为字符串,只需要简单实用字符串的连接操作符
- String s = number + " ";
I/O
输入
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
System.out.print("Input your name: "); // 打印提示
String name = scanner.nextLine(); // 读取一行输入并获取字符串
System.out.print("Input your age: "); // 打印提示
int age = scanner.nextInt(); // 读取一行输入并获取整数
System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化输出
}
}
输出
-
输出快捷键
syso
Alt + /
-
格式化控制台输出
System.out.printf
- %4.2f
-
%
域宽度
.精度
转换码
- %表示占位符
- 默认情况右对齐,在%后面添加一个负号,变为左对齐
- 不要比较浮点值是否相等来进行循环控制。因为浮点值都是近似值,将导致不精确循环次数和不准确结果
方法
方法的定义由方法名称、参数、返回值类型以及方法体组成
语法
方法头
修饰符
返回值类型
方法名
(参数列表
){ // 方法体
}
- 定义在方法头中的变量称为形式参数(formal parameter) ,简称 形参(parameter [pə'ræmɪtər])
- 调用方法时,给参数传一个值,这个值称为实际参数(actual parameter) 或实参
- 参数列表 (parameter list) 指明方法中参数的类型、顺序和个数。
- 方法名 和 参数列表 一起构成 方法签名 (method signature)
- 方法头中需要对每一个参数进行单独的数据类型声明
使用
方法能够带来代码的共享和重用, 类中通过使用
类名
.方法名
来调用方法
- 每调用一个方法,系统会创建一个活动记录(/活动框架),用于保存方法中参数和变量。
- 活动记录置于一个内存区域,称为调用栈(call stack), 也称为 执行栈、运行时栈、机器栈,常简称为 “栈”。
- 方法运行结束,相应活动记录就被释放。
- 当调用带参数的方法时,实参的值传递给形参,这个过程称为按值传递 (pass-by-value)
- 如swap(n1, n2), swap(num1, num2)交换方法中
- n1和n2有自己独立于num1和num2的存储空间
- n1和n2的改变不会影响num1和num2的内容
重载方法
重载方法(overload):使用同样的名字,不同的参数列表来定义不同的方法
- java编译器根据方法签名(方法名 和 参数列表)决定使用哪个方法
- 重载方法使得程序更加清楚,执行同样功能但具有不同参数类型的方法应该使用同样的名字
- 被重载的方法必须具有不同的参数列表
- 不能基于不同修饰符或返回类型来重载方法
变量作用域
- 在方法中定义的变量称为局部变量
- 参数实际上就是一个局部变量,一个方法的参数作用域涵盖整个方法。
- 在for循环头中初始操作部分声明的变量,其作用域是整个for循环。
- 可以在一个方法中的不同块里声明同名局部变量
- 不能在嵌套块中或同一块中声明同一个局部变量
- C中可以内层把外层的屏蔽掉
数组
定义
int[ ] arr;
int arr[];//不推荐
初始化
不允许在前面的括号写元素个数
-
静态初始化
- 简写方式,不指定个数,用{ }中的数据直接对数组赋值
int[ ] arr = new int[ ] {1, 2, 3};
- 指定初始化的数组个数,在后面给数组逐个赋值
int[ ] arr = new int[3]; arr[0] = 1;
-
动态初始化
二位动态数组初始化,行号必须写,列号可以省略
int[ ][ ] arr = new int [3][ ]; arr[0] = new int [3]; //0行有三列
int [ ][ ] arr = new int[3][2]; arr [0][0] = 3;
-
数组类型传值,参数是数组的引用,传递的是数组的引用。即传递共享信息 (pass-by-sharing)
-
数组存储在堆中,传递时,尽管是两个独立变量,但指向同一个数组
随机数
random
方法
- 生成大于等于0.0且小于1.0的double型随机整数(包含0,不包含1)
- 0.0 ≦Math.random() < 1.0
- 返回0~9之间的一个随机整数
- (int) (Math.random() * 1.0)
- 返回50~99之间的一个随机整数
- 50 +(int) (Math.random() *50)
- 返回a~a+b之间的一个随机整数,不包括a+b
- a + Math.random() * b
面向对象
面向对象程序设计的三大支柱是封装、继承和多态
- 类 为 对象 定义属性和行为
- 对象状态 (属性) 由数据域与当前值表示。
- 对象行为(动作)由方法定义。
- 创建对象的过程称为实例化(instantion)
- java类使用变量定义数据域,使用方法定义动作。
- 类中提供一种称为构造方法(constructor) 的特殊类型方法,调用它可以创建新的对象。
- 包含main方法称为主类,没有main方法的类无法运行。
- 可以把两个类放在同一个文件中,但文件中只能有一个类是公共(public)类,并且,公共类必须与文件同名。
构造方法
使用new操作符调用构造方法创建对象
构造方法
- 必须与所在类名字相同
- 没有返回值类型,甚至连void也没有
- 在创建一个对象时由new操作符调用,作用是初始化对象
- 通常,类会提供一个没有参数的构造方法(称为无参构造方法)
- 在一个类中用户没有定义构造方法时,类中会隐式定义一个方法体为空的无参构造方法,称为默认构造方法,当且仅当类中没有明确定义任何构造方法时自动提供。
通过引用变量访问对象
- 对象的数据和方法可以运用点操作符
.
通过对象的引用变量进行访问。 - 引用是对象的存储地址
向方法传递对象参数
- 将对象的引用传递给方法
- 执行程序中的方法 调用堆栈
- 对象存在堆中
静态变量和静态方法
静态变量(static variable),也称为类变量
声明一个静态变量或定义一个静态方法,就要在这个变量或方法的声明中加上修饰符
static
- 静态变量被类中所有对象共享
- 静态方法不能访问类中的实例成员
- 静态变量将变量值存储在一个公共的内存地址中
- 而实例方法和实例变量都从属于实例,只有在实例创建之后才能使用,通过引用变量来访问
- 静态方法和静态数据可以通过引用变量或它们的类名来调用
- 静态变量和静态方法可以在不创建对象的情况下访问
- 使用
类名
.方法名(参数)
的方式调用静态方法 - 使用
类名
.静态变量
的方式访问静态变量 - 实例 可以调用 或 访问 实例和静态
- 但静态只能 调用访问 静态
- 不依赖于某个具体实例的方法应该声明为静态方法
- getArea方法依赖于某个具体圆,它是一个实例方法
- Math类中没有一个方法是依赖于特定实例,如random、pow、sin,都是静态方法
- main方法也是静态的,可以从类中直接调用
可见性修饰符
可见性修饰符 指明 类中的数据域和方法 是否能在该类之外被访问
该类之内对数据域和方法 的访问是没有限制的
-
没有使用可见性修饰符,默认类、方法和数据域是可以被同一个包中任何一个类访问的。
-
private
限定方法和数据域 只能在 它自己类中被访问。 -
修饰符private只能应用在
类的成员
上 -
修饰符public可以应用在
类
或类的成员
上 -
在局部变量(方法或函数里的变量) 使用修饰符 public 或 private都会导致编译错误
-
大多数情况下,构造方法都是公共的
-
使用private修饰符将数据域声明为私有的称为数据域封装 (data field encapsulation)
为了更新 被封装的数据域 提供设置方法来给数据域设置新值
-
获取方法称为访问器(accessor ['əksesər] 注意重音在前)
public returnType getPropertyName( ) public boolean isPropertyName( )
-
设置方法称为修改器(mutator mutate美 ['mju.teɪt]转变)
public void setPropertyName(dataType propertyValue )
-
-
final
- 用
final
修饰的方法不能被Override
- 用
final
修饰的类不能被继承 - 用
final
修饰的字段在初始化后不能被修改 - 对
final
字段重新赋值会报错 - 可以在构造方法中初始化final字段
- 用
this引用
关键字
this
引用对象自身, 也可以在构造方法内部调用同一个类的其他构造方法
public class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius; //this关键字用于引用正在被构建的对象的数据域radius
}
public Circle() {
this(1.0) ; // this关键字用于调用另外一个构造方法
}
}
- java中要求,在构造方法中语句 this(arg-list) 应在任何其他可执行语句之前出现
- 一个类有多个构造方法时, 最好尽可能使用 this(参数列表) 来实现
类的关系
类之间的关系通常有 关联、聚合、组合以及继承。
{ 关联
[ 聚集
(组合
)] }
关联 : 二元关系, 两个类之间
聚集 : 两个对象之间归属关系,和组合相似.
继承和多态
继承
-
父类 (parent class): 超类(superclass) ,基类(base class)
-
子类(subclass) : 继承类(extended class) , 派生类(derived class)
-
子类从父类中继承可访问的数据域和方法, 还可以添加新的数据域和方法
-
父类: 通用的类
-
子类:更特定的类
-
语法
public class Circle extends GeometricObject
-
在java中, 不允许多重继承
-
一个Java类只可能直接继承自一个父类, 这种限制称为 单一继承 (single inheritance)
super关键字
关键字super代指父类, 可以用于调用父类中普通方法和构造方法
- 调用父类构造方法语法
super( ) 或 super(arguments) ;
-
要调用父类的构造方法必须使用关键字super, 在子类中调用父类构造方法名字会引发语法错误
-
子类调用父类构造方法的语句必须是它构造方法的第一条语句
public Circle (double radius, String color, boolean filled) { super(color, filled); this.radius = radius; }
-
构造方法链
当构造一个子类的对象时,子类的构造方法会在完成自己任务之前,首先调用它的父类的构造方法.
父类有参和无参的构造方法,子类会调用无参的构造方法
-
调用父类普通方法
super. 方法名(参数);
方法重写
重写方法,需要在子类中使用父类一样的签名来对方法进行定义
-
重写方法必须与被重写方法具有一样的
签名
(方法名 和 参数列表),以及一样或者兼容的返回类型
-
仅当实例方法可访问时,才能被重写
-
私有方法所处类本身以外是不能被访问的,不能被重写
- 父类中私有方法在子类中被定义, 两者完全没有关系
-
静态方法可以被继承,但不能被重写
- 父类中的静态方法在子类中被重新定义,则父类中定义的静态方法被隐藏
- 可以使用"
父类名
.静态方法名
" 调用隐藏的静态方法
方法重写与重载
重载: 使用同样的名字但不同的签名(方法名 和 参数列表)来定义多个方法
- (涵盖多种数据类型的同种方法)
重写: 在子类中提供对一个方法的新的实现
- (把老的方法实现新的功能 )
- 方法重写🔴发生在具有继承关系的不同类中
- 方法重载🔵可以发生在同一个类中, 也可以发生在具有继承关系的不同类中
- 方法重写🔴具有同样的签名(方法名 和 参数列表)
- 方法重载🔵具有同样的名字但不同的参数列表
重写标注@Override, 有标注, 没重写, 将报错
多态
多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法
多态(polymorphism): 使用父类对象的地方都可以使用子类的对象
polymer['pɑlɪmər] 聚合
- 父类型可以引用子类型
- 声明类型决定编译时匹配哪个方法
动态绑定