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"); } }
-----------------------------------------------------------------------------------------------------------------------------------
关于静态方法为什么不能调用非静态方法。(非静态方法需要实例化才能使用啊)
/* * 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"); } }
如上面这个简单的例子,静态方法对非静态方法发起调用时,需实例化包含非静态方法的类的对象。如果类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"); } }
-----------------------------------------------------------------------------------------------------------------------------------
类的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; } }
---------------------------------------------------------------------------------------------------------------------------------
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; } }
---------------------------------------------------------------------------------------------------------------------------------
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]); } } } }
---------------------------------------------------------------------------------------------------------------------------------
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); } }
-----------------------------------------------------------------------------------------------------------------------------
改变Object类的equal方法,判断两个类相同。比较的时候需要用instanceof 判断一下是不是同一个父类的。
public boolean equals(Object rhs) { if (rhs instanceof F1) { return this.name == ((F1) rhs).name; } else { return this == rhs; } }
它的作用是判断其左边对象是否为其右边类的实例,返回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)); } } }
--------------------------------------------------------------------------------------------------------------------------------
关于一个.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(); //放弃当前这行。 } } } }
/* * 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(); } }
这个可以用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"); } } }
---------------------------------------------------------------------------------------------------------------------------------
抽象类:
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
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(); } } }
比如现在是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();