Java2EE基础练习及面试题_chapter06面向对象(下_01)

简介: Java2EE基础练习及面试题_chapter06面向对象(下_01)

题目01

//命令行参数用法举例
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 10:24
 */
public class CommandPara {//命令行参数用法举例
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.println("args[" + i + "] = " + args[i]);
        }
    }
}

题目02

内部类使用,说出程序的运行结果:
在内部类Inner中s=100
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 18:02
 */
public class InnerTest {
    public static void main(String args[]) {
        Outer o = new Outer();
        o.ma();
    }
}
class Outer {
    private int s;
    public class Inner {
        public void mb() {
            s = 100;
            System.out.println("在内部类Inner中s=" + s);
        }
    }
    public void ma() {
        Inner i = new Inner();
        i.mb();
    }
}

题目03

//静态代码块
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 10:30
 */
class Root {//静态代码块
    static {
        System.out.println("Root的静态初始化块");
    }
    {
        System.out.println("Root的普通初始化块");
    }
    public Root() {
        System.out.println("Root的无参数的构造器");
    }
}
class Mid extends Root {
    static {
        System.out.println("Mid的静态初始化块");
    }
    {
        System.out.println("Mid的普通初始化块");
    }
    public Mid() {
        System.out.println("Mid的无参数的构造器");
    }
    public Mid(String msg) {
        //通过this调用同一类中重载的构造器
        this();
        System.out.println("Mid的带参数构造器,其参数值:"
                + msg);
    }
}
class Leaf extends Mid {
    static {
        System.out.println("Leaf的静态初始化块");
    }
    {
        System.out.println("Leaf的普通初始化块");
    }
    public Leaf() {
        //通过super调用父类中有一个字符串参数的构造器
        super("尚硅谷");
        System.out.println("Leaf的构造器");
    }
}
public class LeafTest {
    public static void main(String[] args) {
        new Leaf();
        //new Leaf();
    }
}

题目04

考察静态代码块,请说出下面程序的运行结果:
Number of total is 0
Number of total is 1
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 9:45
 */
public class PersonTest {
    public static void main(String[] args) {
        System.out.println("Number of total is " + Person1.getTotalPerson());//0
        //没有创建对象也可以访问静态方法
        Person1 p1 = new Person1();
        System.out.println("Number of total is " + Person1.getTotalPerson());//1
    }
}
class Person1 {
    private int id;
    private static int total = 0;
    public static int getTotalPerson() {
        //id++; //非法
        return total;
    }
    public Person1() {
        total++;
        id = total;
    }
}

题目05

考察静态代码块,请说出下面程序的运行结果:
11111111111
44444444444
77777777777
************************
22222222222
33333333333
55555555555
66666666666
************************
22222222222
33333333333
55555555555
66666666666
************************
22222222222
33333333333
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 10:33
 */
class Father {
    static {
        System.out.println("11111111111");//静态代码块,只会执行一次
    }
    {
        System.out.println("22222222222");//随着类的加载而加载,优先于构造器加载
    }
    public Father() {
        System.out.println("33333333333");
    }
}
public class Son extends Father {
    static {
        System.out.println("44444444444");
    }
    {
        System.out.println("55555555555");
    }
    public Son() {
        System.out.println("66666666666");
    }
    public static void main(String[] args) { // 由父及子 静态先行
        System.out.println("77777777777");
        System.out.println("************************");
        new Son();
        System.out.println("************************");
        new Son();
        System.out.println("************************");
        new Father();
    }
}

题目06

下面程序的运行结果是?
100
101
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 9:34
 */
/*
下面程序的运行结果是?
 */
public class StaticDemo {
    public static void main(String args[]) {
        Person.total = 100; // 不用创建对象就可以访问静态成员
//访问方式:类名.类属性,类名.类方法
        System.out.println(Person.total);//100
        Person c = new Person();
        System.out.println(c.total); //输出101
    }
}
class Person { //类变量应用举例
    private int id;
    public static int total = 0;
    public Person() {
        total++;
        id = total;
    }
    public static void main(String args[]) {
        Person Tom = new Person();
        Tom.id = 0;
        total = 100; // 不用创建对象就可以访问静态成员
    }
}

题目07

代理模式
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 16:32
 */
public class StaticProxyTest {
    public static void main(String[] args) {
        Star s = new Proxy(new RealStar());
        s.confer();
        s.signContract();
        s.bookTicket();
        s.sing();
        s.collectMoney();
    }
}
interface Star {
    void confer();// 面谈
    void signContract();// 签合同
    void bookTicket();// 订票
    void sing();// 唱歌
    void collectMoney();// 收钱
}
class RealStar implements Star {
    public void confer() {
    }
    public void signContract() {
    }
    public void bookTicket() {
    }
    public void sing() {
        System.out.println("明星:歌唱~~~");
    }
    public void collectMoney() {
    }
}
class Proxy implements Star {
    private Star real;
    public Proxy(Star real) {
        this.real = real;
    }
    public void confer() {
        System.out.println("经纪人面谈");
    }
    public void signContract() {
        System.out.println("经纪人签合同");
    }
    public void bookTicket() {
        System.out.println("经纪人订票");
    }
    public void sing() {
        real.sing();
    }
    public void collectMoney() {
        System.out.println("经纪人收钱");
    }
}

