Java编程基础篇

计算机、程序和Java概述

计算机组成

  • 中央处理器(cpu)
  • 内存(主存)
  • 存储设备
  • 输入设备
  • 输出设备
  • 通信设备
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

基本程序设计

标识符

标识符必须遵循一下规则:

  • 标识符是由字母,数字,下划线(_)和美元符号($)构成的字符序列
  • 标识符必须以字母,下划线和美元符号开头,不能以数字作为开头
  • 标识符不能是保留字
  • 表示符不能是 true,false 和 null
  • 标识符的长度可以为任意

数值数据类型

类型名名称范围存储大小
byte-27(-128) ~ 27-1(127)8位带符号数
short-215(-32 768) ~ 215-1(32 767)16位带符号数
int-231(-2 147 483 648) ~ 231-1(2 147 483 647)32位带符号数
long-263(-9 223 372 036 854 775 808) ~ 263-1(9 223 372 036 854 775 807)64位带符号数
float负数范围:-3.4028235E+38 ~ -1.4E-45
正数范围: 1.4E-45 ~ 3.4028235E+38
32位,标准IEEE745
double负数范围:-1.7976931348623157E+308 ~ -4.9E-324
正数范围: 4.9E-324 ~ 1.7976931348623157E+308
64位,标准IEEE745

格式化控制台输出

在这里插入图片描述
在这里插入图片描述

输出宽度最少为10,如果不够10位则在前面加对应的空格,如:
126.041631654
%.2f 取小数点后两位,126.04
目前长度为6,则在输出的126.04前添加4个空格

double number = 126.041631654
System.out.printf("This is number: %10.2f",number);

// 输出
This is number:     126.04
// 正数表示右对齐
System.out.printf("%10s%10s%10s%10s\n","name","sex","age","id_num");
// 负数表示左对齐
System.out.printf("%-10s%-10s%-10s%-10s","name","sex","age","id_num");

// 输出
      name       sex       age    id_num
name      sex       age       id_num 

输入输出重定向

  • Redirection .java
import java.util.Scanner;
public class Redirection {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int data = scanner.nextInt();

        int sum = 0;

        while (data != 0){
            sum += data;

            data = scanner.nextInt();
        }

        System.out.println("The sum is: " + sum);
    }
}

  • input.txt
1 2 3 4 5 6
7 8 9 10 0

输入重定向

javac Redirection.java
java Redirection < input.txt

# 输出
The sum is: 55

输出重定向

java Redirection > output.txt

# 将结果写入到output.txt中
The sum is: 55

输入输出重定向

java Redirection < input.txt > output.txt

# 读取input.txt中的内容,然后将结果写入到output.txt中
The sum is: 55

方法重载

  • 在同一个类中
  • 具有相同的方法名
  • 参数列表不同(类型,个数,顺序不同),与返回值无关

变量的范围

  • 局部变量

数组

声明数组变量

elementType[] arrayRefVar;

创建数组

arrayRefVar = new elementType[arraySize];

初始化数组

elementType[] arrayRefVar = {value0,value1,value2,.......,valueN};

可边长参数

typeName... parameterName

二维数组

int[][] matrix;
matrix = new int[5][5];

静态变量、常量和方法

静态变量被类中的所有对象共享,静态方法不能访问类中的实例成员

静态变量

静态变量将变量存储在一个公共的内存地址

限定字符串

String类型的对象是不可变得,如果两个直接字符量相同的话,他们都会指向同一个String类型的对象中,这个独特的对象称之为限定字符串对象

StringBuilder和StringBuffer

  • String与StringBuilder和StringBuffer的区别
    String是不可变的字符串,而StringBuilder和StringBuffer都是可边的字符串,相比String它们二者更加灵活

  • StringBuilder和StringBuffer的区别
    两者基本是一样的,除了StringBuffer中修改缓冲区的方法是同步的,这就意味着如果是并发访问的话,StirngBuffer可以同步防止程序崩溃

继承

super关键字

  1. 调用父类的构造方法(调用构造方法的时候,必须放在子类构造方法的第一行)
  2. 调用父类的方法

方法重写:需要在子类中使用和父类一样的签名,以及相同的返回值类型进行定义

静态方法:静态方法可以被继承,但是不能够被重写,如果子类中定义了相同的方法,那么父类的静态方法将会隐藏起来,可以使用superClassName.staticMethonName调用隐藏的静态方法

方法重载和重写

