zoukankan      html  css  js  c++  java
  • java学习笔记

    1、分包:可以把类写去其他包中,但是用的时候需要import packageName.className。

      也可以全部导入import packageName.*

    2、如果是用private的,那怕在同一个包中,也不能调用其东西。只能在自己的类中修改,自己类中用构造函数修改或者其他、

    如果用public的,则其他包也能用。如果是什么都不加的,就只能是自己那个包里面使用。

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package MainTest;
    import package1.*;
    
    
    /**
     *
     * @author Liu
     */
    class tofun {
        private int s;
        tofun() {
            s = 100;
        }
        void pr() {
            System.out.print(s);
        }
    }
    public class TestFunction {
        public static void main(String args[]) {
            F1 f1 = new F1();
            f1.s = 1;
            f1.pr();
            
    //        FF1 ff1 = new ff1();
        }
    }
    
    
    
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package package1;
    /**
     *
     * @author Liu
     */
    public class F1 {
        public int s;
        public F1() {
            s = 100;
        }
        public void pr() { //这个也要public,不然其他包不能用。
            System.out.print(s);
        }
    }
    class FF1 {  //其他包不能调用
        public void pr() {
            System.out.println("ffff");
        }
    }
    
    
    
    
    
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package package2;
    
    /**
     *
     * @author Liu
     */
    public class F2 {
        void pr() {
            System.out.print("F2");
        }
    }
    View Code

    -----------------------------------------------------------------------------------------------------------------------------------
    关于静态方法为什么不能调用非静态方法。(非静态方法需要实例化才能使用啊)

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package MainTest;
    import package1.*;
    
    
    /**
     *
     * @author Liu
     */
    
    public class TestFunction {
        public static void main(String args[]) {
            fun(); //编译错误
        }
        
        public void fun() { //都是属于一个类的,这个fun函数需要实例化才能使用
            System.out.println("fff");
        }
    }
    View Code

    如上面这个简单的例子,静态方法对非静态方法发起调用时,需实例化包含非静态方法的类的对象。如果类A中静态方法需调用类B中非静态方法时,也需实例化B的对象。

    原因解释:类中静态的方法或者属性,本质上来讲并不是该类的成员,在java虚拟机装在类的时候,这些静态的东西已经有了对象,它只是在这个类中"寄居",不需要通过类的构造器(构造函数)类实现实例化;而非静态的属性或者方法,在类的装载是并没有存在,需在执行了该类的构造函数后才可依赖该类的实例对象存在。所以在静态方法中调用非静态方法时,编译器会报错(Cannot make a static reference to the non-static method func() from the type A)。

    就是你不new一个这样的实例对象出来,他是不占内存的。根本就不存在。

    居然可以这样先定义,

    public class TestFunction {
        public static void main(String args[]) {
    //        fun(); //编译错误
            TestFunction f1 = new TestFunction();
            f1.fun();
        }
        
        public void fun() { //都是属于一个类的,这个fun函数需要实例化才能使用
            System.out.println("fff");
        }
    }
    View Code

    -----------------------------------------------------------------------------------------------------------------------------------

    类的toString方法,用于输出的时候输出什么。

    重写,需要@Override

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package package1;
    /**
     *
     * @author Liu
     */
    public class F1 {
        String name;
        int age;
        public F1() {}
        public F1(String name, int age) {
            this.name = name;
            this.age = age;
        }
        @Override
        public String toString() {
            return this.name + " " + this.age;
        }
    }
    View Code

    ---------------------------------------------------------------------------------------------------------------------------------

     this除了可以排除不同的变量名外,还可以调用这个类本身的另外的构造函数。

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package package1;
    /**
     *
     * @author Liu
     */
    public class F1 {
        String name;
        int age;
        public F1() {
            this("liuweiming", 20);
        }
        public F1(String name, int age) {
            this.name = name;
            this.age = age;
        }
        @Override
        public String toString() {
            return this.name + " " + this.age;
        }
    }
    View Code

    ---------------------------------------------------------------------------------------------------------------------------------

    java做题 && java大数的使用。  只能使用Main作为主类

    http://acm.hdu.edu.cn/showproblem.php?pid=1223

    import java.math.BigInteger;
    import java.util.Scanner;
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    /**
     *
     * @author Liu
     */
    public class Main {
    
        static BigInteger[][] a = new BigInteger[55][55];
    
        public static void main(String[] arges) {
            init();
            int t;
            Scanner input = new Scanner(System.in);
            t = input.nextInt();
            while ((t--) > 0) {
                int n;
                n = input.nextInt();
                System.out.println(a[n + 1][n + 1]);
            }
        }
    
        public static void init() {
            a[1][1] = new BigInteger("1");
            BigInteger last = new BigInteger("1");
            for (int i = 2; i <= 51; ++i) {
                a[i][i] = last;
                for (int j = i - 1; j >= 1; --j) {
                    a[j][i] = a[j + 1][i].add(a[j][i - 1]);
                }
                last = new BigInteger("0");
                for (int k = i; k >= 1; --k) {
                    last = last.add(a[k][i]);
                }
            }
        }
    }
    View Code

    ---------------------------------------------------------------------------------------------------------------------------------

     java输出任何类型的类,可以用Object作为参数

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package MainTest;
    
    import java.math.BigInteger;
    import package1.*;
    import java.io.*;
    import package2.*;
    /**
     *
     * @author Liu
     */
    public class TestFunction {
        public static void main(String args[]) {
            F2 f2 = new F2();
            pr(f2);
        }
        public static void pr(Object toshow) { //这样写能无敌
            System.out.println(toshow);
        }
    }
    View Code

    -----------------------------------------------------------------------------------------------------------------------------

     改变Object类的equal方法,判断两个类相同。比较的时候需要用instanceof 判断一下是不是同一个父类的。

        public boolean equals(Object rhs) {
            if (rhs instanceof F1) {
                return this.name == ((F1) rhs).name;
            } else {
                return this == rhs;
            }
        }
    View Code

    它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。

    -------------------------------------------------------------------------------------------------------------------------------

    ArrayList<对象> arr = new ArrayList<>();

    但是要存储整数类型,需要自己写一个类出实现,然后还要重写toString,只能返回String

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package MainTest;
    
    import java.math.BigInteger;
    import package1.*;
    import java.io.*;
    import package2.*;
    import java.util.*;
    /**
     *
     * @author Liu
     */
    class Integer {
        int a;
        Integer() {
            a = 0;
        }
        Integer(int a) {
            this.a = a;
        }
        @Override
        public String toString() {
    //        return "" + this.a;
            return this.a + "";
        }
    }
    public class TestFunction {
        public static void main(String args[]) {
            ArrayList<Integer> arr = new ArrayList<>();
            arr.add(new Integer(1));
            arr.add(new Integer(2));
            arr.add(new Integer(3));
            arr.add(1, new Integer(6));
            System.out.println(arr.size());
            for (int i = 0; i < arr.size(); ++i) {
                System.out.println(arr.get(i));
            }
        }
    }
    View Code

    --------------------------------------------------------------------------------------------------------------------------------

     关于一个.java文件中,只有一个public类和main方法应该放在哪里。

    1、只有一个public类:
    第一、每个编译单元(文件)只能有一个public 类。这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。
    第二、java程序的入口是main方法,所以被定为public的这个类里一定是含有main方法的类,而且该类的名称要和文件名一致,因为虚拟机开始要找main的。
    第三、你可以根据需要,往这个文件里面添加任意多个提供辅助功能的public 权限的类。但是如果这个编译单元里面有两个或两个以上的public 类的话,编译器就会报错。
    第四、在标准的java代码编写时,无论代码量多少,最好一个源文件里只有一个类或接口(接口也要单独写在一个源文件里),因为JAVA是面向对象的语言,每个类都是抽象的结果,所以每个类都要单独写在一个源文件里。
    第五、编译单元里面可以没有public 类,指的是没有公开的接口,但是可以在同一个包内访问的;public的意思是在包内包外均可访问。虽然这种情况不常见,但却是可以的。这时,你就能随意为文件起名字了。

    2. public 类的名字必须和这个编译单元的文件名完全相同,包括大小写。
    第一、如果你不遵守,编译器又要报错了。
    首先Java是被解释执行的。它在运行时并不是将所有的class文件全都放到内存中。而是在遇到import的时候才去相应的文件目录找相应的class文件。
    第二、对于一个public类,它是可以被项目中任何一个类所引用的,只需在使用它前import一下它所对应的class文件即可。将类名与文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。

    如果你在一个.java文件里写两个类,然后又不在public类中写main方法,而是在其他类中写,则点运行项目会报错。因为点运行项目,就相当于你javac name.java,然后编译不了

    如果都有main方法。就会产生两个.class文件,name.class(public类), other.class(第二个类),然后运行,就是java name.class,所以会去找public那个的main。、你点击右边的运行文件,

    就会让你有得选择,其实就是java HaveTest或者 java Two。 记住后面是没.class的。系统会自己加。

    用javac Main.java后 要用java Main运行,需要根目录在同一路径下不然会说找不到主类 

    然后还有就是eclipse和netbeans的输出端都不是标准控制台,都只是他们IDE模仿的而已,所以有些' '实现不了

    路径不在同一目录下,不行的

    需要

    --------------------------------------------------------------------------------------------------------------------------------

     try {

    } catch()

    处理异常。

    下面代码记得要input.nextLine();抛弃当前的行。

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package MainTest;
    
    import java.math.BigInteger;
    import package1.*;
    import java.io.*;
    import package2.*;
    import java.util.*;
    
    /**
     *
     * @author Liu
     */
    
    
    public class TestFunction {
        public static void main(String args[]) {
            Scanner input = new Scanner(System.in);
            boolean gotoInput = true;
            while (gotoInput) {
                try {
                    System.out.println("input a number:");
                    int number = input.nextInt();
                    System.out.println("what you input is:");
                    System.out.println(number);
                    gotoInput = false;
                } catch(InputMismatchException ex) {
                    System.out.print("Try it more
    ");
                    input.nextLine(); //放弃当前这行。
                }
            }
        }
    }
    View Code
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package MainTest;
    
    import java.math.BigInteger;
    import package1.*;
    import java.io.*;
    import package2.*;
    import java.util.*;
    
    /**
     *
     * @author Liu
     */
    
    
    public class TestFunction {
        public static int dive(int numberOne, int numberTwo) {
            if (numberTwo == 0) {
                throw new ArithmeticException("can not dive by zero
    ");
            }
            return numberOne / numberTwo;
        } 
        public static void main(String args[]) {
            Scanner input = new Scanner(System.in);
            int valOne = input.nextInt();
            int valTwo = input.nextInt();
    //        int result = valOne / valTwo;
    //        System.out.println(result);
            try {
                int result = dive(valOne, valTwo);
                System.out.println(result);
            } catch(ArithmeticException ex) {
                System.out.println(ex);
            }
        }
    }
    自己定义输出异常

    -----------------------------------------------------------------------------------------------------------------------------------

    在netbeans中,选择运行,清理并构建项目,就可以生成带有dist,里面 有个jar包,就是用来打包文件的,然后没有图形界面的话,就只能cmd命令执行,java -jar xxx.jar。如果有的话,可以双击执行,选择默认打开方式是javaw.exe就行。

    也可以用黑方法修改键值?(默认打开方式是java)

    java jar包双击不能运行
    我按生成可执行JAR包的方法生成一个JAR包,在CMD中能够运行java -jar Name.jar能够运行了,但是双击它时却出错:
    A Java Exception has occurred

    难道是我什么东西没配正确吗?
    cwqbupt | 浏览 5697 次
    发布于2013-05-13 21:56 最佳答案
    1.elipse打jar包一般有两种:一种是普通的jar file,另外一种是Runnable jar file;要想可执行当然选择第二种了
    2.确认java -jar xxx.jar 在控制台或制作的bat文件中是否正常运行,如果不能正常运行说明jar包有问题;问题一般是没有
    指定main方法入口,具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件,看是否有Main-Class属性,并且
    对应的类shifoulujing、书写等正确;
    3.由于机子上装了压缩软件,jar包被压缩软件所关联,导致双击jar包无法运行,解决办法当然是改变打开方式;将默认打开方式改为jre/bin目录下的javaw.exe
    4.由于文件打开类型配置的问题,导致双击jar包出现找不到main函数,该类问题不管是xp,还是Win7比较统一的解决办法是修改关联程序的注册表,修改方法如下
    注意:"C:Program FilesJavajre6injavaw.exe"应为你所装的javaw.exe的实际路径
    注册表项的路径为:HKEY_CLASSES_ROOTAplicationsjavaw.exeshellopencommand
    在此路径下有一默认键值, 不正常的情况下, 键值是:"C:Program FilesJavajre6injavaw.exe" "%1"
    将键值改为"C:Program FilesJavajre6injavaw.exe" 空格-jar空格 "%1"(注意空格)
    然后依然用上述的javaw.exe关联jar文件, 问题完美解决.

    -------------------------------------------------------------------------------------------------------------------------------

     1、不同的两个类,如果类2想要使用类1的东西,只能使用实例调用,就是在类2中声明类1的一个实例。

    2、如果一个是父类,一个是子类,在子类中,就可以用super.name来调用。

    至于能不能调用,就是private,同一个包等之类的,和以前学的一样。

    还有如果父类的函数不希望被修改,就是不能@override,就可以用final修饰。

    子类可以很简单地调用父类的方法。不重写的话,就是用了父类的方法。

    ----------------------------------------------------------------------------------------------------------------------------------

    instanceof 的弊端。

    如果主父类是GemetricObject,然后Circle继承它,totest又继承circle

    那么totest haha = new totest();

    haha instanceof Circle 和 totest都是true

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package shape;
    
    /**
     *
     * @author Liu
     */
    public class Main {
    //    Circle c = new Circle("black", 5.0);
        public static void main(String[] args) {
            Object haha = new totest();
            System.out.println(haha instanceof Circle); //true,但是不是我想要的
            show(haha);
        }
        public static void show(Object gg) {
            if (gg instanceof Circle) { //不是我想要的
                System.out.println(((Circle)gg).getArea() + "123");
            } else if (gg instanceof totest) {
                System.out.println(((totest)gg).liu);
            }
        }
        public static boolean isEqual(GeometricObject s1, GeometricObject s2) {
            return s1.getArea() == s2.getArea();
        }
    }
    View Code

    这个可以用getclass完美解决

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    class father {
        
    } 
    class son extends father {
        
    }
    class sonson extends son {
        
    }
    
    public class Main {
        public static void main(String[] args) {
            sonson s = new sonson();
            isok(s);
        }
        static void isok(Object s1) {
            if (s1.getClass().equals(father.class)) {
                System.out.println("father");
            } else if (s1.getClass().equals(son.class)) {
                System.out.println("son");
            } else {
                System.out.println("sonson");
            }
        }
    }
    View Code

    ---------------------------------------------------------------------------------------------------------------------------------

    抽象类:

    1、里面可以不包含抽象方法。

    2、 抽象类不能被实例化,因为它需要它的子类来实现。

    3、子类必须实现抽象类的所有抽象方法,否则子类也要声明为一个抽象类。

    4、为什么要使用抽象类呢?P428,具体的意思是:你在一个类中,比如一个几何类,定义了两个抽象方法,getArea和getPerimeter,因为每一种几何图形的计算方法都不同,所以它要由子类实现。这有什么用呢?

    比如这个抽象类叫GeometricObject,里面有个equal方法,如果面基相等就是相同的图形,

    GeometricObject  circle = new Circle(); //它的一个子类,圆

    GeometricObject  rectangle = new Rectangle(); //它的一个子类,长方形。

     bool equal(GeometricObject  object1, GeometricObject  object2) {

      return object1.getArea() == object2.getArea();  //即可,JVM会自动找到它是那个图形。

    }

    接口

    1、 接口所有变量都必须是public static final

    2、没有构造方法,接口不能用new操作符实例化

    3、所有方法必须是公共的抽象实例方法。。所有方法都抽象。

    ---------------------------------------------------------------------------------------------------------------------------------

    关于Java的对象数组。

    如果写好了一个类,需要创建对象了,怎么创建多个呢?

    structClass[] arr = new structClass[22]; //声明了22个structClass对象的引用,并没有创建完整的对象。

    然后还需要for一下, 创建好所有的对象。

    for (int i = 0; i < 22; ++i) {

      arr[i] = new structClass("name", id);

    }

    http://blog.csdn.net/qq_33642117/article/details/52214403

    --------------------------------------------------------------------------------------------------------------------------------

    在netbeans中添加javadoc

    1、下载javafx-8u131-apidocs.zip

    http://www.oracle.com/technetwork/java/javase/documentation/jdk8-doc-downloads-2133158.html?ssSourceSiteId=otncn

    2、在netbeans中选择工具--->java平台--->javadoc---->添加文件夹,把那个压缩包添加进去,然后置顶即可。

    ----------------------------------------------------------------------------------------------------------------------------

    java中传值还是传引用?

    ans:普通数据的是传值,对象传引用,但是String是不可变的,相当于传值,concludtion:具体情况具体分析。

    http://blog.csdn.net/houpuhope/article/details/7449377

    -------------------------------------------------------------------------------------------------------------------------------

    java的final变量只是说明不能修改,说的只是引用不能修改,比如

    final int a = 5;

    就不能修改a了。(虽然这里不涉及引用的概念)

    但是用private TreeItem<MyText> rootItem;

    你还是可以用rootItem.getChildren().add(Node)

    这里不修改rootItem的引用,是合法的。

    但是不能rootItem = new(***)

    ----------------------------------------------------------------------------------------------------------------------------

    关于String是不可变类。P327

    1、String str = "java";后,继续执行str = "hello",是将str改变了,但是注意,是引用改变了,也就是相当于C语言的指针指向了其他位置,所以那个"java"还是没变的,只是找不到了。

    2、java虚拟机为了提高效率并节约内存,对具有相同字符序列的字符串直接量(也就是直接用"java"这样的),使用同一个实例。所以                  (这叫共享限定字符串)

    String s1 = "java";

    String s2 = new String("java");

    String s3 = "java";

    s1 == s2是false, 但是s1 == s3是true。

    这是因为尽管s1和s2内容相同,但是他们是不同的字符串对象。

    3、String的正则表达式。regular expression,简写regex

    		String s = "a+b#@c".replaceAll("[+#@]", "fuck ");
    		System.out.println(s);
    

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    2017年9月28日 12:04:04

    关于java的继承

    1、子类继承父类,则可以拥有所有父类的not private方法和变量。所以一般若想访问父类的变量,是通过父类的setValue和getValue方法去做。

    2、子类可以重写(override父类的方法,也就是签名(形参)和返回值都相同,那么调用的时候就会用之类的额这个了。所以重写只能发生在不同的类中

    3、重载则可发生在同一个类同,也就是两个方法,拥有相同的名字,但形参不能相同。

    多态的意思就是:

    父类型的变量可以引用子类型的对象

    比如

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.util.Scanner;
    
    class Father {
        void fun() {
            System.out.println("father");
        }
        
        void toShow() {
            System.out.println("father");
        }
    }
    
    class Son1 extends Father {
        @Override
        void fun() {
            System.out.println("son1");
        }
        void fuck() {
            System.out.println("Son1.fuck()");
        }
    }
    
    class Son2 extends Son1 {
        @Override
        void fun() {
            System.out.println("son2");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Object son = new Son1(); // son1 is son1 and father, not son2
            son.fun(); //只有object的方法,要强制类型转换才能编译成功
            
    //        pr(son);
        }
        public static void pr(Object rhs) { // 多态
            if (rhs instanceof Son2) { // not son2
                ((Son2)rhs).fun();
            } else if (rhs instanceof Son1) {
                ((Son1)rhs).fun();
            } else {
                ((Father)rhs).fun();
            }
        }
    }
    View Code

    比如现在是father ß son1 ß son2

    那么声明一个object,Object son = new Son1(); // son1 is son1 and father, not son2

    那么son的instanceof 得到的只有是son1和father,不会是son2(false)

    而且这个时候明明son是son1的对象,但是son.methodName是没有的,只有object的tostring,需要用son1的方法,则需要((Son1) son).toShow();

    声明类型 value = new 实际类型

    这个时候,只会有声明类型的方法。

    要使用,还是需要  ((实际类型) object).methodName();

  • 相关阅读:
    Codeforces Round #419 (Div. 2)
    论蒟蒻的自我修养
    12 day 1
    Balanced Teams (USACO Jan Bronze 2014)
    一个奇怪的绘图程序
    BZOJ 1002 [ FJOI 2007 ]
    BZOJ 3540 realtime-update 解题
    准备做的题目
    代码风格与树形DP
    CH round #55 Streaming #6
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6084517.html
Copyright © 2011-2022 走看看