题目08

static测试
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-29 22:14
 */
public class StaticTest {
    public static void main(String[] args) {
        Circle1 c1 = new Circle1(2.0);
        Circle1 c2 = new Circle1(3.0);
        Circle1.getName();
        c1.display();
        c2.display();
    }
}
class Circle1 {
    private double radius;
    public static String name = "这是一个圆";
    public static String getName() {
        return name;
    }
    public Circle1(double radius) {
        this.radius = radius;
    }
    public double findArea() {
        return Math.PI * radius * radius;
    }
    public void display() {
        System.out.println("name:" + name + "radius:" + radius);
    }
}

题目09

//抽象类的应用:模板方法的设计模式
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 11:10
 */
//抽象类的应用:模板方法的设计模式
public class TemplateMethodTest {
    public static void main(String[] args) {
        BankTemplateMethod btm = new DrawMoney();
//        DrawMoney btm = new DrawMoney();
        btm.process();
        BankTemplateMethod btm2 = new ManageMoney();
//        ManageMoney btm2 = new ManageMoney();
        btm2.process();
    }
}
abstract class BankTemplateMethod {
    // 具体方法
    public void takeNumber() {
        System.out.println("取号排队");
    }
    public abstract void transact(); // 办理具体的业务 //钩子方法
    public void evaluate() {
        System.out.println("反馈评分");
    }
    // 模板方法,把基本操作组合到一起,子类一般不能重写
    public final void process() {
        this.takeNumber();
        this.transact();// 像个钩子,具体执行时,挂哪个子类,就执行哪个子类的实现代码
        this.evaluate();
    }
}
class DrawMoney extends BankTemplateMethod {
    public void transact() {
        System.out.println("我要取款!!!");
    }
}
class ManageMoney extends BankTemplateMethod {
    public void transact() {
        System.out.println("我要理财!我这里有2000万美元!!");
    }
}

题目10

//判断输出结果为何?
package com.jerry.java;
/**
 * @author jerry_jy
 * @create 2022-09-30 18:10
 */
//判断输出结果为何?
public class Test {
    public Test() {
        Inner s1 = new Inner();
        s1.a = 10;
        Inner s2 = new Inner();
        s2.a = 20;
        Test.Inner s3 = new Test.Inner();
        System.out.println(s3.a);
    }
    class Inner {
        public int a = 5;
    }
    public static void main(String[] args) {
        Test t = new Test();//5
        Inner r = t.new Inner();//5
        System.out.println(r.a);
//        String foo = args[1];
//        String bar = args[2];
//        String baz = args[3];
    }
}

题目11

/*
编写一个类实现银行账户的概念,包含的属性有“帐号”、“密
码”、“存款余额”、“利率”、“最小余额”,定义封装这些
属性的方法。账号要自动生成。
编写主类,使用银行账户类,输入、输出3个储户的上述信息。
考虑:哪些属性可以设计成static属性。
 */
package com.jerry.exer;
import java.util.Random;
/**
 * @author jerry_jy
 * @create 2022-09-30 9:51
 */
public class Exer1 {
    public static void main(String[] args) {
        System.out.println("最小余额:" + Account.minBalance);
        System.out.println("年利率:" + Account.rate);
        Account account = new Account("1001", 1001);
        System.out.println(account.toString());
        Account account1 = new Account("1002", 1002);
        System.out.println(account1.toString());
    }
}
class Account {
    private int id;
    private String pwd;
    private double balance;
    static double rate=0.001;
    static double minBalance=1;
    private static int init = 1001;
    public Account() {
        id = init++;
    }
    public Account(String pwd, double balance) {
        id = init++;
        this.pwd = pwd;
        this.balance = balance;
    }
    public int getId() {
        return id;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public double getBalance() {
        return balance;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", pwd='" + pwd + '\'' +
                ", balance=" + balance +
                '}';
    }
}

题目12

单例模式--饿汉式
package com.jerry.exer;
/**
 * @author jerry_jy
 * @create 2022-09-30 10:15
 */
public class Exer2 {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
    }
}
class Singleton {
    // 1.私有化构造器
    private Singleton() {
    }
    // 2.内部提供一个当前类的实例
    // 4.此实例也必须静态化
    private static Singleton single = new Singleton();
    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
        return single;
    }
}

题目13

/*
编写一个Employee类,声明为抽象类,
包含如下三个属性:name,id,salary。
提供必要的构造器和抽象方法:work()。
对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。
请使用继承的思想,设计CommonEmployee类和Manager类,要求类
中提供必要的方法进行属性访问。
 */
package com.jerry.exer;
/**
 * @author jerry_jy
 * @create 2022-09-30 10:48
 */
public class Exer4 {
    public static void main(String[] args) {
        Manager manager = new Manager("jerry", 1001, 1000, 2000);
        manager.work();
    }
}
abstract class Employee {
    String name;
    int id;
    double salary;
    public Employee() {
    }
    public Employee(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }
    public abstract void work();
}
class Manager extends Employee {
    double bonus;
    public Manager() {
    }
    public Manager(String name, int id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }
    @Override
    public void work() {
        System.out.println("working....");
    }
}

