Java基础
☕java ['dʒɑvə]
基础
数据类型
类型自动提升与强制转型
在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short
和int
计算,结果总是int
,原因是short
首先自动被转型为int
小的总是被转成大的, 大的放进小的里面就会溢出
数值型字面值
默认情况下,整形字面值是一个十进制整数
二进制整数字面值,在数字前使用
0b
或者0B
, 如0B1111(15)八进制整数字面值,在数字前使用
0
, 如07777(4095)十六进制整数字面值,在数字前使用
0x
或者0X
, 如0XFFFF(65535)补码运算中经常用到&0xff
正数存储的二进制原码,
负数存储的是二进制的补码。
补码是负数的绝对值反码加1。
0xFF的二进制表示就是:1111 1111
计算机存储数据机制:
String 类型
String 类型不是基本类型,而是引用类型
String对象简单方法
获取字符串长度
string.
length()
从字符串中获取字符
s.
charAt(index)
从控制台读取字符串
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();
next()方法
字符串比较
按字典顺序(Unicode码顺序)比较
相等返回 0
s1小于s2, 返回值小于0
s1大于s2, 返回值大于0
另外,使用>、<等比较操作符比较,会发生语法错误
操作符
==
只能检测string1 和string2是否指向同一个对象,而无法判断两个字符串变量内容是否相同equals方法
string1.equals(string2)
compareTo方法
s1.compareTo(s2)
字符串和数字间的转换
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. 方法名(参数);
方法重写
重写方法,需要在子类中使用父类一样的签名来对方法进行定义
重写方法必须与被重写方法具有一样的
签名
(方法名 和 参数列表),以及一样或者兼容的返回类型
仅当实例方法可访问时,才能被重写
私有方法所处类本身以外是不能被访问的,不能被重写
父类中私有方法在子类中被定义, 两者完全没有关系
静态方法可以被继承,但不能被重写
方法重写与重载
重载: 使用同样的名字但不同的签名(方法名 和 参数列表)来定义多个方法
重写: 在子类中提供对一个方法的新的实现
方法重写
(把老的方法实现新的功能 )
(涵盖多种数据类型的同种方法)
父类中的静态方法在子类中被重新定义,则父类中定义的静态方法被隐藏