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();

原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6084517.html