重载意味着使用同样的名字但是不同的签名来定义多个方法。
重写意味者在子类中提供一个对方法的新的实现。

多态

多态意味着父类的变量可以指向子类对象

动态绑定

访问修饰符

在这里插入图片描述

异常处理和文本I/O

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

File类

使用Try-with-resource自动关闭资源

try(需要打开的资源;) {操作}

// try-with-resource
        try(
        	PrintWriter printWriter = new PrintWriter(file);
        ) {
            printWriter.print("John T Smith ");
            printWriter.println(90);
            printWriter.print("Eric K Jones ");
            printWriter.println(85);
        }
        
// 上下等价
		PrintWriter printWriter = new PrintWriter(file);
		
		printWriter.print("John T Smith ");
		printWriter.println(90);
		printWriter.print("Eric K Jones ");
		printWriter.println(85);
		
		printWriter.close();

抽象类和接口

抽象类

抽象类不可用于创建对象。抽象类可以包含抽象方法,这些方法将在具体的子类中实现

  • 抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,在抽象类扩展的非抽象子类中,必须实现所有的抽象方法。还要注意到,抽象方法是非静态的
  • 抽象类是不能使用 new 操作符来初始化的。但是,仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用
  • 包含抽象方法的类必须是抽象的。但是,可以定义一个不包含抽象方法的抽象类。在这种情况下,不能使用 new 操作符创建该类的实例。这种类是用来定义新子类的基类的
  • 子类可以覆盖父类的方法并将它定义为 abstract。这是很少见的,但是它在当父类的方法实现在子类中变得无效时是很有用的。在这种情况下,子类必须定义为abstract
  • 即使子类的父类是具体的,这个子类也可以是抽象的。例如,Object 类是具体的,但是它的子类如 CeometricObject 可以是抽象的
  • 不能使用 new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型

接口

接口是一种与类相似的结构,只包含常量和抽象方法

  • 接口定义
修饰符 interface 接口名{
	/** 常量声明 */
	/** 方法签名 */
}
  • 接口的继承
    利用关键字 extends, 接口可以继承其他接口。这样的接口称为子接口(subinterface)。
public interface NewInterface extends Interface1,Interface2,...InterfaceN{}

接口与抽象类的比较

在这里插入图片描述

类的设计原则

  • 内聚性
    类应该描述一个单一的实体,而所有的类操作应该在逻辑上相互配合,支持一个一致的目的。例如:可以设计一个类用于学生,但不应该将学生与教职工组合在同一个类中,因为学生和教职工是不同的实体

  • 一致性
    遵循标准 Java 程序设计风格和命名习惯。为类、数据域和方法选取具有信息的名字。通常的风格是将数据声明置于构造方法之前,并且将构造方法置于方法之前

  • 封装性
    一个类应该使用 private 修饰符隐藏其数据,以免用户直接访问它。这使得类更易于维护

  • 清晰性
    为使设计清晰,内聚性、一致性和封装性都是很好的设计原则。除此之外,类应该有一个很清晰的合约,从而易于解释和理解

  • 完整性
    类是为许多不同用户的使用而设计的。为了能在一个广泛的应用中使用,一个类应该通过属性和方法提供多种方案以适应用户的不同需求

  • 实例和静态
    依赖于类的具体实例的变量或方法必须是一个实例变量或方法。如果一个变量被类的所有实例所共享,那就应该将它声明为静态的

  • 继承与聚合
    继承和聚合之间的差异,就是 is-a (是一种)和 has-a (具有)之间的关系

  • 接口和抽象类
    接口比抽象类更加灵活,因为一个子类只能继承一个父类,但是却可以实现任意个数的
    接口

小结

  1. 抽象类和常规类一样,都有数据和方法,但是不能用 new 操作符创建抽象类的实例
  2. 非 抽 象 类 中 不 能 包 含 抽 象 方 法。如果抽象类的子类没有实现所有被继承的父类抽象方法,就必须将该子类也定义为抽象类
  3. 包含抽象方法的类必须是抽象类。但是,抽象类可以不包含抽象的方法
  4. 即使父类是具体的,子类也可以是抽象的
  5. 接口是一种与类相似的结构,只包含常量和抽象方法。接口在许多方面与抽象类很相近,但抽象类除了包含常量和抽象方法外,还可以包含变量和具体方法
  6. 在 Java中,接口被认为是一种特殊的类。就像常规类一样,每个接口都被编译为独立的字节码文件
  7. 接口 java.lang.Comparable 定义了 compareTo 方法。Java 类库中的许多类都实现了 Comparable
  8. 接口 java.lang.Cloneable 是一个标记接口。实现 Cloneable 接口的类的对象是可克隆的
  9. 个类仅能继承一个父类,但一个类却可以实现一个或多个接口
  10. — 个接口可以继承一个或多个接口

