关于Java面向对象的分析题

简介: 分析程序看有没有问题,如果有,说出原因即可。-----------------------------------------------------------------------------1. abstract class Name { private String name; public abstract boolean isStupidName(String name) {} //有方法体,但方法体为空。

分析程序看有没有问题,如果有,说出原因即可。
-----------------------------------------------------------------------------
1.

abstract class Name {
   private String name;
   public abstract boolean isStupidName(String name) {}    //有方法体,但方法体为空。会报错。
}

错误。
  抽象方法必须以分号结尾,且不带花括号。
  在Java中,一个没有具体的方法体的方法应该定义为抽象方法。
  而在一个类中如果有抽象方法,该类必须定义为抽象类。
-----------------------------------------------------------------------------
2.

public class Something {
   void doSomething () {
       private String s = "";
       int l = s.length();
   }
}

错误。
  局部变量前不能放置任何访问修饰符 (private,public和protected)。
  final可以用来修饰局部变量。被final修饰的局部变量变为常量了。
-----------------------------------------------------------------------------
3.

abstract class Something {
   private abstract String doSomething ();
}

错误。
  抽象的方法不能以private修饰。
  抽象的方法就是让子类implement(实现)具体细节的,怎么可以用private把抽象的方法封锁起来呢?
  (同理,抽象的方法前不能加final)。
-----------------------------------------------------------------------------
4.

public class Something {
   public int addOne(final int x) {
       return ++x;
   }
}

错误。
  int x被final修饰,意味着x不能在addOne 方法中被修改。
-----------------------------------------------------------------------------
5.

public class Something {
   public static void main(String[] args) {
       Other o = new Other();
       new Something().addOne(o);
   }
   public void addOne(final Other o) {
       //o = new Other();    //对象o重新指向了新的地址值,但是对象o是被final修饰了,所以这句会报错!
       o.i++;    //正确
   }
}

class Other {
   public int i;
}

正确。

  在addOne 方法中,参数o被修饰成final。
  如果在addOne 方法里我们修改了o的引用(比如: o = new Other();),那么如同上例这题也是错的。
  但这里修改的是o的成员变量i(member vairable),而o的引用(reference)并没有改变。
-----------------------------------------------------------------------------
6.

1 class Something {
2     int i;
3     public void doSomething() {
4         System.out.println("i = " + i);
5     }
6 } 

正确。
  输出的是"i = 0"。int i属于成员变量/实例变量(instant variable)。成员变量有缺省值(default value)。int i的缺省值是0。
-----------------------------------------------------------------------------
7.

class Something {
    final int i;
    public void doSomething() {
        System.out.println("i = " + i);
    }
}

错误。
  被final修饰的成员变量没有默认值(default value),必须在构造器(constructor )结束之前被赋予一个明确的值。
  即在定义被final修饰的成员变量时就给值,例如final int i = 0;
-----------------------------------------------------------------------------
8.

public class Something {
    public static void main(String[] args) {
        Something s = new Something();
        System.out.println("s.doSomething() returns " + doSomething());
    }
    public String doSomething() {
        return "Do something ...";
    }
}

错误。
  看上去在main里调用doSomething()没有什么问题,毕竟两个方法都在同一个class里。
  但仔细看,main方法是static的。静态的方法不能直接调用非静态的方法。
  可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。
  同理,静态方法(static method)不能访问非静态成员变量(non-static instant variable)。
-----------------------------------------------------------------------------
9.

此处,Something类的文件名叫OtherThing.java
class Something {
    private static void main(String[] something_to_do) {        
        System.out.println("Do something ...");
    }
}

正确。
  从来没有人说过Java的Class名字必须和其文件名相同。但public class A {} 的名字必须和文件名相同。
-----------------------------------------------------------------------------
10.

interface  A {    //因为接口的所有成员变量的默认修饰符都是:public static final
   int x = 0;
}
class B { int x = 1; }
class C extends B implements A { public void pX() { System.out.println(x); } public static void main(String[] args) { new C().pX(); } }

错误。
  在编译时会发生错误(错误描述不同的JVM有不同的信息),
  意思就是未明确的x调用,两个x都匹配(就像在同时import java.util和java.sql两个包时直接声明Date一样)。
  对于父类的变量,可以用super.x来明确调用,而接口的成员变量(属性)默认隐含修饰符为public static final int x = ;可以通过A.x来明确调用。
-----------------------------------------------------------------------------
11.

interface Playable {    //因为接口的所有成员方法的默认修饰符都是:public abstract
    void play();    //完整形式为:public abstract void play();
}
interface Bounceable { void play(); }
interface Rollable extends Playable, Bounceable { //因为接口的所有成员变量的默认修饰符都是:public static final Ball ball = new Ball("PingPang"); //这是成员变量。完整形式为:public static final Ball ball = new Ball("PingPang"); } //即ball是一个最终变量(常量),其类型是引用数据类型,也即ball不能再new了。

class Ball implements Rollable { private String name; public String getName() { return name; } public Ball(String name) { this.name = name; } public void play() { ball = new Ball("Football"); System.out.println(ball.getName()); } }

错误。
  接口可以多继承,即接口可以继承多个接口。
  任何在接口里声明的接口变量,也可称成员变量,默认的修饰符为public static final。
  也就是说: Ball ball = new Ball("PingPang");是成员变量,实际上是 public static final Ball ball = new Ball("PingPang");。
  在Ball类的play()方法中,"ball = new Ball("Football");"改变了ball的引用,而这里的ball来自Rollable 接口,
  Rollable 接口里的ball是public static final的,final修饰的对象是不能被改变引用(reference)的。
  因此编译器将在 ball = new Ball("Football"); 这里显示有错。
-----------------------------------------------------------------------------

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
13天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
13天前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
36 0
|
2月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
58 4
|
2月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
2月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
3月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
3月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
|
4月前
|
数据采集 搜索推荐 算法
Java 大视界 -- Java 大数据在智能教育学习社区用户互动分析与社区活跃度提升中的应用(274)
本文系统阐述 Java 大数据技术在智能教育学习社区中的深度应用,涵盖数据采集架构、核心分析算法、活跃度提升策略及前沿技术探索,为教育数字化转型提供完整技术解决方案。
|
4月前
|
Java 数据库连接 API
互联网大厂校招 JAVA 工程师笔试题解析及常见考点分析
本文深入解析互联网大厂校招Java工程师笔试题,涵盖基础知识(数据类型、流程控制)、面向对象编程(类与对象、继承与多态)、数据结构与算法(数组、链表、排序算法)、异常处理、集合框架、Java 8+新特性(Lambda表达式、Stream API)、多线程与并发、IO与NIO、数据库操作(JDBC、ORM框架MyBatis)及Spring框架基础(IoC、DI、AOP)。通过技术方案讲解与实例演示,助你掌握核心考点,提升解题能力。
172 2
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。