《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个职工的单位,实现对相关信息的查询功能。
三、代码托管(务必链接到你的项目)
码云提交历史截图
上传实验项目代码到码云,在码云项目中选择“统计-提交”,设置搜索时间段,搜索本周提交历史,并截图。