java类和对象——内部类和对象的打印

- 日理万妓 2023-10-05 23:18 142阅读 0赞

文章目录

  • 1.内部类
    • 1.1 内部类的分类
    • 1.2 内部类
      • 1.2.1 实例内部类
      • 1.2.2 静态内部类
    • 1.3 局部内部类
    • 1.4 匿名内部类
    1. 对象的打印

1.内部类

可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。

  1. public class OutClass {
  2. public class InnerClass {
  3. // OutClass是外部类
  4. // InnerClass是内部类
  5. }
  6. }

【注意事项】

  • 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类。
  • 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件。

    public class OutClass {

  1. }
  2. class Work {
  3. }
  4. // OutClass 和 Work 是两个独立的类

1.1 内部类的分类

  • 实例内部类(未被static修饰的成员内部类)
  • 静态内部类(被static修饰的成员内部类)
  • 局部内部类
  • 匿名内部类

    public class OutClass {

    1. //成员位置定义:未被static修饰 -》 实例内部类
    2. public class InnerClass {
  1. }
  2. //成员位置定义:被static修饰 -》 静态内部类
  3. static class Work {
  4. }
  5. //也可以在方法中定义类 -》 局部内部类 -> 几乎不使用
  6. public void func() {
  7. class func2 {
  8. }
  9. }
  10. }

1.2 内部类

1.2.1 实例内部类

未被static修饰的成员内部类。

  1. 如何获取实例内部类的对象?

【方式】:

  1. // OutClass.InnerClass innerClass = outClass.new InnerClass();
  2. public class OutClass {
  3. public int a = 10;
  4. public String ch = "#######";
  5. public static int b = 20;
  6. public void printOut() {
  7. System.out.println("I Love China!!!");
  8. }
  9. /*
  10. * 实例内部类
  11. * 1. 如何获取实例内部类的对象?
  12. */
  13. class InnerClass {
  14. //内部类
  15. public int day = 12;
  16. public String tele = "193 8979 0399";
  17. public static final int age = 19;
  18. public void printIn() {
  19. System.out.println("I Love Java!!!");
  20. }
  21. }
  22. public static void main(String[] args) {
  23. OutClass outClass = new OutClass();
  24. OutClass.InnerClass innerClass = outClass.new InnerClass();
  25. System.out.println("外部类ch:" + outClass.ch);
  26. System.out.println("外部类a:" + outClass.a);
  27. System.out.println("内部类tele:" + innerClass.tele);
  28. System.out.println("内部类age:" + innerClass.age);
  29. }
  30. }

【解释】

  1. OutClass.InnerClass innerClass = outClass.new InnerClass();

通过外部类 . 内部类找到内部类,然后再创建一个变量;再通过外部类对象的引用(outClass). new上一个内部类的对象。

还有一种写法是:

  1. OutClass.InnerClass innerClass = new OutClass().new InnerClass();

【注】:这两种方式是一样的,但是我觉得上面那一种更容易理解。

  1. 实例内部类当中不能有静态成员变量。

代码报错
在这里插入图片描述

【分析】:

static是类加载的时候加载的,static的执行时机较靠前,先执行static,后执行内部类;在执行static的时候内部类还未加载,相当于内部类不存在。

给静态成员变量加上final:

  1. public static final int age = 19;

发现无报错
d746e7407834445c831b61f950179e02.png
加上final之后,age就是一个常量了,编译的时候就确定了这个地方就是10。

【final的演示】:

e2c6721f996a4d428804f3bf5b0f884e.png

final 把变量A变成了常量,而常量是不能修改的,final 修饰的常量一般是大写。

【注意事项】

  • 外部类中的任何成员都可以在实例内部类方法中直接访问。
  • 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。
  • 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须外部类名称.this.同名成员 来访问。
  • 实例内部类对象必须在先有外部类对象前提下才能创建。
  • 实例内部类的非静态方法中包含了一个指向外部类对象的引用。
  • 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
  1. 在实例内部类当中,如何访问外部类相同的成员变量?

调用printIn函数

  1. public class OutClass {
  2. public int a = 10;
  3. public String b = "#######";
  4. public static int c = 20;
  5. public void printOut() {
  6. System.out.println("I Love China!!!");
  7. }
  8. class InnerClass {
  9. //内部类
  10. public int day = 12;
  11. public String tele = "193 8979 0399";
  12. public static final int age = 19;
  13. public void printIn() {
  14. System.out.println("I Love Java!!!");
  15. System.out.println(a);
  16. System.out.println(b);
  17. System.out.println(c);
  18. System.out.println(day);
  19. System.out.println(tele);
  20. System.out.println(age);
  21. }
  22. }
  23. public static void main(String[] args) {
  24. OutClass outClass = new OutClass();
  25. OutClass.InnerClass innerClass = outClass.new InnerClass();
  26. innerClass.printIn();
  27. }
  28. }

cc658e620c3a42f49513612f62216829.png

实例内部类和外部类的成员变量相同时,实例内部类优先。

  1. public class OutClass {
  2. public String ch = "外部类优先";
  3. public void printOut() {
  4. System.out.println("I Love China!!!");
  5. }
  6. /*
  7. * 实例内部类
  8. * 1. 如何获取实例内部类的对象?
  9. */
  10. class InnerClass {
  11. //内部类
  12. public String ch = "实例内部类优先";
  13. public void printIn() {
  14. System.out.println(ch);
  15. }
  16. }
  17. public static void main(String[] args) {
  18. OutClass outClass = new OutClass();
  19. OutClass.InnerClass innerClass = outClass.new InnerClass();
  20. innerClass.printIn();
  21. }
  22. }

