zoukankan      html  css  js  c++  java
  • java技术第二次作业

    (一)学习总结

    1.什么是构造方法?什么是构造方法的重载?

    构造方法是用于对对象初始化的方法,当新对象被创建的时候,构造函数会被调用。
    每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。
    构造函数的重载是函数名与类名相同,参数类型不同,参数不同。
    1.构造方法的名称必须与类名一致
    2.构造方法的声明处不能有任何返回值类型的声明
    3.不能在构造方法中使用return
    4.当自己声明构造方法后,系统不再创建默认的无参构造方法
    下面的程序是否可以通过编译?为什么?

    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;
    }
    

    编译报错,只声明的对象数组,没有实现对象实例化,应该对数组里的每个对象元素,通过new构造方法进行实例化

    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,因为比较的是两个对象的引用地址,两个对象都是通过new开辟的不同的新的空间。

    4.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。

    1. 类中并不是所有的信息都能让用户可见的,因此隐藏这些信息就很有必要。这就是面向对象对封装的要求。
    2. 封装性的目的:保护当前类的某些属性和方法不被外部所见。
    3. 封装性的实现:Java的封装是通过private修饰符来声明属性和方法实现的。
      作用域 当前类 同一包 子类 其他包
      public √ √ √ √
      protected √ √ √
      default √ √
      private √
    4. 实现该属性的get/set方法,为外部所访问。
    5. 封装后的属性不能像以前一样通过“对象.属性”访问该属性了。通过对象调用对应的get/set方法。
      例如:
    public class Time {
    	private int year,month,day; //字段用private隐藏起来
    	public Time(){
    		
    	}
    	public Time(int year,int month,int day){
    		this.year=year;
    		this.month=month;
    		this.day=day;
    	}
    	public int getYear() {  //通过get,set方法读取隐藏数据
    		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 toString( ){
    		return year+"-"+month+"-"+day;
    	}
    }
    

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

    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字段是private私有的,不能直接访问操作。

    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();
        }
    }
    

    mothod方法是static修饰的,只能访问static修饰的字段,x不是。

    6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,

    书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,
    则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。

    class Book{
        int bookId;
        String bookName;
        double price;
        // 声明静态变量
        public static n;
        
        //定义静态代码块对静态变量初始化
       static {
              n=0;
        }
        //构造方法
        public Book(String bookName,double price ){
             this.bookName=bookName;
            this.price =price ;
            n++;
            this.bookId=1000+n;
        }
         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 int totalBook(){
              return n;
         }
        //重写toString方法
        public string toString(){
           return "编号"+bookld+“书名”+bookName+"价格"+"price "+"图书总数目为"+n;
        }
        
    }
    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());
            }
        }   
    }
    

    static的两个常用操作,统计该类的对象总数,实现自动编码。

    7.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。

    单例模式:保证一个类在使用过程中,只有一个实例。
    特点:这个类永远只有一个实例。

    class Sun{
          private Sun instance =  new Sun();
          private Sun(){ 
          }
          public static Sun getInstance(){
           return instance;
          }
    }
    

    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';
        }
    }
    

    结果:你好 Wolld
    str一开始将自己的引用复制给了局部str,但是局部str又引用了hello,当函数结束调用后,局部str释放,没有涉及远str的改动;
    字符数组和c原理相同,通过传入地址,直接在地址上进行修改;

    (二)实验总结

    1.用面向对象思想完成评分系统

    在裁判类中声明一个选手类,在测试类中通过构造方法引用到选手对象,在裁判对象里实现对选手对象的操作。

    2.Email验证

    没什么要注意的,定义一个方法,当条件都合法的时候,返回true,否则返回false,如果还想知道哪个条件不合法,可以在判断结构里直接输出提示,也可以返回
    特定数值,然后在主方法里,通过返回值判断哪个条件不合法。

    3.查找子串

    我的思路没有改变原字符串,而是在原字符串里一段一段枚举去找合法的子串,枚举的长度是要找子串的长度,从第一个字母开始找,如果这段是,则从这段后的字符开始再找(i+length),如果不是,从下一个字符判断(i++)。

    4.统计文件

    用split方法,将主串拆分;
    首字母变大写的实现方法有很多,我是先将字符串变成了字符数组,然后改变首字母,再通过构造方法变回字符串。
    统计数量: 用lastIndexOf方法找到最后出现点的位置,然后截取后面的子串,两层循环遍历,内层:先到第一个不为空的字符串,记录,变为空,然后找到下面
    所有相同的字符串,记录,变空,最后输出数目;外层:当数组全为空时退出。

    5.类的设计

    time类没有什么好说的,tostring方法输出规定格式;
    职员类:字段中有时间对象和部门对象;
    部门类: 字段中有时间对象,项目经理(职员对象),和职员数组(包括了项目经理);
    测试类:以部门对象为主要对象,外层循环实现部门对象,内层循环实现职员对象,第一个职员对象作为部门经理,最后职员对象数组传给部门对象;
    为了验证实现是否正确,遍历了所有部门以及部门中的职员;相关查询操作:总的来说,先遍历部门,在部门中职员,因为部门中有职员对象的引用,职员对象中
    也有部门对象引用,可以通过部门对象找到要找的职员,也可以通过职员找到部门,或者他的经理等等,查询很方便,在程序中我是查询的职员编号,然后输出了该职员的所有信息,包括他的部门和经理。

    (三)代码托管(务必链接到你的项目)


    https://gitee.com/hebau_java_cs16/Java_CS02tx

  • 相关阅读:
    【WPF】绘制柱状图、折线图、扇形图
    【WPF】获取容器宽高
    【SQL】SQL Server、MySQL、SQLite获取自增ID、自增ID清零
    【SQL Server操作】SQL Server重命名数据库及解决数据库无法分离的问题
    【数据迁移】MySQL数据库迁移到SQL Server
    【MySQL操作】MySQL导入导出数据库
    【MySQL操作】MySQL Workbench远程连接的一些操作
    【c#】遍历获得一个类的所有属性名
    vue 跨域 springCloud @CrossOrigin注解
    解决IDEA右侧maven不显示方法
  • 原文地址:https://www.cnblogs.com/TX980502/p/8666670.html
Copyright © 2011-2022 走看看