JavaSEDemo09

谁践踏了优雅 2021-09-25 06:22 372阅读 0赞

文章目录

  • 简介
  • 练习题目:统计字符串中不同字符的个数
    • 代码示例
    • 程序运行结果
  • final关键字
    • final关键字修饰变量
    • 常量声明时关于初始化的要求
    • final修饰方法
    • final修饰类
  • static关键字
    • 静态变量及其特点
    • 静态方法及其特点
    • 静态方法与非静态方法的互相调用
    • 静态导入
  • 包装类
    • 装箱和拆箱
  • 包装类
  • 装箱和拆箱
    • byte范围内自动装箱的情况
    • byte范围外自动装箱的情况
  • 内部类
    • 成员内部类
      • 创建成员内部类对象
    • 局部内部类
    • 静态内部类
    • 匿名内部类

简介

  • 本文是2021/03/31整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进

练习题目:统计字符串中不同字符的个数

  • 定义一个方法,含有字符串参数,分别统计字符串中字母,数字,特殊符号的个数,并打印

代码示例

  1. import java.util.Scanner;
  2. public class Test {
  3. public static void main(String[] args) {
  4. //创建Scanner类对象
  5. Scanner scanner = new Scanner(System.in);
  6. System.out.println("请输入一个字符串");
  7. String string = scanner.next();
  8. //调用自定义的方法
  9. method(string);
  10. }
  11. //定义静态方法,用于打印输出字符串中字母个数 数字个数 其它字符个数
  12. public static void method(String string){
  13. //定义字母个数 数字个数 其它字符个数
  14. int countLetter = 0;
  15. int countNumber = 0;
  16. int countOther = 0;
  17. //定义存储字母的数组 存储数字的数组 存储其他字符的数组
  18. char [] letter = new char[string.length()];
  19. char [] number = new char[string.length()];
  20. char [] other = new char[string.length()];
  21. //将字符串转换为字符数组
  22. char[] chars = string.toCharArray();
  23. //满足条件的则存储到相应的数组中,相应个数加1
  24. for (int i = 0; i < chars.length; i++) {
  25. if('A'<=chars[i] && chars[i]<='z'){
  26. letter[countLetter] = chars[i];
  27. countLetter++;
  28. }else if('0'<chars[i] && chars[i]<'9'){
  29. number[countNumber] = chars[i];
  30. countNumber++;
  31. }else {
  32. other[countOther] = chars[i];
  33. countOther++;
  34. }
  35. }
  36. //遍历打印字母数组 数字数组 其他字符数组的每个元素
  37. System.out.println("字母个数:"+countLetter);
  38. for (int i = 0; i < letter.length; i++) {
  39. System.out.print(letter[i]+" ");
  40. }
  41. System.out.println();
  42. System.out.println("数字个数:"+countNumber);
  43. for (int i = 0; i < number.length; i++) {
  44. System.out.print(number[i]+" ");
  45. }
  46. System.out.println();
  47. System.out.println("其他字符个数:"+countOther);
  48. for (int i = 0; i < other.length; i++) {
  49. System.out.print(other[i]+" ");
  50. }
  51. }
  52. }

程序运行结果

在这里插入图片描述

final关键字

final关键字修饰变量

  • final关键字修饰的变量是常量,不可以改变。
  • 语法:权限修饰符 final 数据类型 变量名称(需全部大写,单词间用下划线分开) = 值;
  • 例如: public final int STUDENT_NAME = “张三”;

常量声明时关于初始化的要求

  1. 直接在声明常量时初始化赋值。
    例如:public final int NAME = “张三”
  2. 可以先声明常量,然后在初始化代码块中赋值

    • 代码示例

    public class User{
    public final int AGE;
    //初始化代码块(只有一个大括号)
    {
    AGE = 20;
    }
    }

  3. 可以先声明静态常量,然后在静态代码块中赋值(不可在静态代码块中初始化非静态常量)

    • 代码示例

    public class Animal {
    //静态常量AGE

    1. public static final int AGE;
    2. //静态代码块
    3. static {
    4. AGE = 20;
    5. }

    }

  4. 构造方法中也可以对常量进行初始化赋值(静态常量不可)

    • 代码示例

    public class Animal {
    //非静态常量可以在构造方法中初始化赋值

    1. public final int AGE;
    2. public Animal() {
    3. AGE = 20;
    4. }

    }