6f38e9a4c8fe43b985f11cc23a9d49d9.png

那在实例内部类当中,如何访问外部类相同的成员变量呢?

方法1:

  1. public void printIn() {
  2. OutClass outClass = new OutClass();
  3. System.out.println(outClass.ch);
  4. System.out.println(ch);
  5. }

方法2:

  1. public void printIn() {
  2. OutClass outClass = new OutClass();
  3. System.out.println(OutClass.this.ch);
  4. System.out.println(ch);
  5. }

1.2.2 静态内部类

  1. 如何获取静态内部类对象?

    public class OutClass2 {

    1. public int day = 12;
    2. int age = 19;
    3. public static String tele = "193 8979 0399";
    4. public void printOut() {
    5. System.out.println("I Love China!!!");
    6. }
    7. /*
    8. * 1.如何获取静态内部类对象?
    9. *
    10. */
    11. static class Innerclass2 {
    12. public int a = 10;
    13. int b = 20;
    14. public static String c = "*****";
    15. public void printIn() {
    16. System.out.println("I Love Java!!!");
    17. }
    18. }
    19. public static void main(String[] args) {
    20. OutClass2.Innerclass2 innerclass2 = new OutClass2.Innerclass2();
    21. }

    }

  2. 静态内部类中不能访问外部类的非静态成员。

代码报错
6392685fcc4a4269904ab83609adecc5.png
外部类的非静态成员,需要外部类对象的引用才能访问。

如果非要访问呢?

【方法】:

  1. public void printIn() {
  2. OutClass2 outClass2 = new OutClass2();
  3. System.out.println(outClass2.day);
  4. System.out.println(outClass2.age);
  5. System.out.println(tele);
  6. }

【注意事项】

  • 在静态内部类中只能访问外部类中的静态成员。
  • 创建静态内部类对象时,不需要先创建外部类对象。

1.3 局部内部类

局部内部类:定义在方法体内部

  1. public class OutClass2 {
  2. public void func() {
  3. class test {
  4. //局部内部类
  5. }
  6. }
  7. }

几乎不会用到,所以简单了解就可以了。

【注意事项】

  • 局部内部类只能在所定义的方法体内部使用。
  • 不能被public、static等修饰符修饰。
  • 编译器也有自己独立的字节码文件,命名格式:外部类名字$内部类名字.class。
  • 几乎不会使用。

1.4 匿名内部类

后序讲抽象类和接口时给大家详细介绍。

  1. class Test1 {
  2. public int age = 19;
  3. public String name = "zhangsan";
  4. }
  5. public class Person {
  6. public static void main(String[] args) {
  7. Test1 test1 = new Test1();
  8. System.out.println(test1.age);
  9. System.out.println(test1.name);
  10. //匿名对象只能使用一次,所以每次使用都要重新new一下
  11. System.out.println(new Test1().age);
  12. System.out.println(new Test1().name);
  13. new Test1() {
  14. //匿名内部类
  15. };
  16. }
  17. }

2. 对象的打印

  1. class Test1 {
  2. public int age = 19;
  3. public String name = "zhangsan";
  4. public void show() {
  5. System.out.println("姓名:" + name + "年龄:" + age);
  6. }
  7. }
  8. public class Person1 {
  9. public static void main(String[] args) {
  10. Test1 test1 = new Test1();
  11. test1.show();
  12. }

b7e56b18cd2240e5a8fd95906df14bdb.png

如果要输入的信息比较多,那就需要一个一个的书写,这样比较麻烦,在java中还有一种更快的输出方式。

使用**toString()**输出。

步骤:

  1. 鼠标放到show方法,右击鼠标,出现以下对话框。
    在这里插入图片描述

2.点击Generate…,出现以下对话框。
94a3ad2dfaea4c059d66b399a6866586.png

  1. 在出现的对话框单击toString()后,出现以下对话框并点击OK。
    f38e1db96a3d4e74833351eb487c3b43.png

    class Test1 {

    1. public int age = 19;
    2. public String name = "zhangsan";
    3. @Override
    4. public String toString() {
    5. return "Test1{" + "age=" + age + ", name='" + name + '\'' + '}';
    6. }
    7. public void show() {
    8. System.out.println("姓名:" + name + "年龄:" + age);
    9. }

    }

    public class Person1 {

    1. public static void main(String[] args) {
    2. Test1 test1 = new Test1();
    3. test1.show();
    4. }

1f3cf436041747298229cc794b9d58e7.png

@Override 是一个注解,用来充当这一个检查的作用,不写也不会有影响。

发表评论

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

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

相关阅读

    相关 Java对象

    序言 类和对象是OP语言的一个重要的知识点,抽象性很高,我们学习起来可能会有一些疑惑,今天我们好好谈谈这个知识点,若有错误,还请诸位斧正。 初阶 在初阶里面我们需

    相关 Java 匿名内部匿名对象

    匿名内部类:没有类名的类就称作为匿名内部类。 匿名内部类的好处:简化书写。 匿名内部类的使用前提:必须存在继承或者实现关系才能使用。 匿名内部类一般是用于实参。

    相关 Java对象

    为对象定义类 对象:现实世界中可以明确标识的一个实体。每个对象都有自己独特的标识、状态和行为。             状态:又称特征、属性,是由具有当前值的数据域来表

    相关 Java 对象

    类和对象关系: 写编程语言,就是为了模拟现实世界的事物,实现信息化。比如:去超市买东西的计费系统,去银行办业务的系统。 如何表示一个现实世界事物: 1. 属性 就是该事

    相关 Java 对象

    创建对象 对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步: 声明:声明一个对象,包括对象名称和对象类型。 实例化:使用关键字n...