java第二次作业

(一)学习总结
1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
构造方法用于创建对象时对其进行初始化,例如:Person per=new Person();
特点:1:方法名与类名相同 2:用户不能直接调用,而是通过关键字new
构造方法的重载就是方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
答:这个程序不能编译
原因:因为在Foo里面的方法是含参构造方法,而在测试类里面的方法是无参构造,所以有错误,不能完成编译。
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;
}
并没有结果
原因:还没有给arr[1]初始化,就开始给arr[1]赋值,并且也没有输出
修改:arr[1]=new MyClass(); 再添加一个输出结果
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
4.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
封装是把对象的所有组成部分(数据和方法)封装在一起构成类
对象本身的数据得到保护,隐藏
其他对象通过该对象的访问方法(接口/interface)与之联系。
封装属性的设置和取得依靠setter和getter方法完成
setter设置属性的值
例:public void setBalance(int balance){
this.balance=balance;
}
getter 调用该属性的值
public int getBalance(){
return balance;
}
注意:private修饰符:只能被该类自身访问
public 修饰符:可以被所有其他类引用
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++);
}
}
不能通过编译
原因:因为在A这个类里面定义的secret 属于私有属性,只能在它自己的类里面访问,题目中在测试类里面访问显然不对
(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和y 的类型不同,y是静态的,x不是
6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。
class Book{
int bookId;
String bookName;
double 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;
}  
//定义方法求图书总册数

//重写toString方法
public String toString(){
           return "编号:"+bookId+",书名“+bookName+”书价“+price+”:“;
}

}
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。
class Sun{
private static Sun instance =new Sun();
private Sun(){}
public static Sun getInstance(){
return instance;
}
}
单例模式:在设计一个类时,需要保证在整个程序运行期间针对该类只存在一个实例对象
构造方法私有化(用private 修饰)
在类内创建一个实例对象,用私有静态成员instance引用该对象
定义静态方法getInstance()返回实例对象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
9.其他需要总结的内容
【1】对象的使用通过“.”可以实现对属性的访问和方法的调用。
a:引用对象的属性
对象名.属性名
b:调用对象的方法
对象名.成员方法名(实参表)
对象使用前必须实例化
【2】:对象的引用传递
引用传递是指一个堆内存空间,可以同时被多个栈内存所指向,每个栈内存空间都可以修改堆内存的内容

【3】对象的撤销和清理
垃圾空间是指没有任何栈内存指向的堆内存空间,JAVA运行系统具有垃圾回收机制,由一个垃圾回收器程序实现,会不定期释放不用的内存空间。也可以调用方法System.gc()请求垃圾收集
1:对象的引用被赋值为null
Person p=new Person(); p=null;
2:一次性使用的匿名对象(不建议)
new Person().sayHello();变量
3:超出生命期
for(int i<=0;i<=1000;i++){
Person p=new Person();
}
(二)实验总结
1.用面向对象思想完成评分系统
程序设计思路:创建三个类:1:创建选手类:声明成员变量 编号,姓名,得分 定义无参构造方法 含有参数,编号,姓名的构造方法 给每个属性定义get 和
set方法 toString()方法输出选手的所有属性消息 对选手的最后得分进行比较
2:创建评分类:声明成员变量 评委人数 ,评委给出的分数 score(数组)(此时不能对数组分配空间) 定义无参构造方法 含有一个参数的构造方法(评委人数)的构造方法
每个属性的get set 方法 打分,首先对成员变量分数score 数组分配内存空间 分数从键盘录入 再分别定义方法求最后分数,最大值,最小值
3:创建测试类 输入选手数 根据选手数,调用含参构造方法创建选手对象那数组,分配内存空间 输入评委数 根据评委数,调用含参构造方法创建打分类对象 利用循环结构给每个选手打分 输入选手编号 输入选手姓名 调用含有编号和姓名参数的构造方法对player 数组元素player[i]进行实例化 调用打分类对象的打分方法inputScore对选手打分 调用打分类对象的get方法得到评委给出的所有分数,并将输出评委打的分数 调用大打分类中计算最后得分的方法得到该选手的最后得分 调用选手类的set方法设置该选手的最后得分 然后对选手按照得分排序,输出排行榜
问题1:在评分类中求最小值那里出现了问题
原因:最小值一开始不能赋值为0
解决方案:把double Max=0改为double Min=Max(fscore)
2.Email验证
程序设计思路:构造Scanner对象,并与System.in相关联 调用Scanner的方法完成email的输入操作,定义一个判断条件的函数,调用它令他等于一个字符,当字符等于1,条件满足,email地址有效,否则无效 在判断条件的函数中,利用indexOf来判断@和.是否存在,再利用startsWith endsWIth判断首尾的条件,都满足返回1
3.查找子串
程序设计思路:
首先用Scanner方法输入你要输入的字符串和你要查找的字符串定义一个函数用于查找字符串和计算字符串出现的次数,在函数中将字符串转换为字符数组,if语句判断输入字符串中是否存在指定字符,如果存在利用for循环计算指定字符出现的次数,最后返回指定字符出现的次数和
4.统计文件
程序设计思路:用Scanner输入字符串,构造一个函数统计数量,先拆分各个字符串,利用for循环统计各个文件扩展名类型的数量,然后拆分第一个字母,输出字符串,把第一个字母变大写加上后面的字符串,再输出各个字符串的数量。
(三)代码托管(务必链接到你的项目)

posted @ 2018-04-01 17:00  杨朝鸽  阅读(461)  评论(1编辑  收藏  举报