• 《Java技术》第二次作业--面向对象基础


    一、实验总结
    1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
    (1)构造方法用于在创建对象是对其进行初始化
    Person per = newPerson();
    特点:1)方法名与类名相同;
    2)方法名前没有返回值类型的声明,方法中不能使用return语句返回一个值;
    3)用户不能直接调用,而是通过关键字new自动被调用;
    4)在构造方法的实现中,也可以进行方法重载。
    注:如果一个类没有声明一个明确的构造方法,则java运行时系统会自动提供缺省的构造方法,它没有任何参数,什么也不做。
    2.构造方法的重载
    方法的重载就是方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用。
    注:如果一个类中已经明确定义了构造方法,则系统不再提供默认的构造方法。因此,为了避免出现错误,在一个类中如果定义了一个有参的构造方法时,最好再定义一个无参的 构造类型。

    public class Test {
        public static void main(String args[]) { 
           Foo obj = new Foo();       
        }     
    }
    class Foo{
        int value;
        public Foo(int intValue){
            value = intValue;
        }
    }
    

    这个程序不能通过编译
    应该添加一个无参的构造函数
    2.运行下列程序,结果是什么?分析原因,应如何修改。

      public class Test {
        public static void main(String[] args) {
            MyClass[] arr=new MyClass[3];
            arr[1].value=100;
        }
    }
    class MyClass{
        public int value=1;
    }
    

    运行结果

    原因:对象为初始化就直接引用对象值或方法
    3.运行下列程序,结果是什么?说明原因。

    public class Test {
        public static void main(String[] args) {
            Foo obj1 = new Foo();
            Foo obj2 = new Foo();
            System.out.println(obj1 == obj2);
        }
    }
    class Foo{
        int value = 100;
    }
    

    运行结果为:false。
    obj1和obj2的地址空间不同,在堆中的连续两个空间中,所以obj1和obj2不相等,所以返回false
    4.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
    类的封装性即不能让外面的类随意修改一个类的成员变量。
    在定义一个类的成员(包括变量和方法),使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用。
    为了实现封装性,常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问呢。对一个变量的操作,一般都有读取和赋值操作,我们一般定义两个方法来实现这两种操作,即getXxx()与setXxx()

    setter:
    	public void setBalance(int balance){
    	this.balance=balance;
    }
    getter:
    	public int getBalance(){
    	return balance;
    }
    

    5.阅读下面程序,分析是否能编译通过?如果不能,说明原因。
    (1)

    class A{
        private int secret = 5;
    }
    public class Test{
        public static void main(String args[]){
            A a = new A();
            System.out.println(a.secret++);
        }
    }
    

    不能通过编译
    没有创建secret的getter和setter
    (2)

    public class Test{
        int x = 50;
        static int y = 200;
        public static void method(){
            System.out.println(x+y);
        }
        public static void main(String args[]){
            Test.method();
        }
    }
    

    不能通过编译
    不能对非静态字段X进行静态引用
    6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。

    class Book{
    int bookId;
    String bookName;
    double price;
    // 声明静态变量
    public static int x;
    //定义静态代码块对静态变量初始化
    public Book(){
    }
    public Book(String bookName,double price){
        this.bookId=bookId+(x++);
        this.bookName=bookName;
        this.price=price;
    }
     public String getBookName() {
        return bookName;
    }
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }  
    //定义方法求图书总册数
    public static int totalBook(){
        return x;
    }
    //重写toString方法
    public String toString(){
        return "编号:"+this.bookId+"  书名:"+this.bookName+"  价格:"+this.price +"  图书总数目为:"+x;
     }
    }
    public class Test{
    public static void main(String args[]){ 
        Book[] books = {new Book("c语言程序设计",29.3),
                        new Book("数据库原理",30),
                        new Book("Java学习笔记",68)};
        System.out.println("图书总数为:"+ Book.totalBook()); 
        for(Book book:books){
            System.out.println(book.toString());
        }
    }   
    }
    

    7.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。
    在设计一个类时,需要保证在整个程序运行期间针对该类只存在一个实例对象。
    构造方法私有化(用private修饰)
    在类内创建一个实例对象,用私有静态成员instance引用该对象
    定义静态方法getInstance()返回实例对象instance

    class sunleton{
    	private sunleton(){}
    	public static final sunleton instance = new;
    	sunleton();
    }
    

    8.理解Java参数传递机制,阅读下面的程序,运行结果是什么?说明理由。

    public class Test {
        String str = new String("你好  ");
        char[] ch = { 'w','o','l','l','d' };
        public static void main(String args[]) {
            Test test = new Test();
            test.change(test.str, test.ch);
            System.out.print(test.str);
            System.out.print(test.ch);
        }
        public void change(String str, char ch[]) {
            str = "hello";
            ch[0] = 'W';
        }
    }
    

    运行结果:

    调用change方法,在change方法中改变了str的值,没有改变主方法中str的值。而ch代表数组的地址,调用change方法改变了ch第一个字符的值后将ch传回主方法。
    9.其他需要总结的内容。
    内部类是指一个类的内部还包含了另一个的一个操作类,被包含的类称为内部类,包含的类称为外部类。
    内部类如果被外部类调用,一定要先产生外部类的实例对象,之后再产生内部类的实例化对象。
    静态内部类:
    用static声明内部类
    静态内部类只能访问外部类的静态成员,而不能访问外部的非静态成员。
    在任何非静态内部类中,都不能与静态数据,静态方法或者一个静态内部类。只有静态内部类才可以声明静态成员。
    二、实验总结
    1.用面向对象思想完成评分系统
    创建三个类 选手类,评分类,测试类 ,各自都有自己的基本属性。定义构造方法getter和setter方法
    2.Email验证
    创建一个布尔类型方法判断email是否有效
    3.查找子串
    输入字符串和要查找的字符串使用indexOf("")找到下标位置并记录下来
    4.统计文件
    字符串用,分隔开,字符串数组用 . 拆分,最后统计每个文件类型出现的次数
    5.类的设计
    设计四个类
    一个日期类,用于记录年、月、日,提供对日期处理的常用方法(日期输出格式xxxx-xx-xx)。
    一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加工作时间,设计相应的方法。
    一个部门类,包括下列属性:部门编号,部门名称,经理,设计相应方法。
    一个测试类,采用对象数组模拟一个拥有两个部门,10个职工的单位,实现对相关信息的查询功能。
    三、代码托管(务必链接到你的项目)
    码云提交历史截图
    上传实验项目代码到码云,在码云项目中选择“统计-提交”,设置搜索时间段,搜索本周提交历史,并截图。

  • 相关阅读:
    Docker
    mysql+centos7+主从复制
    scrapy-redis使用以及剖析
    Python数据库连接池DBUtils
    MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】
    揭开Socket编程的面纱
    Linux环境下安装python3.6
    Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    WebSocket源码剖析
    1.1 MySQL用户管理及SQL语句详解
  • 原文地址:https://www.cnblogs.com/wy97/p/8674442.html
Copyright © 2020-2023  润新知