Java基础知识面向对象作业—02
1、构造方法的格式是什么?有哪些注意事项?
公开的构造,外界可以创建对象;’
public className(){}
私有的构造,不可以创建对象
private className(){}
注意事项:构造方法在一次创建对象时只能加载一次;如果没有手动构造函数,虚拟机会自动生产一个无参无返回值的构造;
一旦手动构造了一个构造函数,则系统不会再提供任何的构造函数,建议在构造时顺带写一个空参构造;
2、构造方法可以重载吗? 里边可以有return语句吗?
构造方法可以重载,可以有不同参数列表的构造初始化函数,用来产生不同的初始化值;
可以有return 语句,但是不可以写真正的返回值,因为构造函数本身没有规定返回值类型;
3、给成员变量赋值有几种方式?有什么区别?
1.默认赋值;由虚拟机自动赋值
2.显示赋值;由用户手动赋值
3.构造函数赋值;由用户手动赋值
这三者对相同的变量赋值时会逐级覆盖;
4、public static void main(String[] args) {
Person p = new Person();
},这段代码在内存中做了哪些事情?
1.首先main函数进栈;
2.Person类的字节码文件加载进入方法区;
3.Person()构造方法加载进入方法区;
4.在栈中产生一个Person 类型的变量p;
5.在堆中产生了一个实例对象,p变量指向该实例对象;
5、需求:定义一个长方形类,定义求周长和面积的方法,然后定义一个测试类进行测试。
import java.util.Scanner;
class Rect {
private static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
//主函数入口
System.out.print("输入长方形的长:");
int longth = in.nextInt();
System.out.print("请输入长方形的宽:");
int width = in.nextInt();
Calc c = new Calc(longth,width);
int AllArea = c.calcArea();
int Alllongth = c.calcLongth();
System.out.println("周长为:"+Alllongth+",,面积为:"+AllArea);
}
}
class Calc{
static int longth;
static int width;
public Calc(int longth,int width){
this.longth = longth;
this.width = width;
}
public static int calcArea(){
int area = longth * width;
return area;
}
public static int calcLongth(){
int Alllongth = 2*(longth + width);
return Alllongth;
}
}
6、根据需求,完成如下代码(按照标准格式写:私有属性、空参有参构造、getset方法),并在测试类中进行测试。
需求一:
员工类Employee
属性:姓名name,工号id,工资salary
行为:显示所有成员信息的方法show()
class TestEmployee {
public static void main(String[] args) {
//主函数入口
Employee e = new Employee();
e.setName("steven");
e.setId("6666666");
e.setSalary(6666666);
e.show();
}
}
class Employee{
private String name;
private String id;
private double salary;
public Employee(){}
public Employee(String name,String id,double salary){
this.name = name;
this.id = id;
this.salary = salary;
}
public void setName(String name){
this.name = name;
}
public void setId(String id){
this.id = id;
}
public void setSalary(double salary){
this.salary = salary;
}
public String getName(){
return name;
}
public String getId(){
return id;
}
public double getSalary(){
return salary;
}
public void show(){
System.out.println("姓名:"+name+", ID:"+id+", Salary:"+salary);
}
}
需求二:
动物类Animal
属性:姓名name,年龄age
行为:吃饭eat,睡觉sleep
class TestAnimals {
public static void main(String[] args) {
//主函数入口
Animals a = new Animals();
a.setName("旺财");
a.setAge(5);
a.eat();
a.sleep();
}
}
class Animals{
private String name;
private int age;
public Animals(){}
public Animals(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public void eat(){
System.out.println(name+"喜欢吃骨头!");
}
public void sleep(){
System.out.println(name+"喜欢睡觉!");
}
}
需求三:
人类Person
属性:姓名name,年龄age,性别gender
行为:学习study,睡觉sleep
class TestPerson {
public static void main(String[] args) {
//主函数入口
Person p = new Person();
p.setName("Steven");
p.setAge(23);
p.setGender(true);
p.study();
p.sleep();
}
}
class Person{
private String name;
private int age;
private boolean gender;
public Person(){}
public Person(String name,int age,boolean gender){
this.name = name;
this.age = age;
this.gender = gender;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public void setGender(boolean gender){
this.gender = gender;
}
public void study(){
System.out.println(name+"爱学习!");
}
public void sleep(){
System.out.println(name+"又喜欢睡觉!");
}
}
7、static关键字有什么特点,使用的时候有什么注意事项?
被static 关键字修饰的成员可以通过类名直接调用;
被static 关键字修饰的变量存放于方法区的静态池中;
被static 关键字修饰的变量是公有的;
使用static可以节省空间内存,将同一属性值的变量存放在静态池中,也便于属性的维护与管理;
注意事项:静态方法只能调用静态的属性,不能调用非静态的属性;
反过来非静态方法可以调用静态以及非静态的属性;
在静态方法中不能使用this关键字,因为this是有对象产生的,而静态是由类产生的,且静态方法加载的时机先于对象,
可能导致在调用时,静态方法存在,而对象并不存在!
8、静态变量和非静态变量的区别是什么?
所属不同:静态属于类。非静态属于对象;
存在的内存空间不同:静态存在于方法区的静态池中,非静态存在于堆中;
内存时间(生命周期)不同:非静态从对象创建时存在,随对象的结束而结束;
静态从类第一次创建本类对象时而存在,随着类的产生而产生,随着类的结束而结束;
9、自学Random类,然后通过Random类来实现猜数字的小游戏。
import java.util.Scanner;
class Game {
private static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
//主函数入口
int cut = 0;
int num = (int)(Math.random()*100+1);
System.out.println("随机数已经产生,开始猜数!");
while(true){
int cs = in.nextInt();
cut++;
if(cs == num){
System.out.println("猜中了!!!");
break;
}else if(cs < num){
System.out.println("继续努力,猜小了");
}else{
System.out.println("继续努力,猜大了");
}
}
System.out.println("你一共猜了"+cut+"次,游戏结束!");
}
}
10、自学Random类,然后通过Random类来实现本班级的随机点名器
import java.util.Scanner;
class TestRollCall {
private static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
//主函数入口
RollCall rc = new RollCall();
System.out.println("请输入随机的次数:");
int times = in.nextInt();
int num = 0;
for(int i = 0;i<times;i++){
num = (int)(Math.random()*(rc.names.length)+1);
}
String name = rc.getName(num);
System.out.println("恭喜你,"+num+"号,"+name+"同学!");
}
}
class RollCall{
String[] names = {"罗俊雅","苟欢悦","敛涛","乾志新","幸艳蕙","弥寄蕾","申姮植",
"典丽","松雅惠","茅思萱","初浩歌","袁依云","卫同","甫枝智","刚敖怜","双汉","柔丽",
"长春燕","靖采蓝","阿贞韵","盖山雁","仇康时","彤俊远","从乐语","坚奥婷","撒凝静",
"僪思雁","弓思菱","毕晖霍","阳旭来","驰海甘","映天频","轩秀平","秀艾佴","光熙伍",
"良策","淦涵","菡瓮","千柔常","谧堵","心奉乐","安仉夜","柳问晓","露傅童","欣肖文",
"心夙莺","允灵秀","回安梦","礼自明","荤平萱","揭傲霜","邹添智","亓官芝","裘子童",
"素偲偲","佟诚蔚","合乐","郁紫","文鹿青","文孛溥","邝香岚"};
public String getName(int num){
return names[num-1];
}
}
11、自学Math类中的简单方法
java.lang 类 Math(直接在lang包下,不需要导包)
常用工具:
abs(int a)
返回 int 值的绝对值。
pow(double a, double b)
返回第一个参数的第二个参数次幂的值。
random()
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
sqrt(double a)
返回正确舍入的 double 值的正平方根。
PI
比任何其他值都更接近 pi(即圆的周长与直径之比)的 double 值。