final修饰方法

  • 语法:权限修饰符 final 返回值类型 方法名称(参数列表){ }
  • 不能和abstract一起使用
    final关键字意味着子类不能覆盖重写,abstract意味着父类的抽象方法,必须要由子类重写实现。二者矛盾。
  • 无法被子类重写

final修饰类

  • 语法:权限修饰符 final class 类名{ }
  • 无法被子类继承
  • 最常见的final类 String类

static关键字

静态变量及其特点

  • 语法:权限修饰符 static 变量名 = 值;
  • 特点:所有对象共享一个静态成员变量。
  • 类和对象都可以调用静态成员变量(推荐使用类调用)
    代码示例

    public class Animal {

    1. public static int age;

    }

    public class Test {

    1. public static void main(String[] args) {
    2. Animal animal1 = new Animal();
    3. Animal animal2 = new Animal();
    4. //修改animal1的年龄为3
    5. animal1.age = 3;
    6. System.out.println(animal1.age);
    7. System.out.println(animal2.age);
    8. }

    }

程序运行结果

  1. 3
  2. 3

静态方法及其特点

  • 语法:权限修饰符 static 返回值类型 方法名称(参数列表){ }
  • 对象和类都可以调用静态成员方法(推荐使用类)
  • 静态方法只能操作方法内声明的局部变量或静态成员变量
  • 静态方法不能操作非静态成员变量
  • 静态方法中不能使用this关键字(原因:静态方法不属于任何对象)

静态方法与非静态方法的互相调用

  1. 静态方法中不能直接调用非静态方法,会报错
    解决方案:在静态方法中创建一个本类对象,通过这个对象调用非静态方法
  2. 非静态方法可以随意调用静态方法

静态导入

  • 语法: import static 包名.类名.静态方法(或静态变量)
  • 也可以直接import static 包名.* 直接导入所有的静态方法和静态变量,这样做可读性很差
    代码示例

    import static java.lang.Math.PI;
    public class Test{
    public static void main(String[] args){
    //可以直接写PI
    System.out.println(PI);
    }
    }

程序运行结果

  1. 3.141592653589793

包装类

八大基本类型对应8个包装类,分别是:

  1. byte - Byte
  2. short - Short
  3. int - Integer
  4. long - Long
  5. float - Float
  6. double - Double
  7. char - Character
  8. boolean - Boolean

装箱和拆箱

  • 包装类

    • 不是对象的类型 八大基本类型
      int - Integer char -Character

装箱和拆箱

  • JDK1.5以后,可以实现自动装箱和自动拆箱
  • 自动装箱和自动拆箱使用的是常量池的数据
  • byte范围内(-128 ~ 127)会存储在常量池 超出范围就会new

byte范围内自动装箱的情况

  • 说明:byte范围内自动装箱,使用的是常量池中的数据,地址是一样的

    public class Test{

    1. public static void main(String[] args){
    2. //自动装箱
    3. Integer a1 = 10;
    4. Integer a2 = 10;
    5. //手动装箱
    6. Integer a3 = new Integer(10);
    7. Integer a4 = new Integer(10);
    8. //比较a1和a2 a3和a4的地址值
    9. System.out.println(a1 == a2);
    10. System.out.println(a3 == a4);
    11. }

    }

程序运行结果

  1. true
  2. false

byte范围外自动装箱的情况

  • 说明:byte范围外自动装箱,编译器只能new创建新的对象,所以地址不同。

    public class Test{

    1. public static void main(String[] args){
    2. //自动装箱
    3. Integer a1 = 1000;
    4. Integer a2 = 1000;
    5. //手动装箱
    6. Integer a3 = new Integer(1000);
    7. Integer a4 = new Integer(1000);
    8. //比较a1和a2 a3和a4的地址值
    9. System.out.println(a1 == a2);
    10. System.out.println(a3 == a4);
    11. }

    }

程序运行结果

  1. false
  2. false

内部类

  • 一共有4种内部类:成员内部类 局部内部类 静态内部类 匿名内部类

