day61(5.11)程序报错类型之不能在静态方法中引用非静态变量

来源:互联网 发布:淘宝客服工作要求 编辑:程序博客网 时间:2024/06/03 19:12
paramTest中这段程序正常中,中间遇到三个问题:
1、对于声明或声明且赋值可以写在非块中,其它都要写到块中才可以(原因是因为自己不小心将大括号弄到这个块的中间了)
2、写的内部类是动态的,也就是开头以public class开头。而主程序是public static class main。在Java中,类中的静态方法不能直接调用动态方法。只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法。所以在不做其他变动的情况下,最简单的解决办法是将public class改为public static class.,所以我要在Employee前面加上static (这个问题不止一次了,解决这个问题有些熟悉,有些印象深刻了

3、Cannot make a static reference to the non-static field name,意思是,不能在静态方法中引用非静态变量,所以为了,能够引用静态变量,我们就要将这个变量 变成静态的。解决方法是将下面定义的地方加static

package package1;

import package1.StaticTest.Employee;

public class ParamTest {
private static Object Employee;
public static void main(String[] args){
System.out.println("Testing tripleValue:");
double percent=10;
System.out.println("Before:percent="+percent);
tripleValue(percent);
System.out.println("After:percent="+percent);
System.out.println("\nTesting tripleSalary:");
Employee harry=new Employee("Harry",50000);
tripleSalary(harry);
System.out.println("After:salary="+harry.getSalary());
System.out.println("\nTesting swap:");
Employee a=new Employee("Alice",70000);
Employee b= new Employee("Bob",60000);
System.out.println("Before:a="+a.getName());
System.out.println("Before:b="+b.getName());
swap(a,b);
System.out.println("After:a="+a.getName());
System.out.println("After:b="+b.getName());
}


public static void tripleValue(double x){
x=3*x;
System.out.println("End of method:x="+x);
}
public static void tripleSalary(Employee x){
x.raiseSalary(200);
System.out.println("End of method:salary="+x.getName());
}
public static void swap(Employee x,Employee y){
Employee temp=x;
x=y;
y=temp;
System.out.println("End of method:x="+x.getName());
System.out.println("End of method:y="+y.getName());
}
 static class Employee{
public Employee(String n,double s){
  name=n;
salary=s;
}
public String getSalary() {
// TODO Auto-generated method stub
return null;
}
public void raiseSalary(int i) {
double byPercent = 0;
double raise=salary*byPercent/100;
salary+=raise;
}
public String getName(){
return name;
}
}
public double getSalary(){
return salary;
}
public void raiseSalary(double byPercent){
double raise=salary *byPercent/100;
salary+=raise;
}
private  static String  name;
private static double salary;

}
结果:
程序二:
constructorTest.java程序还算顺利没有遇到什么问题:
/*(程序头部注释开始)
 * 程序的版权和版本声明部分
 * copyright (c)2014
 * All right reserved.
 * 文件名称:
 * 作者:章燕娜
 * 完成日期:2014.05.11
 * 版本号:001
 * 对任务的求解的描述部分
 * 输入描述:
 * 问题的描述:使用定义一个类对程序进行练习,按照标准的类的定义方法来使定义一个类,并使用。
 *
 *
 */
package package1;

import java.util.Random;

public class ConstructorTest {
public static void main(String[] args){
Employee[] staff=new Employee[3];
staff[0]=new Employee("Harry",40000);
staff[1]=new Employee(60000);
staff[2]=new Employee();
for (Employee e:staff)
System.out.println("name="+e.getName()+",id"+e.getID()+",salary+"+e.getSalary());
}
static  class Employee{

public Employee(String n,double s){
name=n;
salary=s;
}
public int getID() {
// TODO Auto-generated method stub
return id;
}
public Employee(double s){
this("Employee#"+nextID,s);
}
public Employee() {
// TODO Auto-generated constructor stub
}
public String getName(){
return name;
}
public double getSalary(){
return id;
}
private String name;
private static int nextid;
private int id;
private double salary;
private static String nextID;//默认生成的定义域一般会生成在上面,而我标准将它们都移到下面是为了养成良好的代码习惯
                             //前面的笔记也提到过标准的类的书写格式应该是:
                             //公有访问特性部分
                             //包作用域访问特性部分
                             //私有访问特性部分
                             //实例方法
                                     //静态方法
                                     //实例域
                             //静态域,所以将默认生成的静态域都移到下面。
}
static {
Random generator=new Random();
int nextID = generator.nextInt(1000);
}
private Object nextID;
private int nextId;
private Object id;
{
id=nextID;
nextId++;
}

}
结果:

程序三:前面理论这部分看过了,现在开始实践,从第二个程序开始,练习就越发顺当的。中间没有遇到什么大的问题。
/*(程序头部注释开始)
 * 程序的版权和版本声明部分
 * copyright (c)2014
 * All right reserved.
 * 文件名称:
 * 作者:章燕娜
 * 完成日期:2014.05.11
 * 版本号:001
 * 对任务的求解的描述部分
 * 输入描述:
 * 问题的描述:使用定义一个类对程序进行练习,按照标准的类的定义方法来使定义一个类,并使用。
 * 在程序constructor的基础上练习extends
 *
 *
 */
package package1;

import java.util.Date;
import java.util.GregorianCalendar;//因为代码中用到了gregorianCalendar这个日期的类,所以要导包。

public class ManagerTest {
public static void main(String[] args){
Manager boss=new Manager("Carl Cracker",80000,1987,12,15);
boss.setBonus(5000);
Employee[] staff=new Employee[3];//
staff[0]=boss;
staff[1]=new Employee("Harry Hacker",50000,1989,10,1);
staff[2]=new Employee("Harry Hacker",40000,1990,3,15);
for (Employee e:staff)
System.out.println("name="+e.getName()+",salary+"+e.getSalary());
}
}


 class Employee{
 
public Employee(String n,double s,int year,int month,int day){
name=n;
salary=s;
GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
hireDay=calendar.getTime();
 
 }
public String getName(){
return name;
}
public  double getSalary(){
return salary;
}
public Date getHireDay(){
return hireDay;
}
public void raiseSalary(double byPercent){
double raise=salary*byPercent/100;
salary+=raise;
}
private String name;//域要放到最后,所以放在class Employee块的最后了。
private double salary;
private Date hireDay;
 }

 class Manager extends Employee{


public Manager(String n, double s, int year, int month, int day) {
 super(n,s,year,month,day);
 bonus=0;
}
 public void setBonus(double b){
 bonus=b;
 }
 private double bonus;//定义域
 }

程序三:类型不匹配
/*(程序头部注释开始)
 * 程序的版权和版本声明部分
 * copyright (c)2014
 * All right reserved.
 * 文件名称:
 * 作者:章燕娜
 * 完成日期:2014.05.11
 * 版本号:001
 * 对任务的求解的描述部分
 * 输入描述:
 * 问题的描述:使用定义一个类对程序进行练习,按照标准的类的定义方法来使定义一个类,并使用。
 * 在程序constructor的基础上练习extends
 *
 *
 */
package package1;

import java.util.Date;
import java.util.GregorianCalendar;

public class PersonTest {
public static void main(String[] args){
Person[] people=new Person[2];
people[0]=new Employee("Harry Hacker",50000,1989,10,1);
people[1]=new Student("Mariz Morris","computer science");
for (Person p:people){
System.out.println(p.getName()+p.getDescription());
}
}

}
abstract class Person{
public Person(String n){
name=n;
}
public  String getDescription() {
return null;
} public String getName(){
return name;
}
private String name;
class Employee extends Person{

public Employee (String n,double s,int year,int month,int day){
super(n);
salary=s;
GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
hireDay=calendar.getTime();
}
public double getSalary(){
return salary;
}
public Date getHireDay(){
return getHireDay();
}
public String getDescription(){
return String.format("an employee with a salary of $5.2f",salary);
}
public void raiseSalary(double byPercent){
double raise=salary*byPercent/100;
salary+=raise;
}
private Date hireDay;
private double salary;
}
class Student extends Person{
public Student(String n,String m){
super(n);
major=m;
}
public String getDescription(){
return "a student majoring in"+major;
}
private String major;
}
}
明天继续研究personTest,equalTest,ArraylistTest三个程序

0 0
原创粉丝点击