Java2EE基础练习及面试题_chapter04面向对象(上_03)

简介: Java2EE基础练习及面试题_chapter04面向对象(上_03)

面试01

/*
微软面试题:
定义一个int型的数组:int[] arr = new int[]{12,3,3,34,56,77,432};
让数组的每个位置上的值去除以首位置的元素,得到的结果,作为该位置上的
新值。遍历新的数组。
 */
package com.jerry.java;
import java.util.Arrays;
/**
 * @author jerry_jy
 * @create 2022-09-26 17:53
 */
public class Exer10 {
    /*
    微软面试题:
    定义一个int型的数组:int[] arr = new int[]{12,3,3,34,56,77,432};
    让数组的每个位置上的值去除以首位置的元素,得到的结果,作为该位置上的
    新值。遍历新的数组。
     */
    public static void main(String[] args) {
        int[] arr = new int[]{12, 3, 3, 34, 56, 77, 432};
        int temp = arr[0];
        for (int i = 0; i < arr.length; i++) {
//            arr[i] = arr[i] / arr[0];
            arr[i] = arr[i] / temp;
        }
        System.out.println(Arrays.toString(arr));
        // 说出下面的结果
        int[] arr = new int[10];
        System.out.println(arr);//[I@1b6d3586
        char[] arr1 = new char[10];
        System.out.println(arr1);//空 不是null值
    }
}

面试02

/*
方法的使用
哪个选项和show()方法重载
class Demo{
    void show(int a,int b,float c){}
}
A.void show(int a,float c,int b){}//yes
B,void show(int a,int b,float c){}//一模一样。不可以出现在同一个类中。
C.int show(int a,float c,int b){return a;}//yes。
D.int show(int a,float c){return a;}//yes
 */

面试03

/*
方法的重载
方法重载(overload)必须满足________
A. 在不同class中定义的方法     B.在同一类型中定义的方法
C. 方法名必须相同              D.返回类型必须相同
E. 参数一定不同                F.参数可以相同
答案:BCE
 */

面试04

/*
    写出输出结果
 */
    public static void main(String[] args) {
        show(0);//15
        show(1);//14
    }
    public static void show(int i) {
        switch (i) {
            default:
                i += 2;
            case 1:
                i += 1;
            case 4:
                i += 8;
            case 2:
                i += 4;
        }
        System.out.println("i=" + i);
    }

面试05

/*
写出输出结果 */
    public static void main(String[] args) {
        int x = 1;
        for (show('a'); show('b') && x < 3; show('c')) {
            show('d');
            x++;
        }
    }
    public static boolean show(char ch) {
        System.out.print(ch);//abdcbdcb
        return true;
    }

面试06

//以下代码的运行结果是什么?
    public static boolean foo(char c) {
        System.out.print(c);//ABDCBDCB
        return true;
    }
    public static void main(String[] args) {
        int i = 0;
        for (foo('A'); foo('B') && (i < 2); foo('C')) {
            i++;// 1 2
            foo('D');
        }
    }

面试07

面向对象三大特征的说明

答:面向对象有三大特点:封装、继承、多态。(如果要回答四个,可加上 抽象性 这一特点)

1.继承性:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

2.封装性:

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

3. 多态性:

多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

4.抽象性:

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

面试08

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

有错吗?

答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。

面试09

Java的内存管理之垃圾回收

**分配:**由JVM自动为其分配相应的内存空间

**释放:**由JVM提供垃圾回收机制自动的释放内存空间

垃圾回收机制(GC:Garbage Collection):将垃圾对象所占用的堆内存进行回收。Java的垃圾回收机制是JVM提供的能力,由单独的系统级垃圾回收线程在空闲时间以不定时的方式动态回收。

垃圾对象:不再被任何引用指向的对象。

面试10

面试题:

问:在程序中是否可以通知垃圾回收机制过来回收垃圾?

能,通过调用System.gc();或Runtime.getRuntime().gc();

再问:调用了System.gc();或Runtime.getRuntime().gc();后是立刻执行垃圾回收吗?

不是,该调用并不会立刻启动垃圾回收机制开始回收,但会加快垃圾回收机制的运行。

代码演示:

public class TestGC{
  public static void main(String[] args)throws Exception{
    for(int i=0; i<10; i++){
      MyClass m = new MyClass();//这里本次循环完,本次创建的对象就成为垃圾了
      System.out.println("创建第" + (i+1) + "的对象:" + m);
    }
    //通知垃圾回收机制来收集垃圾
    System.gc();
    //为了延缓程序结束
    for(int i=0; i<10; i++){
      Thread.sleep(1);
      System.out.println("程序在继续....");
    }
  }
}
class MyClass{
  //这个方法是垃圾回收机制在回收它的对象时,自动调用,理解成对象留临终遗言的方法
  public void finalize(){
    System.out.println("轻轻的我走了.....");
  }
}

面试11

构造器

构造器Constructor是否可被override

答:构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload

面试12

