首页 > 试题广场 >

10. class Line { 11. public cl

[单选题]
10. class Line {
11. public class Point { public int x,y;}
12. public Point getPoint() { return new Point(); }
13. }
14. class Triangle {
15. public Triangle() {
16. // insert code here
17. }
18. }
在第16行插入哪段代码可以获得一个Point对象的坐标?(  )
  • Point p = Line.getPoint();
  • Line.Point p = Line.getPoint();
  • Point p = (new Line()).getPoint();
  • Line.Point p = (new Line()).getPoint();
(1)把类定义在另一个类的内部,该类就被称为内部类。
举例:把类B定义在类A中,类B就被称为内部类。
(2)内部类的访问规则
A:可以直接访问外部类的成员,包括私有
B:外部类要想访问内部类成员,必须创建对象
(3)内部类的分类
A:成员内部类
B:局部内部类
C:匿名内部类
(4)成员内部类访问规则
成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
(5)局部内部类
A:局部内部类访问局部变量必须加final修饰。
B:为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
(6)匿名内部类(掌握)
A:是局部内部类的简化形式
B:前提
存在一个类或者接口
C:格式:
new 类名或者接口名() {
重写方法;
}
D:本质:
其实是继承该类或者实现接口的子类匿名对象


编辑于 2019-08-18 08:25:54 回复(23)
发表于 2020-02-09 19:51:25 回复(8)
因为Point 在 类 Line 里面,属于内部类,直接 使用 Point  p 肯定报错。
public class Point { public int x,y;}  是 Point 的构造方法, Line 肯定不能 获取到,Point
只能获取到其Class  
Class c =Line.Point.class;
但是如果是  
private      class Point   ,  Line.Point 将报错不到 

对象,只能通过
getPoint() 
,而 getPoint 不是静态方法,所以需要new Line ,选择最后一个选项
发表于 2019-08-06 09:37:11 回复(8)
发表于 2020-03-06 21:54:14 回复(0)
要创建成员内部类的对象,前提必须创建一个外部类的对象,方法如下:
1)Outer outer = new Outer();Inner inner = Outer.new Inner();
2) Outer.Inner inner = new Outer().new Inner();
题中要一个Point对象的坐标,也就是返回一个Point对象,所以直接getPoint()就可以了
发表于 2019-08-06 09:23:44 回复(2)
成员内部类在类内部使用可以直接打类名,在类外部声明的类型需要全限定类名或者外部类.内部类的形式并且实例化需要先实例化外部类再实例化内部类(静态内部类可以直接new 类名.静态内部类名()实例化,但是路径不能少)。

下面是代码
class AA{
    public class Point{ public int x=1 , y=2 ; }
    public static class X11{};
    public Point getPoint(){ return new Point() ; }

    public void printPoint(){
        Point point = new Point();
        System.out.println("point.x="+point.x+";point.y="+point.y);
    }

}

public class InnerClass {

    public static void main(String[] args) {

        AA aa = new AA();
        aa.printPoint();
        //静态内部类实例化
        com.map.AA.X11 x11 = new AA.X11();

        //内部类实例化的声明类型可以打全路径名或者外部类.内部类的形式
        com.map.AA.Point point = aa.new Point();
        System.out.println("point.x="+point.x+";point.y="+point.y);

        AA.Point point2 = aa.new Point();
        System.out.println("point.x="+point2.x+";point.y="+point2.y);

        com.map.AA.Point point1 = aa.getPoint();
        System.out.println("point.x="+point1.x+";point.y="+point1.y);

        AA.Point point3 = aa.getPoint();
        System.out.println("point.x="+point3.x+";point.y="+point3.y);

    }
}



发表于 2019-11-13 19:56:21 回复(1)
(4)成员内部类访问规则 成员内部类不是静态的: 外部类名.内部类名 对象名 = new 外部类名().new 内部类名(); 成员内部类是静态的: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
发表于 2021-09-18 09:02:03 回复(0)
(4)成员内部类访问规则 成员内部类不是静态的: 外部类名.内部类名 对象名 = new 外部类名().new 内部类名(); 成员内部类是静态的: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
发表于 2021-04-02 14:23:41 回复(0)
基础太差了,居然对内部类一点印象也没用😁
发表于 2020-03-07 22:36:08 回复(0)
public class Outer {

