zoukankan      html  css  js  c++  java
  • 01-JAVA语言基础(动手动脑)

    一、一个JAVA类文件中只能有一个public类吗?

    01-JAVA语言基础.ppt第22页“一个Java源文件中可以写多个类,但其中只能有一个类是“公有(public)”的,并且Java要求源文件名也要与之一致。”

    测试代码一:

    1 //错误示例
    2 public class Test {
    3      public static void main(String[] args) {
    4          
    5      }
    6 }
    7 public class Test1{
    8      
    9 }

    测试结果:

    (公有类TestTwo必须定义在它自己的类文件中)

    结论:所以,一个类文件只能有一个public类。

    测试代码二:

    1 public class Test {
    2     public static void main(String[] args) {
    3         
    4     }
    5     public class innerClass{
    6         
    7     }
    8 }

    测试结果:

    (编译通过)

    其中innerClass为Test内部类。

    通过查找资料得知:

      内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。(来源:Java内部类详解

    结论:

    • java源文件中直接定义的public类只能有一个,且该类名必须与源文件名一致。
    • 内部类可以理解为外部类的一个成员,成员可以用public修饰。

     

    二、main方法的声明

    java规定main方法必须严格按如下形式进行声明:public static void main( String args[] )

    void表明其不反回任何结果。

    如果将其改为int,并添加return 0:

    1 //错误示例
    2 public class Test {
    3     public static int main(String[] args) {
    4         return 0;
    5     }
    6 }

    测试结果:

      

     结论:main方法必须严格按如下形式进行声明:public static void main( String args[] )。

    三、在一个对话框中显示文本

    程序代码:

    1 import javax.swing.JOptionPane;
    2 public class Dialog {
    3     public static void main(String[] args) {
    4         String text = "Welcom
    to
    JAVA
    Programming!";
    5         JOptionPane.showMessageDialog(null,text);
    6     }
    7 }

    执行结果:

    四、为什么java规定作为程序入口点的main() 方法是静态的?

    静态方法与非静态方法本质区别:

      静态方法是在类中使用staitc修饰的方法,在类定义的时候已经被装载和分配。而非静态方法是不加static关键字的方法,在类定义时没有占用内存,只有在类被实例化成对象时,对象调用该方法才被分配内存。

      所以,非静态成员函数在执行前必须先构造并实例化该函数所在的类。若main为非静态方法,则调用它之前还须实例化main所在类。而main为程序入口点,为此,JAVA语言规定main为静态。

    五、main接收命令行参数练习

    测试代码:

    1 public class JavaAppArguments {
    2     public static void main(String[] args){
    3         int n = args.length;
    4         System.out.println("参数个数:" + n);
    5         while(n > 0){
    6             System.out.println(args[--n]);
    7         }
    8     }
    9 }

    执行结果:

      

    程序分析:通过命令行运行JavaAppArguments时将参数传给了String数组args,main函数使用这个数组实现输出。

    六、变量的作用域与同名变量屏蔽原则:

    变量的作用域:在每个大括号内定义的变量,只在它被定义后、所在大括号结束之前有效,这个区域成为变量作用域。

    测试代码一:

    1 //如果在变量作用域内定义同名变量
    2 public class Scope {
    3     public static void main(String[] args) {
    4         int x;
    5         {
    6             int x;        //报错
    7         }
    8     }
    9 }

    错误信息为Duplicate local variable x (重复定义变量x)

    测试代码二:

    //在变量作用域外定义同名变量
    public class Scope {
        public static void main(String[] args) {
            {
                int x = 1;
                System.out.println(x);
            }
            int x = 2;
            System.out.println(x);
        }
    }

    执行结果:

    结果分析:

      输入第一个大括号内的x值1之后,变量x被JVM回收,于是可以再次以x为变量名定义变量。

    测试代码三:

     1 public class Scope {
     2     static int x = 3;
     3     public static void main(String[] args) {
     4         {
     5             int x = 1;
     6             System.out.println(x);
     7         }
     8         int x = 2;
     9         System.out.println(x);
    10         f();
    11     }
    12     public static void f(){
    13         System.out.println(x);
    14     }
    15 }

    执行结果:

    结论:

      1.相同名称的局部变量作用域范围不可重叠。

      2.在同一作用域范围内下成员变量名可以和局部变量同名,在同一个作用域范围下局部变量和局部变量不可以同名。

      3.当成员变量与局部变量同名时,默认使用局部变量

    参考文章:http://www.cnblogs.com/AlanLee/p/6627949.html

    七、浮点数误差

    测试代码:

    1 public class TestDouble {
    2     public static void main(String[] args) {
    3         System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
    4         System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
    5         System.out.println("4.015 * 100 = " + (4.015 * 100));
    6         System.out.println("123.3 / 100 = " + (123.3 / 100));
    7     }
    8 }

    执行结果:

      

    原因分析:

      浮点数值采用二进制系统表示,而在二进制系统中无法精确表示1/10。这就好像十进制无法精确表示1/3一样。如果需要在数值计算中不含有任何舍入误差,就应该使用BigDecimal类.(摘自“Java 核心技术 卷一 (第九版)  p35”)

    八、处理精度损失

    测试代码一:

    1 import java.math.BigDecimal;
    2 
    3 public class TestBigDecimal {
    4     public static void main(String[] args) {
    5         BigDecimal num1 = new BigDecimal("10.123");
    6         BigDecimal num2 = new BigDecimal("20.456");
    7         System.out.println(num1.add(num2));
    8     }
    9 }

    执行结果:

      

    测试代码二:

    1 import java.math.BigDecimal;
    2 
    3 public class TestBigDecimal {
    4     public static void main(String[] args) {
    5         BigDecimal num1 = new BigDecimal(10.123);
    6         BigDecimal num2 = new BigDecimal(20.456);
    7         System.out.println(num1.add(num2));
    8     }
    9 }

    执行结果:

      

    原因分析:

      因在计算机中浮点数值采用二进制形式存储,浮点数10.123、20.456无法精确存储,所以其为参数构造出的num1、num2也是近似值,因此得到了不精确的结果。

      而字符串的值是确定的,BigDecimal使用字符串来处理、存储数据,得到的结果是精确的。

    总结:

      在构建BigDecimal对象时应使用字符串而不是数值。

    九、自动类型转换

    测试代码:

    1 public class XY {
    2     public static void main(String[] args) {
    3         int X=100;
    4         int Y=200;
    5         System.out.println("X+Y="+X+Y);
    6         System.out.println(X+Y+"=X+Y");
    7     }
    8 }

    执行结果:

      

    结果分析:

      “+”号运算顺序为从左向右,当“+”连接两个操作数其中有一个是字符串时,“+”为字符串连接操作符。

      当“+”连接一个数值和一个字符串时,数值会自动转换为字符串进行连接。

  • 相关阅读:
    【算法笔记】一大堆的筛法
    #总结dvwa
    网页挂马,网页篡改
    博客换新啦(PS:https://npfs06.top)
    SSTI题目整理(未完)
    近期一些面试问题的整理(安全方向)
    漏洞复现(利用、SRC挖掘)合集(二)
    SRC漏洞-从零到1的历程记录
    PHP代码审计(Session反序列化 + Create_function漏洞)
    XSS+CSRF思考(BCTF2018
  • 原文地址:https://www.cnblogs.com/lzq666/p/7630037.html
Copyright © 2011-2022 走看看