//以下程序的运行结果是:
    public static void main(String[] args) {
        new A(new B());//BAAB
    }
}
class A {
    public A() {
        System.out.println("A");
    }
    public A(B b) {
        this();
        System.out.println("AB");
    }
}
class B {
    public B() {
        System.out.println("B");
    }

实验01

918d47db22d74eb0883338fd8435440d.png

package com.jerry.experiment1;
/**
 * @author jerry_jy
 * @create 2022-09-27 11:11
 */
public class Account {
    private int id;
    private double balance;
    private double annualInterestRate;
    public Account(int id, double balance, double annualInterestRate) {
        this.id = id;
        this.balance = balance;
        this.annualInterestRate = annualInterestRate;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public double getBalance() {
        return balance;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    public double getAnnualInterestRate() {
        return annualInterestRate;
    }
    public void setAnnualInterestRate(double annualInterestRate) {
        this.annualInterestRate = annualInterestRate;
    }
    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", balance=" + balance +
                ", annualInterestRate=" + annualInterestRate +
                '}';
    }
    public void withdraw(double amount) {//取钱
        //System.out.println("请输入取款金额:");
        if (amount > balance) {
            System.out.println("余额不足,取款失败!");
        } else {
            balance -= amount;
            System.out.println("取款成功!本次成功取出:" + amount);
        }
    }
    public void deposit(double amount) {//存钱
        balance += amount;
        System.out.println("存款成功!本次成功存入:" + amount);
    }
}
package com.jerry.experiment1;
/**
 * @author jerry_jy
 * @create 2022-09-27 11:22
 */
public class Customer {
    private String firstName;
    private String lastName;
    private Account account;
    public Customer(){
    }
    public Customer(String firstName, String lastName){
        this.firstName=firstName;
        this.lastName=lastName;
    }
    public String getFirstName() {
        return firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public Account getAccount() {
        return account;
    }
    public void setAccount(Account account) {
        this.account = account;
    }
    @Override
    public String toString() {
        return "Customer{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", account=" + account +
                '}';
    }
}
package com.jerry.experiment1;
/**
 * @author jerry_jy
 * @create 2022-09-27 11:25
 */
public class AccountTest {
    public static void main(String[] args) {
        Customer customer = new Customer("Jane", "Smith");
        System.out.println(customer.toString());
        Account account = new Account(1000, 2000, 0.0123);
        System.out.println(account.toString());
        customer.setAccount(account);
        account.deposit(100);
//        customer.getAccount();
        account.withdraw(960);
        account.withdraw(2000);
        System.out.println("Customer[" + customer.getLastName() + "," + customer.getFirstName() +
                "] has a account: id is " + customer.getAccount().getId() + ",annualInterestRate is "+
                customer.getAccount().getAnnualInterestRate() * 100 + "% ,balance is " + customer.getAccount().getBalance());
    }
}

实验02

699f1d6f34054e96af8a84e97f6efd36.png

3c9a47cef866471ba4698e8ec89bd1ad.png

package com.jerry.experiment2;
/**
 * @author jerry_jy
 * @create 2022-09-27 16:02
 */
public class Account1 {
    private double balance;
    public Account1() {
    }
    public Account1(double balance) {
        this.balance = balance;
    }
    public double getBalance() {
        return balance;
    }
    public void deposit(double amount) {//存钱
        balance += amount;
        System.out.println("存款成功!本次成功存入:" + amount);
    }
    public void withdraw(double amount) {//取钱
        //System.out.println("请输入取款金额:");
        if (amount > balance) {
            System.out.println("余额不足,取款失败!");
        } else {
            balance -= amount;
            System.out.println("取款成功!本次成功取出:" + amount);
        }
    }
}
package com.jerry.experiment2;
import com.jerry.experiment1.Account;
/**
 * @author jerry_jy
 * @create 2022-09-27 16:01
 */
public class Customer {
    private String firstName;
    private String lastName;
    private Account1 account;
    public Customer() {
    }
    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    public String getFirstName() {
        return firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public Account1 getAccount() {
        return account;
    }
    public void setAccount(Account1 account) {
        this.account = account;
    }
}
package com.jerry.experiment2;
/**
 * @author jerry_jy
 * @create 2022-09-27 16:04
 */
public class Bank {
    private Customer[] customers;
    private int numberOfCustomer;
    public Bank() {
        customers = new Customer[10];//构造器初始化赋值
    }
    public void addCustomer(String firstName, String lastName) {
        Customer customer = new Customer(firstName, lastName);
        customers[numberOfCustomer++]=customer;//把新new出来的customer放在customers数组中
    }
    public int getNumOfCustomers() {
        return numberOfCustomer;
    }
    public Customer getCustomer(int index) {
        return customers[index];
    }
}


package com.jerry.experiment2;
/**
 * @author jerry_jy
 * @create 2022-09-27 16:21
 */
public class BankTest {
    public static void main(String[] args) {
        Bank bank = new Bank();
        bank.addCustomer("Jin", "Yang");
        //连续操作
        bank.getCustomer(0).setAccount(new Account1(2000));
        bank.getCustomer(0).getAccount().withdraw(500);
        double balance = bank.getCustomer(0).getAccount().getBalance();
        System.out.println("客户:" + bank.getCustomer(0).getFirstName() + "的账户余额为:" + balance);
        System.out.println("***********************");
        bank.addCustomer("万里", "杨");
        System.out.println("银行客户的个数为:" + bank.getNumOfCustomers());
    }
}


目录
打赏
0
0
0
0
39
分享
相关文章
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
86 14
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
53 13
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
75 9
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
95 16
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
189 60
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
73 12
Java MyBatis 面试题
Java MyBatis相关基础面试题
Java JVM 面试题
Java JVM(虚拟机)相关基础面试题
Java Dubbo 面试题
Java Dubbo相关基础面试题
Java Druid 面试题
Java Druid 连接池相关基础面试题

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等