java基础11_17(继承&array&)

一、继承
  1. 什么是继承

    一个类从另一个类派生而来就是继承。另外,具有继承关系的类分为父类(超类)和子类。子类可拥有负累非私有的成员。

  2. 继承的实现

    子类通过使用extends关键字来继承父类。

  3. 继承的特点

    (1)父类非私有的属性会被子类所拥有,非私有方法也会被子类所拥有。

    (2)在子类中有一个名为super的变量,它是对父类对象的引用,父类的对象由jvm创建且先与子类对象的创建

    (3)通过super关键字,可以调用父类的构造方法,它是对父类对象的引用,父类的对象由jvm创建且优先于对子类对象的创建。

    (4)如果子类有带参的构造方法,要求父类有无参的构造方法,或者父类有带参的构造方法或者父亲有带参的构造并在子类的构造中调用父类的构造方法(1、区分了无参有参;2、子类有参,调用父类的构造方法)。

    原因:子类的对象被初始化前必须保证父类的对象能够被正确的初始化。(jvm规定的)

    在main方法里创建子类对象时,调用了父类的无参构造(默认的隐式的),父类构造了有参构造(此时父类没有无参构造了),报错:1.父类加显式的无参构造。2。对象里用super.显式调用。

    (5)如果子类与父类都有同名的成员变量时,操作成员时一定要正确的区分到底是父类还是子类的变量(super关键字的用处)

  4. 方法的重写(建议加上注解 @Override-表面下方方法重写

    这是多态的一种表示形式,也就是子类拥有父类同名且同参数的方法。从自然属性来理解就是子类与父类具有相同的行为,但是行为的具体表现是不同的。

    方法重写的语法要求:方法名相同、参数相同、返回类型不要求

    强调:在子类的重写方法加上注解 @Override,以保证子类的方法一定是重写的方法,否则编译器报错。

  5. extends 是复数形式,但是java并不允许多重继承,子类一次只能继承一个父类而不能同时继承多个父类。(c++允许多重继承)(原因:多重继承可能会产生子类的混乱。——例如“有一个子类继承了两个父类相同的方法”,如何判断?)

  6. 继承的最大好处:在于代码的复用、把以一类中已有的功能在本类中使用。 增加了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在 缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大段的代码需要重构。

  7. 继承的局限性:一个类如果已经继承了另一个,它将不能够继承其他的类。(解决方法:组合),出现这种问题,在类中要考虑使用的方式来复用另一个类的功能

    推荐书:(think in java,)(组合优于继承)

二、static关键字
  1. static可以用在属性,方法,内部类,以及定义静态代码块。

  2. 被static修饰的方法是静态方法,静态方法属于类不属于对象,因此静态方法只能使用静态成员变量及常量,不能使用费静态的成员变量及常量。

  3. 被static修饰的属性是静态属性,也称为静态变量,就静态变量具有共享性,静态变量属于类不属于任何对象,所有对象在静态变量上是共有的。

  4. 基于以上两点,静态变量都应该通过类名来使用,不建议通过对象来使用。

  5. 静态代码块就是被static修饰的一块代码,语法:

    static {语句块}
    执行时机:当类被初始化时执行。
    作业:用来对静态变量进行初始化。
    结论:静态变量的初始化早于非静态变量的初始化,原因在于任何对象的构造方法的执行时机都晚于本类被初始化的时机。
    
三、Arrays数组工具类

java.util 工具包中的类,该类包含用于操作数组的各种方法(如排序和搜索)。 该类还包含一个静态工厂,可以将数组视为列表

  1. 排序 sort()

    public static void sort(byte[] a)
    参数是数组,对传入的数组排序
    
  2. 搜索 binarySearch()

  3. 复制数组 copyOf()

    public static short[] copyOf(short[] original, int newLength)
    
  4. 数组转换为集合 alist()

四、Math类

java.long(java语言包,最基础的包,Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。)

本类中的所有方法都是静态方法,以方便调用.

五、抽象类
  1. 什么是抽象类

    如果一个类被abstract关键字修饰,该类就是抽象类。abstract称为抽象关键字,可用来修饰类和方法。

    如果抽象类中没有抽象方法,此种设计意义不大。

  2. 抽象类的主要作业

    (1)抽象类不能被实例化,但是在抽象类中可能会有静态方法,那么静态方法可以直接调用。

    (2)抽象类一般作为超类使用,由子类去继承,子类就可以实现抽象类的抽象方法。

    (3)如果子类也不实现父类抽象方法,那么子类必须定义为抽象类

    (4)抽象类中的抽象方法不能是私有类,否则无法实现。

  3. 什么时候需要使用(定义)抽象类

    如果需要定义的多个类或者一个类他们有共同的行为,但是不同的个体在同一行为上有不同的实现,此时可以创建这些超类,把超类中具有但又无法具体实现的方法作为抽象方法。由子类去实现,因此抽象类应该与子类属于同一类事务。

  4. 在程序中,抽象类也可以作为对象的类型。(前提是对象的真实类型是抽象类的子类。这称为向上转型,属于多态的一种典型的应用。)

    【如果对象被向上转型,子类中的方法将不可使用,除非父类中有相同的方法,如果存在方法的重写,调用的是子类的方法。

    如果使用父子类同名的属性,此时使用的是父类的属性。程序有两种状态,一种是编译态,一种是运行态,

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6OhKGFr-1637218485436)(C:\Users\Allen\AppData\Roaming\Typora\typora-user-images\image-20211117153741480.png)]

  5. 5

