通过一个软构问题了解System.out.println

本文介绍一种在Java中使用匿名类和流控制技巧,实现在if-else语句中输出连续字符串'ab'的方法,避免了println方法自带的换行符干扰,实现了完美扩展。

一.一个问题

突然看到一个问题,看了别人的答案觉得不是很理想。好像扭曲了问题核心。

	public static void main(String[] args) {
		
      if(...)
      {
    	  System.out.println("a");
      }else
      {
    	  System.out.println("b");
      }
      
	}

问怎么填能输出ab?
有的同学使用了很多方法,但只能输出a \n b或ab\n这样的结果。我觉得如果要输出这种结果,你不如直接System.out.println(“a”)然后想办法扭到错误分支。但是我觉得这个问题最主要还是这个格式如何达到ab漂亮在这里插入代码片的形式,我们知道如果调用println肯定会把a,b分开。那么有没有办法真的输出ab呢我想是有的。

二.System.out.println

这个方法查阅jdk我们知道System是系统类,out是里面一个静态流实例,println是一个静态方法。
顺带推荐一个中文jdk文档http://www.matools.com/file/manual/jdk_api_1.8_google/overview-summary.html

我们想要改变println不如从流入手。
我的主要出发点就是去掉该死的换行符,一个想法是,为了防止输出换行符,我们不如在判断条件中关掉这个流,自己执行命令,让底下的println不能执行,这样给了我们很大的操作空间。

三.匿名类

Java提供了一种语法,允许我们在创建时定义类。这就叫匿名类。
new 类名
{
字段,方法。
}
这个new出来的对象是继承自类名。

四.我们可以轻易实现这个想法啦

我们在if判断中用匿名类创建一个对象,自己输出ab让其把流关闭,同时返回一个布尔真值,让其不妨碍其他判断。
这样得到的数据就是标准的‘ab’输出,不带任何讨厌的回车。一个完整的字符串。

public class Test {

	public static void main(String[] args) {
		
      if(new Object()
    		  {public boolean test()
    	             {
    			        System.out.write('a');
    			        System.out.write('b');
    			        System.out.close();
						return true;}}.test()||...)
      {
    	  System.out.println("a");
      }else
      {
    	  System.out.println("b");
      }
	}

}

在这里插入图片描述
这个方法有很多优点,你可以向后加任意的判断条件,绝对不会影响我输出’ab’,为什么我选用System.out.write呢,因为这样处理其实a,b是在一次输出后得到,而不是两次输出。详情见jdk文档。
我觉得这个做法虽然简单也比较笨,但的确做到了标准的ab,绝对没有任何换行符干扰,并且无论在什么情况下都可以输出,进行绝对完美的扩展。
不带任何回车的ab字符串这才是我爱的味道。

public class Circle { // 数据成员 private double x; // 圆心的x坐标 private double y; // 圆心的y坐标 private double radius; // 圆的半径 // 造方法 public Circle() { // 默认造方法,半径使用缺省值 1.0 this(0.0, 0.0, 1.0); } public Circle(double x, double y) { // 造方法,指定圆心的位置,半径使用缺省值 1.0 this(x, y, 1.0); } public Circle(double x, double y, double radius) { // 造方法,指定圆心的位置和半径 this.x = x; this.y = y; this.radius = radius; } // 设置圆心位置的方法 public void setCenter(double x, double y) { this.x = x; this.y = y; } // 设置半径的方法 public void setRadius(double radius) { this.radius = radius; } // 获取圆心位置的方法 public double getX() { return x; } public double getY() { return y; } // 获取半径的方法 public double getRadius() { return radius; } // 计算圆的面积的方法 public double calculateArea() { return Math.PI * radius * radius; } // 主程序入口 public static void main(String[] args) { // 创建Circle对象,使用默认造方法 Circle circle1 = new Circle(); // 创建Circle对象,指定圆心位置,半径使用缺省值 1.0 Circle circle2 = new Circle(2.0, 3.0); // 创建Circle对象,指定圆心位置和半径 Circle circle3 = new Circle(5.0, 5.0, 2.5); // 调用各种方法 System.out.println("Circle 1: Center=(" + circle1.getX() + ", " + circle1.getY() + "), Radius=" + circle1.getRadius()); System.out.println("Circle 2: Center=(" + circle2.getX() + ", " + circle2.getY() + "), Radius=" + circle2.getRadius()); System.out.println("Circle 3: Center=(" + circle3.getX() + ", " + circle3.getY() + "), Radius=" + circle3.getRadius()); System.out.println("Circle 3's Area: " + circle3.calculateArea()); } } 2.运行程序结果 public class StaticInitDemo { static int i = 5; static { System.out.println("Static code i= "+ i++ ); } } public class Test { public static void main(String args[]) { System.out.println("Main code: i=" + StaticInitDemo.i ); } } 3.定义以上圆类 Circle 的子类 SubCircle,使它具有获取半径方法、设置半径方法和 造方法,要求造方法可同时接收圆心位置及半径两个参数。编写完整的程序并创建SubCircle 类的对象,并且分别调用各种方法,对比这些方法。用java实现
最新发布
10-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值