Kaze
Kaze
Published on 2022-03-06 / 48 Visits
0
0

MOOC java

输出

打印并换行

System.out.println("");

输入

Scanner in = new Scanner(System.in);
int a = in.nextint();

System.in 是标准输入流InputStream的一个实例

next()是遇到空格、回车、Tab结束所以不能得到带空格的字符串,而nextLine()是遇到回车才结束,所以可以得到带空格的字符串。

在输入一个int类型的数字之后,如果后边采用nextLine的话,最后打印结果发现会少一个字符,原因是在你使用nextInt的时候后边有一个换行符,没有接收,前边的int变量只是接受了你输入的数值,所以在你继续输入nextLine之后,会读取还未读取的换行,所以会导致后边的结果有一列为空,所以此时你需要多输入一个nextLine把未接收的换行符接收到

命名规范

变量名和方法名用小驼峰命名法

比如:myName

类名用大驼峰命名法

比如:MyName

目录结构

src/main/java 该文件夹下的代码为源代码

包路径是相对路径(一般相对于src/main/java)

包相当于文件夹,是java的文件管理系统

包名不能以Java开头,会报错

代码注释

块注释

/**
 *这是注释
 *这也是注释
 */

行注释

// 这是注释

字符串

初始化

String userName = new String("joe");
String str = "My Code";

Java的字符串是一种特殊的“不可变”对象,所有的字符串操作都是产生一个新的字符串,而不是对原来的字符串的修改。

对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同

  • “==”比较两个变量本身的值,即两个对象在内存中的首地址

    java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各个属性。

  • “equals()”比较字符串中所包含的内容是否相同

    equals()方法继承自object,默认等同于“==”,都是判断两个对象的地址是否相等,因为String类对equals方法进行了重写,所以只要字符串内容一样,就是相等的。

java基本数据类型

img

方法

方法就是一种行为或动作

调用方法

setLabel(String label)  // 标签
setPlaceholder(String placeholder) // 提示文字
setValue(String value) // 默认内容
用法:变量名.setLabel("");

数组

数组定义

int[] 变量名 = new int[数组大小]; // 数组大小必须给出,可以是变量,数组元素默认都是0
int[] a;
a = new int[]{num1, num2, num3}; 
int[] 变量名 = {num1, num2, num3};

每个数组有一个内部成员length,会告诉你它的元素的数量。用法:数组名.length

与c语言中的数组不同,Java中的数组可以互相赋值(但是数组的本质依然是指针)

FOR-EACH循环

for (int k : 数组名)  {
	// 对数组中的每一项进行操作
}

循环的每一轮将数组中的元素的值赋给k,遍历完后结束循环

对数组遍历时FOR-EACH循环比较方便

FOR-EACH循环也可以对容器类使用

static

static变量

声明为static的变量实质上就是全局变量。当实例化一个对象时,并不产生static变量的拷贝,而是该类所有的实例共用同一个static变量。

static方法

声明为static的方法有以下几条限制

  • 它们仅能调用其他的static 方法,不能调用实例方法。
  • 它们只能访问static变量,不能访问实例变量。

打个比方:人是一个java类,手是类的实例方法,而人身上有手机,这个手机就是静态方法;人只会用手去玩手机,你见过人用手机玩手么?

static方法不能以任何方式引用this或super

this指当前对象,super指父类对象,静态的不能访问实例的,所以static方法不能以任何方式引用this或super

如果你需要通过计算来初始化你的static变量,你可以声明一个static代码块,static代码块仅在该类被加载时执行一次。

java访问修饰符

作用域当前类同一package子孙类其他package
public
protected×
friendly××
private×××

不写时默认为friendly

一个编译单元或Java类文件(房子)只能有一个public的类(相当于房子的主人),其他在这个文件里的类相当于住在这个房子的客人,public的类的名字和这个文件的名字必须一致。或者直接没有public的类(没有主人)

继承

向上造型

子类的对象可以被看作是父类的对象,可以拿一个子类的对象当作父类的对象来用。比如鸡是从鸟派生出来的,因此任何一只鸡都可以被称作是一只鸟。Java类的继承只允许单继承,即一个类只能有一个父类,但是接口可以多继承

image-20220325002443501

构造方法

构造方法是每个类所独有的,因为构造方法的名字就是类的名字,所以子类不会继承父类的构造方法。

