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
- day61(5.11)程序报错类型之不能在静态方法中引用非静态变量
- java静态方法中不能引用非静态变量
- Java中静态方法不能引用非静态变量
- 静态方法中引用非静态变量
- 静态方法不能调用非静态变量,非静态方法可以引用静态变量
- 静态方法中不能直接引用非静态变量,需要通过对象来引用
- java为什么不能在静态域或方法中引用类型变量?
- 静态方法中不能使用非静态变量
- day59(5.9)程序报错类型之类中的静态方法不能直接调用动态方法
- 静态方法:无法在静态上下文中引用非静态
- 静态方法:无法在静态上下文中引用非静态
- 不能对非静态字段/方法进行静态引用
- java中为什么静态方法不能访问非静态方法或者变量
- 静态方法为什么不能使用非静态成员变量
- C++中静态变量、常量、静态整型常量、静态非整型常量、引用变量的初始化方法
- 为什么在非静态const类型以及引用型成员变量必须在初始化列表里面初始化,不能在{}里面初始化?
- 非静态内部类中为什么不能存在静态变量
- 实例成员变量不能在静态方法中访问
- C++ GUI QT 第4版 之线程 -------总结
- 告别平庸的方法
- wampserver开启open_ssl
- Java线程:线程栈模型与线程的变量
- Android开源项目--1
- day61(5.11)程序报错类型之不能在静态方法中引用非静态变量
- 烤羊肉串“好巴郎”阿里木回乡代言民族团结
- Apache Mahout的Taste基于Hadoop实现协同过滤推荐引擎的代码分析
- NYOJ 81 炮兵阵地
- 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法
- mysql问题解决
- 五月的风温馨而婉约
- 【网站设计入门】网站设计初学者应该注意哪些基础问题?(一)
- jdbc 包含存储过程的主要连接数据库方法