选择题:
- A (不确定)
- D
- AC //this不能用于static方法里,故D错误; 在静态初始化块中不能直接访问非static成员,故A正确。
- BC //非静态方法必须采用对象.方法名来调用,不能直接调用 ,故B错误;java类如果存在继承,子类可以访问父类非私有方法,不仅仅是本类方法
- C
注意:
6. 静态不能访问非静态
7. this 不能用于静态方法中,this的本质就是“创建好的对象的地址”!
8. 在类方法中调用本类的类方法时可直接调用(x). 要注意非静态方法,不能直接调用静态方法,要通过对象.方法名来调用。见下例:
...
public void login() {
printCompany();
System.out.println(company);
System.out.println("登录:" + name);
}
public static void printCompany() {
// login();//调用非静态成员,编译就会报错 //静态方法不能访问非静态
System.out.println(company);
}
public static void main(String[] args) {
User2 u = new User2(101, "高小七");
User2.printCompany(); //调用静态方法格式:类名.
...
编程题:
1.
/**
* 第四章练习题
*
* @author 王立生
*
* 题目:编写 Java 程序
* 用于显示人的姓名和年龄。定义一个人类Person。
* 该类中应该有两个私有属性: 姓名 (name) 和年龄 (age) 。
* 定义构造方法用来初始化数据成员。再定义显示(display()) 方法将姓名和年龄打印出来。
* 在 main 方法中创建人类的实例然后将信息显示。
*/
public class Person {
String name;
int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public static void display(Person p){
System.out.println("姓名:"+p.name);
System.out.println("年龄:"+p.age);
}
public static void main(String[] args){
Person p=new Person("镜小月",23);
Person.display(p);
}
}
方法1:
package Exercise;
/**
* 第四章作业题
*
* @author 王立生
*
* 题目:定义一个圆类——Circle,
* 在类的内部提供一个属性:半径(r),
* 同时 提供 两个 方 法 : 计算 面积 ( getArea() ) 和 计算 周长(getPerimeter()) 。
* 通过两个方法计算圆的周长和面积并且对计算结果进行输出。
* 最后定义一个测试类对 Circle 类进行使用。
*
*/
public class Circle {
static double r;
public Circle(double r){
this.r=r;
}
public static void getArea(Circle cc){
double s=Math.PI *r*r; //此处调用r,静态不能调用非静态,故也应把上述r的定义加上static限制
System.out.println("面积为:"+s);
}
public static void getPerimeter(Circle cc){
double l=2*Math.PI * r;
System.out.println("周长为"+l);
}
public static void main(String[] args){
Circle cc=new Circle(1.23);
Circle.getArea(cc);
Circle.getPerimeter(cc);
}
}
方法2:
package Exercise;
/**
* 第四章练习题
*
* @author 王立生
*
* 编程题第二题方法二
*
* 题目:定义一个圆类——Circle,
* 在类的内部提供一个属性:半径(r),
* 同时 提供 两个 方 法 : 计算 面积 ( getArea() ) 和 计算 周长(getPerimeter()) 。
* 通过两个方法计算圆的周长和面积并且对计算结果进行输出。
* 最后定义一个测试类对 Circle 类进行使用。
*/
public class Circle2 {
double r;
//构造方法
Circle2(double r){
this.r = r;
}
public void getArea(){
System.out.println("面积:"+Math.PI*r*r);
}
public void getPerimeter(){
System.out.println("周长"+2*Math.PI * r);
}
public static void main(String[] args){
Circle2 cc=new Circle2(1.23);
cc.getArea();
cc.getPerimeter();
}
}
方法1与方法二的区别:
- 方法1 定义方法getArea和方法getPerimeter用了static 限制,说明这两个方法都是静态方法。静态方法的意思是,他们属于整个大超市(类)内,而不是属于某个小推车(对象),可以理解为超市将它们的位置信息给了小推车(此时小推车装的是地址(即:对象是地址))(即静态方法属于类,类把方法的地址给了对象)。因此后面在调用它们的时候,需要用超市名(类名).方法(对象)来调用,而不能用小推车名(对象名)来调用,并且要指定小推车即代码中的:
...
Circle.getArea(cc);
Circle.getPerimeter(cc);
...
- 方法2 没用静态定义方法getArea和getPerimeter,因此创建对象后,超市的所有东西都属于小推车(类里面所有内容均属于对象的了),故调用方法时,需要用小推车名来调用。即代码中的:
...
cc.getArea();
cc.getPerimeter();
...