内部类

内部类,或者称为嵌套类,是一个定义在另外一个类范围中的类。内部类对于定义处理器类非常有用

内部类特征

  • — 个内部类被编译成一个名为 OuterClassName$InnerClassName 的类
  • 一个内部类可以引用定义在它所在的外部类中的数据和方法。所以,你没有必要将外部类对象的引用传递给内部类的构造方法。基于这个原因,内部类可以使得程序更加精简
  • 一个内部类可以使用可见性修饰符所定义,和应用于一个类中成员的可见性规则一样
  • 一个内部类可以被定义为 static。一个 static 的内部类可以使用外部类的名字所访问。一个 static 的内部类不能访问外部类中非静态的成员
  • 内部类对象通常在外部类中所创建。但是你也可以从另外一个类中来创建一个内部类的对象。如果内部类是非静态的,你必须先创建一个外部类的实例,然后使用以下语法来创建一个内部类的对象:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();

ControlCircle controlCircle = new ControlCircle();
ControlCircle.CirclePane circlePane = controlCircle.new CirclePane();
  • 如果内部类是静态的,使用以下语法来创建一个内部类对象:
OuterClass.InnerClass innerObject = new OuterClass.InnerClass();

匿名内部类

一个匿名内部类是一个没有名字的内部类。他将一步实现定义一个内部类以及创建一个内部类的实例

new SuperClassName/InterfaceNameO { 
// Implement or override methods in superclass or interface

// Other methods if necessary
}

匿名内部类的特征

  • — 个匿名内部类必须总是从一个父类继承或者实现一个接口,但是它不能有显式的extends 或者 implements 子句
  • 一个匿名内部类必须实现父类或者接口中的所有抽象方法
  • — 个匿名内部类总是使用它父类的无参构造方法来创建一个实例。如果一个匿名内
    部类实现一个接口,构造方法是 Object()
  • 一个匿名内部类被编译成一个名为 OuterClassNameSn.class 的类。例如,如果外部类 Test 有两个匿名的内部类,它们将被编译成 Test$1.class 和 Test$2.class

二进制I/O

二进制I/O类(字节流)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

FileInputStream & FileOutputStream

FilelnputStream 类和 Fi1eOutputStream 类用于从/向文件读取/写人字节。它们的所有方法都是从I叩utStream 类和 OutputStream 类继承的

  • FileInputStream构造方法
    在这里插入图片描述
  • FileOutputStream构造方法在这里插入图片描述

DataInputStream & DataOutputStream

DatalnputStream 从数据流读取字节,并且将它们转换为合适的基本类型值或字符串。DataOutputStream 将基本类型的值或字符串转换为字节,并且将字节输出到数据流。

  • DataInputStream
    在这里插入图片描述
  • DataOutputStream
    在这里插入图片描述

BufferedInputStream & BufferedOutputStream

BufferedlnputStream 类和 BufferedOutputStream 类可以通过减少磁盘读写次数来提髙输人和输出的速度。使用 Bufferdl叩utStream 时,磁盘上的整块数据一次性地读入到内存中的缓冲区中。然后从缓冲区中将个别的数据传递到程序中

  • BufferedInputStream构造方法
    在这里插入图片描述
  • BufferedOutputStream构造方法
    在这里插入图片描述

ObjectInputStream & ObjectOutputStream

ObjectlnputStream 类和 ObjectOutputStream 类除了可以实现基本数据类型与字符串的输人和输出之外,还可以实现对象的输人和输出

  • ObjectInputStream
    在这里插入图片描述

  • ObjectOutputStream
    在这里插入图片描述

随机访问文件

Java 提供了 RandomAccessFile 类,允许在文件的任意位置上进行读写。使用 RandomAccessFile 类打开的文件称为随机访问文件

在这里插入图片描述
注:当创建一个 RandomAccessFile 时,可以指定两种模式( “r”或"rw") 之一。模式"r"表
明这个数据流是只读的,模式"rw"表明这个数据流既允许读也允许写

RandomAccessFile raf = new RandomAccessFi1e("test.dat", "rw"):

递归

递归方法就是直接或间接调用自身的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值