    public class Inner{

        public Inner() {
        }
    }
}

class Strange{

    public  void test() {

        Outer.Inner inner1 = new Outer().new Inner();

        Outer outer = new Outer();
        Outer.Inner inner2 = outer.new Inner();
    }
}

发表于 2019-08-09 19:04:14 回复(0)
  • 成员内部类MemberInnerClass:定义在外部类的成员位置,并且没有static修饰
    • 注意事项
      • 可以添加任意访问修饰符(public、protected、默认、private),因为它的地位就是一个成员
      • 作用域:和外部类的其他成员一样,为整个类体
      • 成员内部类访问外部类成员:可以直接访问外部类的所有成员,包含私有的
      • 外部类访问成员内部类:创建对象,再访问
      • 外部其他类成员访问成员内部类:先创建外部类对象Outer outer = new Outer();
        • 1.Outer.Inner inner = outer.new Inner(); // outer.new Inner(); 相当于把.new Inner()当做是outer的成员,这就是一个语法,不要特别纠结
        • 2.Outer.Inner innerInstance = outer.getInnerInstance(); // 在外部类中,编写一个方法,可以返回一个Inner对象
      • 如果外部类和成员内部类重名时,成员内部类访问的话,默认遵循就因原则,如果想访问外部类的成员,则可以使用“外部类名.this.成员”去访问
     
发表于 2023-04-09 16:24:04 回复(0)
还是没明白
发表于 2021-10-22 00:11:51 回复(0)
大意了,没有闪
发表于 2021-09-07 09:16:25 回复(0)
答案c也是对的,不报错
发表于 2019-09-21 16:04:00 回复(6)
Point 是一个内部类 别马虎
发表于 2025-05-06 21:53:17 回复(0)
1. 首先分析代码结构: - 有一个外部类 Line ,内部类 Point ,以及另一个类 Triangle 。 - 要获得 Point 对象的坐标,需要先获取 Point 对象。 2. 然后看获取 Point 对象的正确方式: - 选项A: Point p = Line.getPoint(); 是错误的,因为 getPoint 是 Line 类的实例方法,不能通过类名直接调用。 - 选项B: Line.Point p = Line.getPoint(); 也是错误的,原因同A,不能通过类名调用实例方法,并且 Line.Point 这种使用方式不正确,应该先创建 Line 的实例。 - 选项C: Point p = (new Line()).getPoint(); 错误在于 getPoint 方法返回的是 Line 内部类 Point 的对象,应该使用 Line.Point 来声明变量。 - 选项D: Line.Point p = (new Line()).getPoint(); 是正确的。先创建 Line 类的实例,然后通过实例调用 getPoint 方法获取 Point 对象,并且使用 Line.Point 来声明变量,符合内部类对象的获取和使用规则。 答案是D。
发表于 2024-11-01 04:52:27 回复(0)
 (1)把类定义在另一个类的内部,该类就被称为内部类。 举例:把类B定义在类A中,类B就被称为内部类。 (2)内部类的访问规则 A:可以直接访问外部类的成员,包括私有 B:外部类要想访问内部类成员,必须创建对象 (3)内部类的分类 A:成员内部类
B:局部内部类
C:匿名内部类
(4)成员内部类访问规则 成员内部类不是静态的: 外部类名.内部类名 对象名 = new 外部类名().new 内部类名(); 成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
(5)局部内部类 A:局部内部类访问局部变量必须加final修饰。 B:为什么呢? 因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。 所以,堆内存还是用该变量,而改变量已经没有了。 为了让该值还存在,就加final修饰。 通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。 (6)匿名内部类(掌握) A:是局部内部类的简化形式 B:前提 存在一个类或者接口 C:格式: new 类名或者接口名() { 重写方法; } D:本质: 其实是继承该类或者实现接口的子类匿名对象

发表于 2024-08-13 19:45:50 回复(0)
内部类知识,粗心大意
编辑于 2024-02-16 22:18:39 回复(0)
内部类被访问需要创建外部类对象
发表于 2023-03-13 16:23:46 回复(0)
错误原因:没看清括号分布,以为是同一个外部类里的两个内部类
发表于 2022-12-05 20:50:53 回复(0)