其他:

java——Scanner中nextLine()方法和next()方法的区别

next()方法读取到空白符就结束l;

nextLine()读取到回车结束也就是“\r”;

所以没还顺序前测试的时候next()再检测的空格的时候就结束输出了。

 Scanner input = new Scanner(System.in);
 System.out.println("请输入字符串(nextLine):");
 String str1 = input.nextLine();
 System.out.println(str1);
 System.out.println("请输入字符串(next):");
 String str = input.next();
 System.out.println(str);
nextLine与next都有空格:
这时的结果发现next只输出空格前的字符串

当我们调换nextLine与next两者的顺序

发现:还没有输入nextLine的字符串,它已经停掉了,

原因:Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是 空白符;比如空格,回车,tab 等等。

修改顺序后遇到的问题就是因为next()读取到空白符前的数据时结束了,然后把回车“\r”留给了nextLine();所以上面nextLine()没有输出,不输出不代表没数据,是接到了空(回车“/r”)的数据。


数组的indexof=-1

-1代表未匹配到元素 ,可以用来数组去重

判断一个字符串是否包含在另一个字符串中的时候,使用indexOf非常有用。

indexOf() 方法有以下四种形式:(

  • public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。

fromIndex – 开始搜索的索引位置,第一个字符是 0 ,第二个是 1 ,以此类推)


package test.zy_7;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Random;
//生成一个随机100内小数,转换为保留两位小数的字符串,不考虑四舍五入的问题。
public class T5 {
    public static void main(String[] args) {
        Random random= new Random();
        double num=random.nextDouble()*100;
        System.out.println("随机数为"+"\n"+num);
//方法1
        System.out.println("转换后为:"+"\n"+String.format("%.2f", num)); //String.format("%.2f", num)保留两个小数
//方法2         #.00 表示两位小数
         DecimalFormat df = new DecimalFormat("#0.00");
         System.out.println("转换后(2):"+df.format(num));
// 方法3        BigDecimal银行业务用的函数类
        BigDecimal bg = new BigDecimal(num);
        double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println("转换后(3):"+f1);
//方法4
        NumberFormat nf = NumberFormat.getNumberInstance();
        //digits 显示的数字位数 为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的
        nf.setMaximumFractionDigits(2);
        System.out.println("转换后(4):"+nf.format(num));



        // Math.ceil(2);     //直接向上取整数
            /*        Math.floor()  通过该函数计算后的返回值是舍去小数点后的数值
            如:Math.floor(3.2)返回3
            Math.floor(3.9)返回3
            Math.floor(3.0)返回3

            Math.ceil()
            ceil函数只要小数点非0,将返回整数部分+1
            如:Math.ceil(3.2)返回4
            Math.ceil(3.9)返回4
            Math.ceil(3.0)返回3*/

 /*       DecimalFormat df = new DecimalFormat("#0.00");
        System.out.println(df.format(num));*/





    }
}

Arraylist 的 E remove(int index)

​ 删除该列表中指定位置的元素(可选操作)。 将任何后续元素移动到左侧(从其索引中减去一个元素)。 返回从列表中删除的元素。

错误用法:for循环中使用remove(int index),列表从前往后遍历

(循环里使用会导致异常:原因是循环体内删除了索引为5的值,后面又要调用被删的5的值,但是后序元素移动了。5为空。所以报错)

如果在for循环中调用了多次ArrayList.remove(),那代码执行结果是不准确的,因为每次每次调用remove函数,ArrayList列表都会改变数组长度,被移除元素后面的元素位置都会发生变化

应该:从后往前遍历

参考链接:https://blog.csdn.net/king0406/article/details/103789459

会出现的异常

UnsupportedOperationException -如果 remove操作不受此列表支持

IndexOutOfBoundsException - 如果索引超出范围( index < 0 || index >= size()


主要关系有没有抽象方法,能不能创建对象

类中有一个方法是抽象的,那么它的方法必须是抽象的

创建对象必须是具体的。所以抽象类不能被new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值