成员内部类

  • 内部类作为外部类的成员
  • 内部类可以直接访问外部类的成员变量
  • 注意:成员内部类中不能存在静态方法和静态变量
  • 必须先创建外部类,才能创建成员内部类

创建成员内部类对象

  1. 先创建外部类对象
  2. 外部类.内部类 内部类对象名称 = 外部类对象.new 内部类();
  3. 代码示例

    //外部类
    public class OuterClass{
    //外部类的成员变量
    private String name;
    private int age;
    //内部类
    public class InnerClass{
    //内部类构造方法
    public InnerClass(){
    name = “张三”;
    age = 20;
    }
    //内部类普通方法show
    public void show(){
    System.out.println(“姓名:”+name+” 年龄:”+age);
    }
    }
    }

    //测试类
    public class Test{
    public static void main(String[] args){
    //1.先创建外部类对象
    OuterClass outer = new OuterClass();
    //2.外部类.内部类声明引用
    //3.通过外部类对象.new方法 创建内部类对象
    OuterClass.InnerClass inner = outer.new InnerClass();
    //4.内部类对象调用内部类普通方法
    inner.show();
    }
    }

  4. 程序运行结果

    姓名:张三 年龄:20

局部内部类

  • 局部内部类是定义在方法中的类
  • 局部内部类只能在该方法和作用域中被使用
  • 局部内部类可以直接操作外部类的成员变量,但是对于方法的临时变量(包括方法的
    参数,要求是final常量才能操作)
  • 对于方法参数,无论加不加final关键字,都不能修改数值

静态内部类

  • 静态内部类与非静态内部类之间存在一个最大的区别,非静态内部类在编译完成之后
    会隐含地保存着一个引用,该引用是指向创建它的外部类,但是静态内部类却没有。
    没有这个引用就意味着:
    (1)它的创建是不需要依赖于外部类的
    (2)它不能使用任何外部类的非static成员变量和方法
    (3)和成员内部类不同,static内部类能够声明static的成员
  • 创建静态内部类对象代码示例

    public class OuterClass {

    1. private String sex;
    2. private static String name = "张三";
    3. //静态内部类
    4. static class InnerClass{
    5. public static String staticName = "李四";
    6. public void show(){
    7. System.out.println("Outerclass.name = " + name);
    8. }
    9. }
    10. public void show(){
    11. System.out.println(InnerClass.staticName);
    12. //创建内部类对象,调用它的方法
    13. new InnerClass().show();
    14. }

    }

    public class OuterClassTest {

    1. public static void main(String[] args) {
    2. //创建外部类对象
    3. OuterClass outerClass = new OuterClass();
    4. outerClass.show();
    5. }

    }

  • 程序运行结果

    李四
    Outerclass.name = 张三

匿名内部类

  • 没有名字的内部类就是匿名内部类
  • 使用条件:匿名内部类必须继承一个父类或者实现一个接口
  • 创建匿名内部类的格式:
  • [ 访问权限 ] [ 修饰符 ]父类名/接口名 引用名 = new 父类名/接口名([父类构造方法参
    数列表]){
    匿名内部类成员;
  • 匿名内部类没有构造方法
  • 创建匿名内部类代码示例

    public class OuterClass {
    private String name = “张三”;
    private int age = 20;
    A a = new A(){

    1. public void show(){
    2. System.out.println("name:"+name+" age:"+age);
    3. }

    }
    }
    interface A{

    1. int ma();

    }

    class Test{
    public static void main(String[] args) {

    1. //创建外部类对象
    2. AnnoymousInnerClass annoymousInnerClass = new AnnoymousInnerClass();
    3. //通过外部类对象调用成员a,然后调用show方法
    4. annoymousInnerClass.a.show();
    5. }

    }

程序运行结果

  1. name:张三 age: 20

发表评论

表情:
评论列表 (有 0 条评论,372人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaSEDemo06

    文章目录 简介 显示继承与隐式继承 继承的重点 继承与构造方法 继承的优点和缺点 final关键字 多重继承时构造方法的执行情况

    相关 JavaSEDemo05

    文章目录 简介 void方法中return语句的使用规范 可变API与不可变API 数据交换与方法传参 为什么不能用返回值类型来判断方法是否