(一)学习总结
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中是如何实现封装性的?试举例说明。
- 类中并不是所有的信息都能让用户可见的,因此隐藏这些信息就很有必要。这就是面向对象对封装的要求。
- 封装性的目的:保护当前类的某些属性和方法不被外部所见。
- 封装性的实现:Java的封装是通过private修饰符来声明属性和方法实现的。
作用域 当前类 同一包 子类 其他包
public √ √ √ √
protected √ √ √
default √ √
private √
- 实现该属性的get/set方法,为外部所访问。
-
封装后的属性不能像以前一样通过“对象.属性”访问该属性了。通过对象调用对应的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());
}
}
}
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原理相同,通过传入地址,直接在地址上进行修改;