分享

Java基础

 python_lover 2021-05-23

☕java ['dʒɑvə]

基础

数据类型

类型自动提升与强制转型

在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,shortint计算,结果总是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. 方法名(参数);
方法重写

重写方法,需要在子类中使用父类一样的签名来对方法进行定义

  • 重写方法必须与被重写方法具有一样的签名 (方法名 和 参数列表),以及一样或者兼容返回类型

  • 仅当实例方法可访问时,才能被重写

  • 私有方法所处类本身以外是不能被访问的,不能被重写

    • 父类中私有方法在子类中被定义, 两者完全没有关系

  • 静态方法可以被继承,但不能被重写

    方法重写与重载

    重载: 使用同样的名字但不同的签名(方法名 和 参数列表)来定义多个方法

    重写: 在子类中提供对一个方法的新的实现

    • 方法重写

    • (把老的方法实现新的功能 )

    • (涵盖多种数据类型的同种方法)

    • 父类中的静态方法在子类中被重新定义,则父类中定义的静态方法被隐藏

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多