题目14

/*
编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个
Employee对象的生日,则将该雇员的工资增加100元。
实验说明:
(1)定义一个Employee类,该类包含:
private成员变量name,number,birthday,其中birthday 为MyDate类的对象;
abstract方法earnings();
toString()方法输出对象的name,number和birthday。
(2)MyDate类包含:
private成员变量year,month,day ;
toDateString()方法返回日期对应的字符串:xxxx年xx月xx日
(3)定义SalariedEmployee类继承Employee类,实现按月计算工资的员工处
理。该类包括:private成员变量monthlySalary;
实现父类的抽象方法earnings(),该方法返回monthlySalary值;toString()方法输
出员工类型信息及员工的name,number,birthday。
 */
package com.jerry.exer;
import java.util.Date;
/**
 * @author jerry_jy
 * @create 2022-09-30 11:17
 */
public class Exer5 {
    public static void main(String[] args) {
        MyDate date = new MyDate(2022, 9, 01);
        SalariedEmployee employee = new SalariedEmployee("jerry", 1001,date , 2000);
        employee.earnings();
        if (new Date().getMonth()+1==date.getMonth()){
            System.out.println("本月是你的生日,本月薪水:"+employee.getMonthlySalary()+100);
        }else {
            System.out.println("本月不是你的生日,本月薪水:"+employee.getMonthlySalary());
        }
        System.out.println(employee.toString());
    }
}
abstract class Employee1 {
    private String name;
    private int number;
    private MyDate birthday;
    public Employee1() {
    }
    public Employee1(String name, int number, MyDate birthday) {
        this.name = name;
        this.number = number;
        this.birthday = birthday;
    }
    abstract void earnings();
    @Override
    public String toString() {
        return "Employee1{" +
                "name='" + name + '\'' +
                ", number=" + number +
                ", birthday=" + birthday.toDateString() +
                '}';
    }
}
class MyDate {
    private int year, month, day;
    public MyDate() {
    }
    public MyDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public String toDateString() {
        String str = this.getYear() + "年" + this.getMonth() + "月" + this.getDay() + "日";
        return str;
    }
}
class SalariedEmployee extends Employee1 {
    private double monthlySalary;
    public SalariedEmployee() {
    }
    public double getMonthlySalary() {
        return monthlySalary;
    }
    public void setMonthlySalary(double monthlySalary) {
        this.monthlySalary = monthlySalary;
    }
    public SalariedEmployee(String name, int number, MyDate birthday, double monthlySalary) {
        super(name, number, birthday);
        this.monthlySalary = monthlySalary;
    }
    @Override
    void earnings() {
//        if (new Date().getMonth()== salariedEmployee.)
        System.out.println("本月工资:" + monthlySalary);
    }
}

题目15

/*
参照SalariedEmployee类定义HourlyEmployee类,实现按小时计算工资的
员工处理。该类包括:
private成员变量wage和hour;
实现父类的抽象方法earnings(),该方法返回wage*hour值;
toString()方法输出员工类型信息及员工的name,number,birthday。
 */
package com.jerry.exer;
/**
 * @author jerry_jy
 * @create 2022-09-30 15:31
 */
public class Exer6 {
    public static void main(String[] args) {
        MyDate1 birth = new MyDate1(2022, 9, 30);
        HourlyEmployee hourlyEmployee = new HourlyEmployee("jerry", 1001, birth, 8, 60);
        hourlyEmployee.earnings();
        System.out.println(hourlyEmployee.toString());
    }
}
abstract class Employee2 {
    private String name;
    private int number;
    private MyDate1 birthday;
    public Employee2() {
    }
    public Employee2(String name, int number, MyDate1 birthday) {
        this.name = name;
        this.number = number;
        this.birthday = birthday;
    }
    abstract void earnings();
    @Override
    public String toString() {
        return "Employee1{" +
                "name='" + name + '\'' +
                ", number=" + number +
                ", birthday=" + birthday.toDateString() +
                '}';
    }
}
class MyDate1 {
    private int year, month, day;
    public MyDate1() {
    }
    public MyDate1(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public String toDateString() {
        String str = this.getYear() + "年" + this.getMonth() + "月" + this.getDay() + "日";
        return str;
    }
}
class HourlyEmployee extends Employee2 {
    private int hour;
    private double wage;
    public HourlyEmployee() {
    }
    public HourlyEmployee(String name, int number, MyDate1 birthday, int hour, double wage) {
        super(name, number, birthday);
        this.hour = hour;
        this.wage = wage;
    }
    @Override
    void earnings() {
        System.out.println("工资:" + wage * hour);
    }
}

–end–

相关文章
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
40 2
|
16天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
22天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
18天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
41 4
|
19天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
68 4
|
26天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
15 2
|
1月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
55 5
|
30天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
22 1
|
1月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
30 3
|
1月前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
110 0
Java面试题之cpu占用率100%,进行定位和解决
下一篇
无影云桌面