精华内容
下载资源
问答
  • java写一个Person,包含name、age、sex属性,再写一个Student继承Person,增加School属性,并实例化。(用构造方法实现,并使用super())
  • 相对于toString方法,代码简洁 , 无须任何配置, Model 属性变化 , 无需修改 toString缺陷:安全性问题 , 反射私有属性值也会暴露 . 为了防止暴露,我们可以重写accept方法,剔除不想暴露的属性。改进:利用...

    昨天看视频无意间看到这个工具,终于不用重写toString方法了。

    相对于toString方法,代码简洁 , 无须任何配置, Model 属性变化 , 无需修改 toString

    缺陷:安全性问题 , 反射私有属性值也会暴露 . 
    为了防止暴露,我们可以重写accept方法,剔除不想暴露的属性。

    改进:利用ToStringBuilder弥补(通过 ReflectionToStringBuilder 子类 , 覆盖其 accept 方法来加以筛选 )

    示例代码如下:

    public String toString() {
    
        return (new ReflectionToStringBuilder(this) {
    
            protected boolean accept(Field f) {
    
            return super.accept(f) && !f.getName().equals(“password”);
    
        }}).toString();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    代码解释: toString 方法会跳过名为 password 属性

    ToStringStyle 抽象类与设计模式

    ToStringBuilder 封装 的三个属性 : 
    /**

    • Current toString buffer, not null.

    */

    private final StringBuffer buffer;//封装最终结果

    /**

    • The object being output, may be null.

    */

    private final Object object;//toString 对象

    /**

    • The style of output to use, not null.

    */

    private final ToStringStyle style;

    关于类型ToStringStyle 在 ToStringBuilder 源码中的利用 ,

    ToStringBuilder 类中所有的方法 append 都是通过调用属性 style 相应方法实现 .

    ToStringStyle 设计模式 : 单例模式的衍生,返回子类对象

    本文小结 :

    ①ToStringBuilder分而治之, 通过属性 ToStringBuilder 来分离功能的调用与实现 . ②子类达到多态的单例少见, 通过子类 StandardToStringStyle 提供了一个更为灵活的扩展 .

    ③具体实现大家可以参考 ReflectionToStringBuilder 源码 .


    展开全文
  • Java属性方法

    千次阅读 2018-01-31 16:38:55
    1.的定义形式 定义的一般形式如下 [定义修饰符] class { //体 [成员变量声明] [构造函数] ...我们通常说的对象,对象的属性方法。 2.属性(变量)的分类: 变量:独立于方法之外的变量,用

    1.类的定义形式

    类定义的一般形式如下

    [类定义修饰符] class <类名>

    { //类体

    [成员变量声明] [构造函数]

    [成员方法]

    }

    [类定义修饰符] class  <类名>   {   
    
      //类体
    
      [成员变量声明] [构造函数]
    
      [成员方法]
    
    }

    我们通常说类的对象,对象的属性和方法。

    2.属性(变量)的分类:


    • 类变量:独立于方法之外的变量,用 static 修饰。
    • 实例变量:独立于方法之外的变量,不过没有 static 修饰。
    • 局部变量:类的方法中的变量。
    public class Variable{
    
        static int allClicks=0;    // 类变量
    
        String str="hello world";  // 实例变量
    
        public void method(){
    
            int i =0;  // 局部变量
    
        }
    }

    类变量(静态变量)


    • 类变量也称为静态变量,在类中以static关键字声明,但必须在方法构造方法和语句块之外。
    • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
    • 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。
    • 静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。
    • 静态变量在程序开始时创建,在程序结束时销毁。
    • 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型。
    • 默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
    • 静态变量可以通过:ClassName.VariableName的方式访问。
    • 类变量被声明为public static final类型时,类变量名称一般建议使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致。

    public class Employee {
        //salary是静态的私有变量
        private static double salary;
        // DEPARTMENT是一个常量
        public static final String DEPARTMENT = "开发人员";
        public static void main(String args[]){
        salary = 10000;
            System.out.println(DEPARTMENT+"平均工资:"+salary);
        }
    }

    Run As ——Java Application

    开发人员平均工资:10000.0

    实例变量


    • 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
    • 当一个对象被实例化之后,每个实例变量的值就跟着确定;
    • 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
    • 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
    • 实例变量可以声明在使用前或者使用后;
    • 访问修饰符可以修饰实例变量;
    • 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
    • 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
    • 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
    public class Employee{
       // 这个实例变量对子类可见
       public String name;
       // 私有变量,仅在该类可见
       private double salary;
       //在构造器中对name赋值
       public Employee (String empName){
          name = empName;
       }
       //设定salary的值
       public void setSalary(double empSal){
          salary = empSal;
       }  
       // 打印信息
       public void printEmp(){
          System.out.println("名字 : " + name );
          System.out.println("薪水 : " + salary);
       }
    
       public static void main(String args[]){
          Employee empOne = new Employee("RUNOOB");
          empOne.setSalary(1000);
          empOne.printEmp();
       }
    }

    Run As ——Java Application

    $ javac Employee.java 
    $ java Employee
    名字 : RUNOOB
    薪水 : 1000.0

    Java 局部变量


    • 局部变量声明在方法、构造方法或者语句块中;
    • 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
    • 访问修饰符不能用于局部变量;
    • 局部变量只在声明它的方法、构造方法或者语句块中可见;
    • 局部变量是在栈上分配的。
    • 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
    public class Test{ 
       public void pupAge(){
          int age = 0;
          age = age + 7;
          System.out.println("小狗的年龄是: " + age);
       }
    
       public static void main(String args[]){
          Test test = new Test();
          test.pupAge();
       }
    }

    Run as ——Java Application

    小狗的年龄是: 7

    3.方法的分类

    方法的结构

    方法声明写在代码中类声明的内部,方法声明的外部,伪代码如下:
    public class Hello{
        //无参方法
        修饰符 返回值类型 方法名(){
        ...
        }
        //有参方法
        修饰符 返回值类型 方法名(参数类型 参数){
        ...
        }
    }
    import java.util.Scanner;
    
    /** 
     * 1.无参无返回值 public void methodName(){ 
     *  
     * } 
     *  
     * 2.无参有返回值 public int methodName(){ return 1; } 
     *  
     * 3.有参无返回值 public void methodName(String name){ 
     *  
     * } 
     *  
     * 4.有参有返回值 public int methodName(String name){ return 2; } 
     *  
     * @author cc 
     * 
     */   
    public class Method4Demo {  
    
        //构造方法
        public Method4Demo() {
    
        }
    
        // 无参数无返回值(这种方法是最容易懂的,在主方法下面直接调用方法即可)  
        public static void max() {  
            int a = 4;  
            int b = 5;  
            if (a > b) {  
                System.out.println("max:" + a);  
            } else {  
                System.out.println("max:" + b);  
            }  
        }  
    
        // 无参数有返回值返回值为int整型  
        public static int max1() {  
            int a = 20;  
            int b = 30;  
            int m = 0;// 设一个max的变量m,  
            if (a > b) {  
                m = a;// 如果为true,最大值为a  
            } else {  
                m = b;// 如果为folse,最大值为b  
            }  
            return m;// 这里返回的是变量m的值  
    
        }  
    
        // 有参数有返回值,返回的是boolean类型的变量  
        /** 
         * Scanner scanner = new Scanner(System.in);引用Scanner类包 
         * System.out.print("请输入一个年份:");标准输出格式 
         * int y = scanner.nextInt();设置一个表示年份的的变量 
         *  
         * 调用参数为y的这个方法,运行结果返回的这个boolean类型的值(result)并赋值给zhenjia变量; 
         *  
         * boolean zhenjia = isLeapYear(y); 
         *  
         * System.out.println(zhenjia ? y+"是闰年" : y+"不是闰年");输出结果采用了三目运算符, 
         *  
         * @param cc 
         * @return 
         */  
        public static boolean isLeapYear(int year) {  
            boolean result;  
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {  
                result = true;//是闰年 结果为true赋值给变量result;  
            } else {  
                result = false;//不是闰年 结果为false赋值给变量result;  
            }  
    
            return result;  
        }  
    
      //程序入口
        public static void main(String[] args) {  
            max();// 调用这个无参数无返回值的方法  
    
            int n;// 这里设一个接受max1方法结果的整型变量n。或者是(int n = max1;)  
            n = max1();  
            System.out.println("max1:" + n);// 输出这个  
    
            Scanner scanner = new Scanner(System.in);  
            System.out.print("请输入一个年份:");  
            int y = scanner.nextInt();  
            boolean zhenjia = isLeapYear(y);  
            System.out.println(zhenjia ? y + "是闰年" : y + "不是闰年");  
        }
    } 

    Run As ——Java Application
    这里写图片描述

    这里的构造方法只需知道有这么个方法就行,具体的在后面讲

    展开全文
  • 再定义显示display方法将姓名和年龄打印出来。 在main方法中创建人类的实例然后将信息显示。 代码如下: /* * 编写Java程序用于显示人的姓名和年龄。 * 定义一个人类Person该中应该有两个私有属性姓名name和年龄...

    编写Java程序用于显示人的姓名和年龄。 定义一个人类Person该类中应该有两个私有属性姓名name和年龄age。定义构造方法用来初始化数据成员。再定义显示display方法将姓名和年龄打印出来。 在main方法中创建人类的实例然后将信息显示。

    代码如下:

    /*
     * 编写Java程序用于显示人的姓名和年龄。
     * 定义一个人类Person该类中应该有两个私有属性姓名name和年龄age。
     * 定义构造方法用来初始化数据成员。再定义显示display方法将姓名和年龄打印出来。
     * 在main方法中创建人类的实例然后将信息显示。
     */
    
    public class Person {
    	public static void main(String[] args) {
    		Person person = new Person("abc", 12);
    		System.out.println(person.display());
    	}
    
    	private String name;
    	private int age;
    
    	public Person() {
    		super();
    	}
    
    	public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public String display() {
    		return "Person [name=" + name + ", age=" + age + "]";
    	}
    
    }
    
    展开全文
  • 我们在打印日志的过程中,经常需要复写父类的toString方法,如果一个一个的去拼接属性名和属性值,那么代码会显得非常冗余,重复性很大。我们完全可以按照反射来快速获取。 比如我们的bean,核心在于toString方法...

    我们在打印日志的过程中,经常需要复写父类的toString方法,如果一个一个的去拼接属性名和属性值,那么代码会显得非常冗余,重复性很大。我们完全可以按照反射来快速获取。

    比如我们的bean类,核心在于toString方法。

    public class Bean {
    	
    	private String name = "abc";
    	
    	private String age = "15";
    	
    	private boolean success = true;
    	
    	private Long money = 5000L;
    	
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getAge() {
    		return age;
    	}
    
    	public void setAge(String age) {
    		this.age = age;
    	}
    
    	public boolean isSuccess() {
    		return success;
    	}
    
    	public void setSuccess(boolean success) {
    		this.success = success;
    	}
    
    	public Long getMoney() {
    		return money;
    	}
    
    	public void setMoney(Long money) {
    		this.money = money;
    	}
    
    	@Override
    	public String toString(){
    		// 要打印出来的日志
    		StringBuffer result = new StringBuffer();
    		try {
    			// 获得当前类的Class
    			Class<? extends Bean> clazz = this.getClass();
    			
    			// 获取当前类的全部属性
    			Field [] fields = clazz.getDeclaredFields();
    			for (Field field : fields) {
    				
    				// 遍历属性得到属性名
    				String fieldName = field.getName();
    				
    				// 如果是用于序列化的直接过滤掉
    				if ("serialVersionUID".equals(fieldName)) {
    					continue;
    				}
    				
    				// 判断属性的类型,主要是区分boolean和其他类型
    				Class<?> type = field.getType();
    				
    				// boolean的取值是is,其他是get
    				String methodName = (type.getTypeName().equals("boolean")?"is":"get")
    						+ fieldName.substring(0,1).toUpperCase() 
                            + fieldName.substring(1, fieldName.length());
    				
    				Method method;
    				java.lang.Object resultObj;
    				
    				// 通过方法名得到方法对象
    				method = clazz.getMethod(methodName);
    				
    				// 得到这个方法的返回值
    				resultObj = method.invoke(this);
    				
    				// 将属性名和它对应的值进行匹配打印
    				if (resultObj != null && !"".equals(resultObj)) {
    					result.append("[").
                             append(fieldName).append("]").append(resultObj).append(" ");
    				}
    			}
    		} catch (SecurityException | NoSuchMethodException | IllegalAccessException 
                  | IllegalArgumentException | InvocationTargetException e) {
    			e.printStackTrace();
    		}
    		return result.toString();
    	}
    }

    测试代码:

    	public static void main(String[] args) {
    		Bean bean = new Bean();
    		System.out.println(bean.toString());
    	}

    执行结果:

    [name]abc [age]15 [success]true [money]5000 

     

    展开全文
  • Java 类属性

    千次阅读 2018-12-15 17:40:26
    当一个属性被static修饰的时候,就叫做类属性,又叫做静态属性  当一个属性被声明成类属性,那么所有的对象,都共享一个值  与对象属性对比:  不同对象的 对象属性 的值都可能不一样。  比如盖伦的hp 和 提莫的...
  • java打印对象中的属性名和值

    千次阅读 2016-12-08 16:46:36
    方法一:只能打印第一层的属性,如果属性为对象,则不能递归,后期可以完善 public static String toString(Object obj, Class clazz) { if(obj == null){ return ""; } Field[] fields = clazz....
  • Java 属性

    千次阅读 2019-09-26 08:56:53
    章节Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符串 Java Math Java 布尔运算 Java If … Else Java ...
  • 显然可以提高java灵活性和增加应用场景 核心 Class c=Class.forName("reflection.User"); 这里声明一个的对象(注意Class中c是大写,class是关键字) 然后获取路径(包名+类名),这样c虽然不是User...
  • 对象,属性方法的解析。 创建对象,引用控制对象解析。 面向对象的基本思想
  • 编写 Java 程序,定义 Java Point 用来表示坐标,坐标范围在(0,0)到(100,100)以内,并显示合法的坐标在控制台。 实现思路: 定义 Point ,为该分别定义两个属性 X 和 Y,用来表示横坐标和纵坐标。...
  • 覆写java实体toString的方法,使用反射技术输出全部属性的值(包括父类)。 前提条件:两个满足一个就行 1、实体都继承同一个父类,在父类中覆写toString方法 2、在需要的实体中覆写toString方法(如果实体...
  • Java 反射获取私有属性方法

    千次阅读 2019-01-31 17:40:14
    Java 反射获取私有属性方法 马上过年了,深海祝看到这篇博客的码农朋友新年快乐! 今天下午公司没什么事情,所以写了点小东西,算是给各位的新年小礼物... /* *作者:赵星海 (CSDN-深海呐) *时间:2019/1/31 17:17...
  • Java如何打印对象的详细信息

    千次阅读 2020-04-20 23:07:39
    当我们想在控制台的地方打印一个对象的详细信息时,往往会出现的是下图的样式。而不是我们想要的对象的名称以及对象的内部信息。...将需要打印的内部属性选上,那么就可以打印出我们想要的数据了。 ...
  • import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Test { @SuppressWarnings("unused") cla...
  • java动态给实体添加属性

    千次阅读 2020-04-10 11:01:19
    java动态给实体添加属性 需要的jar包有两个:cglib-3.1.jar 和 google-collections-1.0.jar 如果是maven项目,就不需要cglib-3.1.jar,直接用spring自带的 org.springframework.cglib即可。 1、创建一个实体:...
  •  1、ToStringBuilder、HashCodeBuilder、EqualsBuilder、ToStringStyle、ReflectionToStringBuilder、CompareToBuilder等这些都是位于commons-lang.jar下面的,所以要使用这些一定要导入commons-lang.jar。...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
  • tostring如果不设置参数的话,打印string的时候只会包含子类的属性 需要在@Data的基础上再加一个@ToString(callSuper = true)注解
  • 最近在做项目的时候遇到一个问题,要动态获取一个中所需要的属性值,找度娘找了很久,终于找到一个合适的Util,故此记录下来,以作备用。import java.lang.reflect.Field; import java.lang.reflect.Invocation...
  •  * 输出每个学生信息,计算并输出这五个学生Java成绩的平均值,  * 以及计算并输出他们Java成绩的最高分以及最低分是多少,分别是哪位同学。 * */  public class Student { public String name; p
  • java遍历实体属性和值

    千次阅读 2018-09-21 10:28:58
    实体:   public class User implements Serializable { private static final long serialVersionUID = 1L; private String pkid; private String userName; private String p...
  • java toString()方法的使用和详解

    万次阅读 多人点赞 2018-10-19 00:23:39
    java toString方法是使用和详解1.toString()方法2. 通过java.lang.Object的toString()定义来看实际使用中会出现什么情况? 1.toString()方法 toString()方法在Object里定义的,其返回值类型为String类型,...
  • JAVA动态访问类方法属性

    千次阅读 2011-07-06 14:24:47
    JAVA动态属性 2008-12-04 17:07:42| 分类: JAVA程序设计 | 标签:无 |字号 订阅
  • Java 类方法

    千次阅读 多人点赞 2018-12-16 12:58:40
    类方法: 又叫做静态方法  对象方法: 又叫实例方法,非静态方法  访问一个对象方法,必须建立在有一个对象的前提的基础上  访问类方法,不需要对象的存在,直接就访问 步骤 1 : 类方法 类方法: 又叫做静态...
  • 定义一个抽象 Person,有 name,age,sex 三个属性,创建构造函数,给这三个属性赋值,重写打印描述信息方法打印三个属性值;这个中有两个抽象方法 work 和 hello;定义两个子类 Teacher,Student;教师的 work ...
  • 方法有:学习,考试(打印输出学习,考试即可)) ​ 创建两个学生对象,并给属性赋值和调用方法 public class Test1Student { //主方法 public static void main(String[] args){ Test1Student stu1 = new Test1...
  • java继承之属性方法访问

    千次阅读 2016-06-11 16:23:44
    以下讨论都是基于从子类实例进行属性/方法访问出现的情况.建议先看文章-jvm解析与分派 1.从父类方法(未重写)访问属性时,永远都只使用父类属性.public class Test { public static void main(String[] args) throws ...
  • 1、定义学生Student,包含学号、姓名、成绩三个属性,默认构造方法、带参数构造方法; 2、Student实现Comparable接口,并实现compareTo方法(按照成绩属性比较大小); 3、定义测试,创建5个学生对象,并使用...
  • Java函数式编程详解

    万次阅读 多人点赞 2019-05-05 21:46:49
    Java从1.8以后引入了函数...使用Consumer作为示例,它是一个函数式接口,包含一个抽象方法accept,这个方法只有输入而无输出也就是说这个方法无返回值。 现在我们要定义一个Consumer接口的实例化对象,传统的方式是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 275,831
精华内容 110,332
关键字:

java方法打印类的属性信息

java 订阅