• 自学Java基础知识第十天


    day10

    1. 内部类(了解)

    1.1 内部类的介绍

    1. 将一个类定义在另外一个类的内部, 这个类称为内部类; 内部类可以定义在成员位置, 也可以定义在方法中, 根据内部类定义的位置不同, 因此分为成员内部类和局部内部类
    2. 为什么定义内部类:

       定义出一个Body身体类

       class Body{// 外部类  

          class Heart{// 内部类

    // 心脏 属性 : 颜色, 心跳, 血压  功能 : 跳动,供血, 于是认为将心脏定义成一个类, 表示心脏属性和功能

    }

    }

    1. 根据内部类定义位置不同:

      a : 成员内部类(成员内部类, 理解成一个成员变量在使用)

         普通成员内部类

         私有成员内部类

         静态成员内部类

      b: 局部内部类(定义在方法中的内部类)

         普通局部内部类

         匿名内部类(掌握)

         

    1.2 普通成员内部类

    1. 定义位置: 内部类定义在外部类的成员位置
    2. 格式:

       class Body{// 外部类

          class Heart{// 普通成员内部类

    // 属性, 方法功能

    }

    }

    1. 普通成员内部类的使用:

    1) 普通成员内部类可以直接使用外部类中的成员

    2) 在外部类中想要使用内部类中的成员内容, 需要创建出一个内部类对象, 内部类对象.调用内部类中的属性,功能

    3) 普通成员内部类, 想要在其他类型中直接使用内部类, 有公式创建出内部类对象:

       外部类.内部类  内部类名 = new 外部类对象().new 内部类对象();

    代码

    package com.ujiuye.inner;

    public class Body {// 外部类

    // blood 表示血压概念

    int blood = 120;

    class Heart{// Heart类理解成一个普通的成员变量

    int jump = 100;

    public void show() {

    // 1)普通成员内部类可以直接使用外部类中的成员

    System.out.println("血压" + blood + ",每分钟心跳为" + jump);

    }

    }

    // 定义出方法功能 : 使用内部类Heart

    public void useHeart() {

    System.out.println(blood);

    // 创建出一个内部类对象

    Heart h = new Heart();

    System.out.println(h.jump);

    h.show();

    }

    }

    package com.ujiuye.inner;

    public class TestInnerClass {

    public static void main(String[] args) {

    // 1. 测试普通成员内部类

    Body b = new Body();

    b.useHeart();

    System.out.println(b.blood);

        System.out.println("--------------------");

    // 在其他的类中, 获取出普通成员内部类对象

    // 外部类.内部类  内部类名 = new 外部类对象().new 内部类对象();

    Body.Heart  heart = new Body().new Heart();

    System.out.println(heart.jump);

    heart.show();

    }

    }

    1.3 私有成员内部类

    1. 定义位置: 内部类定义在外部类的成员位置,但是需要使用private关键字修饰内部类
    2. 格式 :

       class Body1{// 外部类

          private class Gan{// 私有成员内部类

              // 属性, 方法功能

    }

    }

    1. 私有成员内部类使用:

    1) 私有成员内部类可以直接使用外部类中的成员

    2) 私有成员内部类只能在外部类中创建出对外公共访问方式, 因为私有成员在其他类型中无法直接访问

    代码

    package com.ujiuye.inner;

    public class Body1 {// 外部类

    // 私有成员在本类中使用一切正常, 不能在其他类型中直接使用

    private int day = 1;

         public int getDay() {

    return day;

    }

    public void setDay(int day) {

    this.day = day;

    }

    // 定义出一个私有成员内部类

    private class Gan{// Gan理解成一个私有成员变量

    String color = "灰色";

    int drink = 10;

    public void show() {

    System.out.println(day + "," + drink + "斤白酒,你的肝颜色变成:" + color);

    }

    }

    // 定义出一个功能 : 提供私有成员内部类Gan对外公共访问方式

    public void useGan() {

    // 1. 创建出一个私有成员内部类对象

    Gan gan = new Gan();

    System.out.println(gan.color + "---" + gan.drink);

    gan.show();

    }

    }

    package com.ujiuye.inner;

    public class TestInnerClass {

    public static void main(String[] args) {

    // 2. 测试私有成员内部类

    Body1 b1 = new Body1();

    b1.useGan();

    }

    }

    1.4 静态成员内部类

    1. 定义位置: 内部类定义在外部类的成员位置,但是需要使用static关键字修饰内部类
    2. 格式:

      class Body2{ // 外部类

         static class Shen{// 静态成员内部类

              // 属性, 方法

    }

    }

    1. 静态成员内部类使用:

    1) 静态成员内部类中,可以直接使用外部类中的静态成员, 但是外部类中的非静态成员, 需要先创建出外部类对象, 使用外部类对象.调用

    2) 静态成员内部类中的非静态变量和方法功能, 需要创建出静态成员内部类对象, 使用对象名.调用

      语法结构:

        外部类名.内部类名  对象名 = new 外部类名.内部类名();

    代码

    package com.ujiuye.inner;

    public class Body2 {

    // 静态属于类, 不属于任何对象, 但是可以被对象共享使用

    // 静态中不能直接使用非静态(包括成员变量, 非静态方法), 非静态要使用,

    // 需要创建出对象, 使用对象名.调用

    static int day = 1;

    int drink = 5;

    // 定义出一个静态成员内部类

    static class Shen{ // 静态成员内部类理解成一个静态成员变量

    static int wc = 6;

    int i = 10;

    public void show() {

    // 创建出一个外部类类型Body2

    Body2 b2 = new Body2();

    // 1)静态成员内部类中,可以直接使用外部类中的静态成员, 但是外部类中的非静态成员,

    // 需要先创建出外部类对象, 使用外部类对象.调用

    System.out.println(day + "" + "喝了" + b2.drink + "升水,去排毒" + wc + ", 少了, 如果去了"+ i +"次会更好");

    }

    }

    }

    package com.ujiuye.inner;

    public class TestInnerClass {

    public static void main(String[] args) {

    // 3. 测试静态成员内部类

    System.out.println(Body2.Shen.wc);// 6

    // 外部类名.内部类名  对象名 = new 外部类名.内部类名();

    Body2.Shen shen = new Body2.Shen();

    System.out.println(shen.i);

    shen.show();

    }

    }

    1.5普通局部内部类

    1. 定义位置: 局部内部类定义在方法当中
    2. 格式:

       public void breath(){// 方法

           class Fei{// 局部内部类

               // 属性,方法功能

    }

    }

    1. 局部内部类使用:

    1) 局部变量定义在方法中, 跟着方法运行存在于内存中, 跟着方法运行完毕,出内存, 无法单独获取到方法中的局部变量

    2) 同理, 局部内部类, 无法单独获取到, 局部内部类只能在当前定义方法中进行使用, 于是在方法中,创建出局部内部类对象, 通过对象.调用布局内部类中的属性和功能,外界通过调用局部内部类所在的方法,相当于对局部内部类进行使用

    代码

    package com.ujiuye.inner;

    public class Demo01_局部内部类 {

    public static void main(String[] args) {

    breath();

    }

    public static void breath() {

    int count = 10; // 局部变量

    // 定义出局部内部类

    class Fei{// 局部内部类理解成一个局部变量使用

    String color = "黑色";

    public void somke() {

      System.out.println("每天吸" + count + "根烟,慢慢的肺有可能会变成" + color);

    }

    }

    System.out.println(count);// 10

    // 创建出局部内部类对象

    Fei fei = new Fei();

    System.out.println(fei.color);// 黑色

    fei.somke();// 每天吸10根烟,慢慢的肺有可能会变成黑色

    }

    }

    1.5 匿名内部类(掌握)

    1. 匿名对象: new Person();

      匿名对象只能使用一次

    new Person().属性或者方法;

    1. 匿名内部类本质:

       匿名内部类可以作为一个类的子类或者作为一个接口的实现类

    1. 匿名内部类语法结构:

      语法整体是一个匿名内部类的对象创建

      new 父类或者父接口(){

          // 重写父类和父接口中需要重写方法功能

    };

      a : 匿名内部类对象, 只能使用一次

      b : 优化匿名内部类对象使用

         在创建好匿名内部类对象之后, 使用多态的方式, 以匿名内部类实现的父类或者父接口作为等号左边的变量引用, 等号右边是匿名内部类对象, 多态表达式成立, 可以多次使用匿名内部类中重写和继承到的方法和属性功能

    代码

    package com.ujiuye.inner;

    public class Demo02_匿名内部类 {

         // 匿名内部类可以简化类与接口实现关系

     public static void main(String[] args) {

     // 整段匿名内部类代码表示创建出一个MyInter实现类对象,只能使用一次

     new MyInter() {// 一对大括号就表示接口MyInter实现类,大括号中是实现过程

    @Override

    public void fun() {

    System.out.println("我是匿名内部类实现的fun"+I);

    }  

     }.fun();

     // 匿名内部类实现接口MyInter2

     // 父接口 名 = 实现类对象;  多态

     MyInter2 my = new MyInter2() {

    // 大括号表示MyInter2接口的实现类, 实现过程

    @Override

    public int getSum(int x, int y) {

    return x + y;

    }

    @Override

    public void print(String s) {

                    System.out.println(s);

    }

     };

     my.print("123");// 123

     System.out.println(my.getSum(5, 6));// 11

    }

    }

    interface MyInter{

    int I = 10;

    public abstract void fun();

    }

    interface MyInter2{

    public abstract int getSum(int x, int y);

    public abstract void print(String s);

    }

    2. 4种权限修饰符

    1. 4种权限修饰 : 表示作用范围

       public : 公共的, 最大使用权限, 当前项目工程下都可以使用

       protected : 受保护权限, 关键字, 能体现出封装

       默认权限 : 定义类, 接口, 方法, 成员变量, 没有给出任何权限修饰, 那么默认权限, 默认权限不能写出来, 写出来报错

       private : 私有, 最小使用权限, 当前类中使用

    1. 4种权限使用范围

    本类中使用

    本包中使用

    外包子类中使用

    外包中无关类

    private

    可以

    默认权限

    可以

    可以

    protecte受保护权限

    可以

    可以

    可以

    public 公共权限

    可以

    可以

    可以

    可以

    1. 注意 :

       protected : 受保护权限,可以在外包子类内部使用, 出了子类之外,无法使用

          受保护的权限被外包子类继承到, 在子类中相当于private私有使用

    代码

    package com.ujiuye.quanxian;

    // 默认修饰的类

    class Demo01_默认修饰类 {

     // 默认修饰的成员

         int i = 10;  

         public void useI() {

          System.out.println(i);

         }

    }

    package com.ujiuye.quanxian;

    public class Demo02_受保护权限 {

    protected int pro = 20;

    // fun是一个受保护权限修饰

    protected void fun() {

    System.out.println(pro);

    }

    }

    package com.ujiuye.quanxian;

    public class Demo03_公共权限 {

    int i = 10;

    public void function() {

    System.out.println("--------------" + i);

    }

    }

    package com.ujiuye.quanxian;

    public class Test权限 {

    public static void main(String[] args) {

    // 1. 测试默认权限修饰的类,可以在同一个package包下使用

    Demo01_默认修饰类 demo = new Demo01_默认修饰类();

    System.out.println(demo.i);// 10

    demo.useI();// 10

    // 2. 测试受保护权限在同一个package包下使用

    Demo02_受保护权限 demo2 = new Demo02_受保护权限();

    System.out.println(demo2.pro);

    demo2.fun();

    // 3. 测试公共权限在本包中可以使用

    Demo03_公共权限 demo3 = new Demo03_公共权限();

    demo3.function();

    }

    }

    package com.ujiuye.otherquanxian;

    import com.ujiuye.quanxian.Demo02_受保护权限;

    public class Demo02受保护权限Sub extends Demo02_受保护权限 {

    // 继承到了父类中的  受保护成员变量pro,  受保护方法功能 fun

    // 受保护权限只能在外包子类中的使用

    public void useProtected() {

    System.out.println(pro);

    fun();

    }

    }

    package com.ujiuye.otherquanxian;

    import com.ujiuye.quanxian.Demo02_受保护权限;

    import com.ujiuye.quanxian.Demo03_公共权限;

    public class Test外包权限 {

    public static void main(String[] args) {

    // Demo01_默认修饰类 demo = new Demo01_默认修饰类();   默认权限无法在外包中使用

    // 测试受保护权限在外包子类中保护程度

    Demo02受保护权限Sub demo2Sub = new Demo02受保护权限Sub();

    demo2Sub.useProtected();

    // System.out.println(demo2Sub.Pro);  受保护的权限被外包子类继承到, 在子类中相当于private私有使用

    Demo02_受保护权限 demo2 = new Demo02_受保护权限();

    // demo2.pro; 受保护的权限在外包无关类中不能使用

    // 测试公共权限在外包子类的使用

    Demo03公共权限Sub demo3 = new Demo03公共权限Sub();

    demo3.function();

    // 测试公共权限在外包无关类中使用

    Demo03_公共权限 pub = new Demo03_公共权限();

    pub.function();

    }

    }

    3. API和类库

    3.1 API的使用

    1. API : 全称应用程序接口, APIJDK给开发人员提供的参考文档(帮助文档), 因为JDK给开发人员提供很多的核心类库功能, 所以对应有帮助文档, 为了解释说明 : 类型的功能, 构造方法, 成员变量, 方法功能等使用规则
    2. 每一个JDK版本都对应有API帮助参考文档
    3. 如何使用API:

    1) 双击打开对应的API帮助文档

     

     

     

    3.2 类库

    1. java源文件.java文件, 编译后的文件.class字节码文件, 最终在内存中运行的就是.class文件, 因为.class文件中包含了类型中的所有内容
    2. 实际开发中项目工程中很多的包, 每个包下有很多的独立类型文件, 最终需要将实现的代码功能交付给客户, 就是交付.class文件, 需要将大量的.class文件进行打包, 生成一个jar, jar包是java中的代码标准压缩包, 只要在项目中导入jar, 那么这个jar包中的所有的类型都可以使用和运行
    3. JDK的核心类库

     

    1. 将代码打包成jar包文件:

    1) 选中需要打成jar包的项目工程或者是package

    2) 点击选中的工程或者包

       鼠标右键--->export-->java--->jar file--->选择jar文件存放的路径和定义jar文件的名称-->finish完成即可

       

     

     

     

    1. 如何将jar包导入到项目工程中使用:

    1) 复制需要使用的jar, 到项目工程根目录下

    2) jar包下的所有的文件路径导入到项目工程中, 目标jar包变成奶瓶标志, 然后目标jar包中的类型就可以使用

      

    效果:

     

       

    1. 删除不需要的jar:

      

     

     

    4. Object类型

    4.1 Object类型的概述

    1. Object: 所有类的父类 , 来自于java.lang, 使用不需要导包
    1. Object类是所有类的父类:

       如果类没有手动继承父类,那么Object类就是这个类的直接父类

       class A{} // Object类就是A的父类

       class B extends A{}

    1. Object类中有一个空参数构造:

       空参数构造中第一行不再调用super(), 因为Object类没有父类,创建对象, 正常;

    4.2 toString方法

    1. toString() : 将调用toString方法的对象以字符串形式进行表示, 将字符串进行返回

       

    1. toString方法源代码:

       public String toString() {

     com.ujiuye.object.Person @         15db9742

    return getClass().getName() + "@" + Integer.toHexString(hashCode());

    }

        

    1) getClass().getName() : 表示获取当前类型的全名

    2) "@" : 字符串@

    3) hashCode() : 表示计算出一个对象的哈希值, 就是将一个对象在内存中的物理地址, 转换成程序员可以理解数据形式, int类型整数

    4) Integer.toHexString(int i) : 表示将参数的int类型整数转换成16进制数进行表示

           

    结果 : com.ujiuye.object.Person@15db9742 称为对象的地址

    1. 实际开发中, 输出打印对象的内存地址没有意义, 因此,需要Object的子类重写父类中的toString方法功能, 不需要自己重写, 使用快捷键 alt + shift + s , 选择toString, 重写之后会将当前对象中的成员变量内容进行输出

     

    1. println就是一个输出打印的方法 : 如果输出的是引用数据类型, 那么方法功能自动调用对象中的toString方法

     

     

    代码

    package com.ujiuye.object;

     

    // 因为Person没有直接父类, 那么object就是Person的父类

    public class Person {

    private String name;

    private int age;

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    @Override

    public String toString() {

    return "Person [name=" + name + ", age=" + age + "]";

    }

    }

     

    package com.ujiuye.object;

    public class Test {

    public static void main(String[] args) {

    Person p = new Person();

     

    String s = p.toString();

    System.out.println(s); // Person [name=null, age=0]

    // println就是一个输出打印的方法 : 如果输出的是引用数据类型, 那么方法功能自动调用对象中的toString

    //  方法作为输出结果

    System.out.println(p); // Person [name=null, age=0]

    }

    }

  • 相关阅读:
    刷题篇--热题HOT 71-80
    刷题篇--热题HOT 61-70
    双飞翼布局介绍-始于淘宝UED
    css布局——百度前端技术学院
    CSS多列布局Multi-column、伸缩布局Flexbox、网格布局Grid详解
    CSS之BFC详解
    深入理解BFC和Margin Collapse
    CSS 布局_如何实现容器中每一行的子容器数量随着浏览器宽度的变化而变化?
    3列、2列自适应布局,中部内容优先显示3列布局等方法
    三列布局,中间自适应
  • 原文地址:https://www.cnblogs.com/masterhxh/p/13628719.html
Copyright © 2020-2023  润新知