Java学习笔记-1
一、基础知识
注释
单行注释 // //
多行注释 /* /
文本注释 /* **/
注意行中(代码内)写注释要用多行注释
输入输出
public static void main(String[]args)
含有main方法的类可以运行,main方法必须是公共的、静态的,返回void且必须接受一个String类型的数组
system.out.println 带换行的效果的输出
system.out.print 不带换行效果的输入
system.in包含两种方法
int read() 返回ASCII码
int read(byte[] b) 返回读入的字节数
定义:public static final PrintStream out
public static final Input Stream in
Scanner类
定义:public final class Scanner extends Object
导入方式:import java.util.*;
Scanner类的next方法在util包中
Scanner方法将输入内容转换为标记,通过next方法将表里转换为对应类型的值(如nextint、nextline等)
标示符
开头必须为字母/下划线/$
给类起名字首字母大写
方法和变量第一个单词首字母小写,之后首字母均大写
变量
double long 8字节(1字节为8位)
int 4字节
局部变量(从属于语句块)
成员变量(在方法外在类内,从属于对象)不要求必须初始化(默认为int 0;double 0.0;char ‘\u0000’;boolean false)
静态变量(static)从属于类
常量(constant)
常量所有字母大写
通过final声明常量
通过final修饰变量使变量成为常量 称为符号常量
数据类型
一.基础数据类型:
一字节8位,第一位表示符号故一位可以表示[-27,27-1] 其它以此类推
1.数值型
(1)整数型[byte(1字节) short(2字节) int(4字节) long(8字节)]
用long定义常量后面要加L/l 如long population=700000000L
(2)浮点型[float(4字节) double(8字节)]
声明时在数据后面分别加F/f D/d
不加默认按双精度处理(double类型)
2.字符型(2个字节) 字符要用单引号括起来
3.布尔型(1个位)
数的表示
10进制:15
8进制:015
16进制:0x15
2进制:0b15
二.引用数据类型(4字节)
即复合数据类型
包括数组、类、接口
基本数据类型变量内存中存储数据值,复合数据类型变量内存中存储数据首地址,故其又称为引用变量
不同类型数据可以混合运算,占内存空间小的数据类型会自动转换为占空间大的类型
byte、short、char—int—long—float—double(从小到大)
当需要从大到小时应通过强制转换,如
int a = 20;
byte b = (byte)a;
Math.round()方法将一个double型数值四舍五入为long型
+号两边有一个及以上字符串类型时,将自动将不是字符串类型的转换为字符串类型,并完成字符串的拼接
运算符
1.算术运算符
x = a++;
即x = a;
a = a+1;
一元运算符中的+ -为取正/负值
2.布尔运算符
与(&&)
或(||)
非(!)
3.位运算符
a>>b 将a右移b位(<<同理)
&按位与
|按位或
^按位异或
~按位非
4.条件运算符
布尔表达式 ? value1 : value2
如果布尔表达式为true计算value1 反之计算value2
switch语句
switch(表达式){
case 取值1: 语句块1; break;
case 取值2: 语句块2; break;
case 取值3: 语句块3; break;
default: 语句块n;break;
}
default语句可以没有,用来处理不在取值中的结果
break用来在执行完一个case分支后跳出switch语句。没有break程序就会一直向下执行直到break或switch语句结束
循环
循环次数已知——for循环
循环次数未知——while/do while循环
带标号的循环如st:while(true)
可以通过break 标号; 的方式跳出整个循环(这个循环可以是多重循环,不加标号的break只能跳一层)
方法
返回值类型 方法名(参数){
方法体
}
无返回值要写void
加static为静态方法,可直接调用
调用方法 方法名(实际参数表);
如 static boolean 方法名(int xIn)
说明方法需要提供一个整形参数,返回一个bool值,变量名带有In表示在方法内部有效
通过return语句将方法结束并返回调用点,并将所携带参数返回给调用者(返回值类型必须与方法头部声明类型一致)
方法执行完方法体的最后一条语句也会结束运行,但return可以多次添加在方法体中
(1)return;
适用于返回值是void的方法
(2)return(表达式);
一般在代码最开始写方法,但执行时默认从main方法开始执行
多个参数用逗号分隔,其它无区别
栈内存和堆内存
基本类型变量和引用变量在栈内存中,运行到作用域之外即被释放
数组和new创建的对象放在堆内存,栈中对数组的引用变量值为数组在堆内存中的首地址。就算超出作用域堆内存中的垃圾也不会被立刻清理,故占用空间较大。
数组
声明数组
数组数据类型[] 数组名称
如int[] A 此时并未分配存储空间
初始化:A = new int[10];
new分配空间的同时将初始化数组元素
创建数组 int A[] = new int[10];
初始化
1.int A[]={1,2,3};
不需要声明数组大小
2.A[2] = 3;
给数组中第二位(第三个)元素赋值为3
可通过数组名.length查看数组长度
数组名中存储的是数组第一个元素的首地址,即数组B = 数组A;
数组A的值赋给B,当B的值改变时,A的值也会改变,因为它们指向同一个地址。
将数组作为输入参数不需要返回值,因为其输入的为地址,改动后可直接在main方法中调用
数组复制System.arraycopy(数组名1,0,数组名2,0,数组长度)
多维数组
Java中把二维数组看作数组的数组
如int A [] [];
A[]中的每一个元素也为数组A[]
初始化
如:a[0][0]=1;
a[0][1]=2;
…
类和对象
创建子类 class students extends person
一个源文件可以有多个类 但只能有一个public的类 如果类被声明为public,则文件名必须和类名保持一致
类的名称
类的属性(可省略)可包括可见性、属性名称、类型、默认值和约束特性
可见性 属性名 : 类型 =默认值(各项均可省略)
如: private color : String
可见性
常见 范围
public 所有其他类可以访问
private 只能被该成员所在类访问
protected 同一个包与继承关系的类可见
默认 同一个包(文件夹)中可见
默认的访问范围只与包有关,与继承无关
get方法
set方法(把输入值赋给变量使得get可以直接读取)
没有set只有get就是只读不写,反之则为只写不读,视情况使用
自定义类下属于复合数据类型(引用类型),也可作为参数,将实际参数值赋给形式参数,指向同一地址
即数据类型不只有String int等,类名也可作为数据类型
内部类可以访问它外部类的成员,反之则不行
UML
‘+’ public
‘-’ private
‘#’ protected
“无” 默认
编程之前画UML类图明确思路
下划线 静态成员
空心菱形 聚合关系(整体与部分)
实心菱形 组成关系(整体依赖部分)
类的操作(只能作用到该类的对象上,可省略)
可见性 返回值类型 操作名(参数表)
如: public Car(String,String){
赋值语句
}
public String getColor()
定义类
[修饰符] class 类名{
属性
方法
}
对象
创建对象
类名 对象名 = new 类名([参数列表]);
new关键字创建的对象在堆内存中开辟空间,对象名在栈空间中,是引用句柄,指向堆内存中相应位置
匿名对象
不定义句柄直接调用方法
如:new Car().getColor();
构造方法(Constructor)
初始化成员变量
如Scanner sc =new Scanner(System.in);
中的Scanner(System.in)就是构造方法
构造方法与类名相同,没有返回值,方法内部不允许有return语句
方法重载
方法名相同但参数不同,编译器根据参数情况判断用哪个
只要定义有参数的构造方法,都需要再定义一个无参数的构造方法
方法体中常常会出现形如Color = ColorIn形式
等号左边为成员变量,右边为形式参数
this关键字
1.表示类的成员(成员变量或成员方法)
如:this.Color = Color;
2.调用构造方法
this(参数列表);
例如参数列表为一个参数,就自动调用有一个参数的方法,注意没有.
3.表示当前对象
谁调用这个方法谁就是当前对象
比如println(this)在一个方法里,当使用A.这个方法的时候,就会输出A
封装
将对象信息隐蔽在对象内部,禁止外部程序直接访问对象内部属性和部分方法
外部通过接口(类的public方法)访问
例如private属性就只能通过公开的get/set方法访问
具有相似功能的类用打包语句放到一个包中
package 包名;
其下的类会放到这个包中,即生成的类文件(.class)都放在工作目录文件夹中,类名变成包名.类名
外部访问需要用完整名称
javac -d.类名.Java
指定编译生成的class文件存放的目录
通过import导入相应包就可以直接用类名访问
常用包见书P115
继承
UML中用三角形箭头表示
一个类只允许有一个父类(多重继承通过接口实现)
class SubClass extends SuperClass{
}
super调用父类的构造方法
如子类构造方法比父类构造方法多一个属性,父类构造方法有两个参数,那么在子类的构造方法中添加super(参数1,参数2);为共有属性赋值
子类对成员的修改不会影响父类,父类的修改会影响子类
父类中被private修饰的属性和方法子类不能直接访问,protected可以但是封装性弱,最好设置get set方法。父类的构造方法子类也不能直接使用,可以用super调用
注意通过super调用父类的构造方法的只能是子类的构造方法,super语句必须位于第一行
方法重写是相同返回类型相同方法名相同参数数量,通过对象进行区分,即两个类分别创建对象,在通过对象调用同名同参数数量同返回类型不同功能方法(与重载区分)
如果父类中的成员被修饰为private那么子类即使用super也不能访问,但可以用super访问父类中公开的方法,若该方法中打印或调用了相应成员,则子类便通过这种方式成功打印或调用该成员
子类构造方法中不通过在super调用会默认调用一个父类无参数的构造方法,因此写父类时应增加一个无参数的构造方法,否则会编译出错
this访问本类的属性和方法,若找不到会从父类中继续查找
抽象类中方法没有具体实现,但强制其子类必须实现该方法,用abstract修饰
抽象类:public abstract class
抽象方法:abstract public String getStatus();
不用写方法体
注意抽象方法不能创建对象,即不能用new语句创建
父类的任何子类对象都是一种父类对象,可以作为参数传递给希望接收父类对象的方法
接口
public interface 接口名{
常量;
抽象方法;
}
接口是抽象方法和常量值的集合(可以没有常量值)
只有定义而没有实现
接口中的变量默认是public static final(不用特别标明)
接口里的方法就是返回类型+方法名(参数列表);
可以有多个抽象方法
接口 extends 接口
类 implements 接口 实现所有方法
抽象类 implements 接口 实现部分方法
即如果一个类继承了一个接口,但没有实现其中全部的抽象方法,那么这个类就必须是一个抽象类
类实现接口在UML中用虚线箭头表示
extends一定放在implements之前,即先继承父类再继承接口
final修饰的类不能被继承
final修饰的方法不能被重写
Object类是所有类的父类,其方法适用于所有类
toString方法返回字符串类型,如果参数列表形如(st) st是一个Object类的对象,那么默认先调用st的toString方法
一般都会重写toString方法,未重写的toString方法返回值难以理解
equals方法在Object类中只能判断两个引用是否指向同一个对象,要想判断是否逻辑等价需要重写该方法
横向关系
1.依赖
UML中用指向被依赖事物的虚线表示
如person指向pen(人使用笔)
体现在某个类的方法用另一个类作为引用类型的参数
2.关联
UML中用实线表示
一个类的对象作为另一个类的成员变量
如雇员作为公司的属性
(1)聚合
UML中用空心菱形与实线表示
如学生与学校的关系,学校是整体,学生是部分,但两者均可独立存在
(2)组合
UML中用实心菱形与实线表示
部分的生命周期不会超出组合的生命周期
如菜单和窗口的关系,只有在窗口创建 之后才能创建菜单,菜单必须在窗口销毁之前销毁
多态
父类句柄引用子类对象
例如A是B的父类,那么就可以
A 对象名 = new B();
父类可以引用子类对象,但不能引用子类中有而父类中没有的方法