在构造一个子类的对象时,父类的构造方法也是会被调用的,而且父类的构造方法在子类的构造方法之前被调用。在程序运行过程中,子类对象的一部分空间存放的是父类对象。因为子类从父类得到继承,在子类对象初始化过程中可能会使用到父类的成员。所以父类的空间正是要先被初始化的,然后子类的空间才得到初始化

super()可以调用父类的构造函数,如果没有super()或者有super()但()里无参数就会在父类中寻找无参数的构造函数

super()只能有一个,并且只能在子类构造方法的第一行,不然会报错。

可以通过super()用父类的构造函数来修改从父类继承来的变量

多态变量

一个变量可以保存其所声明的类型或该类型的任何子类型。Java中保存对象类型的变量是多态变量

谁是谁的父类合适?

父类应该是更为简单的、基本的、属性和操作更少的,子类则在继承后再增加新的属性和操作。从java语言本身的角度更方便理解这个事情:class B extends A :类B“扩展”了类A。扩展,就意味着增加了更多的属性和方法。

绑定

当调用一个方法时,究竟应该调用哪个方法,这件事情叫做绑定。绑定表明了调用一个方法的时候,我们使用的是哪个方法。绑定有两种:一种是早绑定,又称静态绑定,这种绑定在编译的时候就确定了;另一种是晚绑定,即动态绑定。动态绑定在运行的时候根据变量当时实际所指的对象的类型动态决定调用的方法。Java缺省使用动态绑定。

子类和父类拥有相同变量和方法的情况

当子类中含有与父类相同的变量和方法(名字和参数均相同),那么子类中从父类继承过来的同名变量和方法会被隐藏起来(并没有消失),在子类中调用这些变量和方法时调用的是子类自己的。使用super.方法名 会调用父类的

设计思想

消除代码复制的两个基本手段,就是函数和父类。

设计原则

  1. 无代码复制

  2. 封装

  3. 可拓展性(框架加数据思想)

  4. 低耦合

    1. 实现业务逻辑的类认识所有要用到的类,而其他的类互不认识或几乎不认识,数据与表现分离

    2. 各个对象各司其职,不做多余的事

抽象类

我们用abstract关键字来定义抽象类。抽象类的作用仅仅是表达接口,而不是具体的实现细节。抽象类中可以存在抽象方法。抽象方法也是使用abstract关键字来修饰。抽象的方法是不完全的,它只是一个方法签名而完全没有方法体。如果一个类有了一个抽象的方法,这个类就必须声明为抽象类。如果父类是抽象类,那么子类必须重写所有在父类中的抽象方法,否则子类也成为一个抽象类。

抽象类里面可以有非抽象方法 ,但接口(纯抽象类)里只能有抽象方法。

抽象类可以继承抽象类、普通类,但不可以继承接口。

抽象类不能直接用new实例化,只能通过继承被间接实例化,抽象类可以定义变量,任何继承了抽象类的非抽象类的对象都可以交给这个变量来管理。

接口

接口是纯抽象类,所有的成员函数都是抽象函数,所有的成员变量都是public static final。

类用extends,接口用implements。

类可以实现很多接口(单继承多实现),接口可以继承接口(多继承)但不能继承类,接口不能实现接口

内部类

内部类就是指一个类定义在另一个类的内部,从而成为外部类的一个成员。因此一个类中可以有成员变量、方法,还可以有内部类。实际上Java的内部类可以被称为成员类,内部类实际上是它所在类的成员。所以内部类也就具有和成员变量、成员方法相同的性质。比如,成员方法可以访问私有变量,那么成员类也可以访问私有变量了。也就是说,成员类中的成员方法都可以访问成员类所在类的私有变量。内部类最重要的特点就是能够访问外部类的所有成员。内部类有两种,一种是定义在类内部的类,一种是定义在函数中的类。定义在函数中的类只能访问函数的final变量,不能访问函数内的其他本地变量。

匿名类

image-20211119172134226

重载和重写

重载发生在一个类中,同名的方法如果有不同的参数列表则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的方法名和参数列表,有兼容的返回类型。

IO

文件读

BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream("D:\\Documents\\test\\loginput\\log.txt")));
        String line = reader.readLine();
        while (line != null && !line.isEmpty()) {
            System.out.println(line);
            line = reader.readLine();
        }
        reader.close();

文件写

PrintWriter writer = new PrintWriter(
                new OutputStreamWriter(
                        new FileOutputStream("D:\\Documents\\test\\loginput\\log.txt", true)), true);
        writer.println("https://www.bilibili.com");
        writer.close();

Comment