很不错的JAVA学习笔记

转载 2007年09月16日 01:52:00

1.关于参数的传递

class ValHold{
public int i = 10;
}
public class ObParm{
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
}
public void another(ValHold v){
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
}
public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}
此题的答案是10,20,为什么不是10,10呢?

 

这样解释吧,按照sun官方的说法:当一个引用变量作为参数传递给一个方法时, 在这个方法内可以改变变量的值,即改变引用指向的对象,(本题中将vh赋给v)但是方法的调用结束后,改变量恢复原来的值,即变量仍然指向原来的对象。 (即another(v)调用结束之后,v又回复到第一次ValHold v = new ValHold();时指向的地址空间。) 但是如果在方法内改变了引用指向的对象的数据(属性),那么当方法的调用结束后,尽管引用仍然指向原来的对象,这个对象的某个属性已经被改变了(v的i值在 执行v.i=20的时候就已经被改变了,所以调用another结束后,v.i已经变成了20) .

2.关于内部类

public class InOut{
String s= new String("Between");
public void amethod(final int iArgs) {
int iam;
class Bicycle{
Bicycle() {
System.out.println(s); //这两句话可以,也就是说可以访问s
System.out.println(iArgs); //和final int 常量
//System.out.println(iOther);
}
}
new Bicycle();
}
public void another(){
int iOther;
}
public static void main(String[] args) {
InOut inout= new InOut();
inout.amethod(22);
}
}

Inner class能够存取外部类的所有实例变量----无论这些实例变量有什么样的存取控制符(比如private),就像类中的方法能够存取方法所在类的所有变量一样;如果inner class定义在方法中,则inner class能够存取方法所在的类中的实例变量,也能存取该方法中的局部变量,但该局部变量必须是final的,也就是只能访问方法中的常量.(上面所说的都是普通内部类,不是静态内部类的情况).

public class Testinner {
int t=10;
public void a() {
final int u =90;
class InMethod { //方法中内部类
InMethod() { //内部类的构造方法
System.out.println("u="+u); //封装方法内的变量必须是final才能访问到!
System.out.println("t="+t); //外部类的变量可以任意访问!
}
}
new InMethod();//必须在方法a()中创建内部类对象之后,Testinner对象才能通过 a()访问到InMethod类
}
public static void main (String[] args) {
Testinner t= new Testinner();
t.a();
}
}
输出:u=90 ,t=10
方法中的内部类不可以是static的!如果一个内部类是静态的(当然只能是类中的内部类啦),那么这个类就自动的成为顶级(top-level)类即普通的类。静态内部类中的方法(无论是静态的方法还是非静态的方法)只能直接访问外部类中的静态成员,要访问外部类中的非静态成员,则必须创建外部类的对象。

1.关于在静态方法中访问非静态内部类的问题

 

public class Outer{
public String name = "Outer";
public static void main(String argv[]){
//Inner myinner = new Inner(); //直接用这句话创建会编译错误
Outer myouter=new Outer(); //先创建外部类的对象
Outer.Inner myinner=myouter.new Inner();
myinner.showName();
}//End of main
//下面这段代码用来测试这种n烦的办法
public void amethod(){
Outer myouter=new Outer();
Outer.Inner myinner=myouter.new Inner();
myinner.showName();
}
//非静态方法访问非静态内部类
private class Inner{
String name =new String("Inner");
void showName(){
System.out.println(name);
}
}//End of Inner class
}
在非静态方法访问非静态内部类直接创建该内部类的对象:new Inner().showName();当然也可以采取这种n烦的办法假设private class Inner改成static private class Inner, 那么在静态方法中访问静态内部类也是直接创建该内部类的对象,即Inner myinner = new Inner(),或者Outer.Inner myinner = new Outer.Inner()也行得通,可见这种n烦的方法在上面三种情况下都是可以用的。

2.Abstract方法不能用final,static修饰非abstract方法在abstract类中可以用final,static

抽象类中的抽象方法不能是final,但是非抽象方法前加final可以编译通过因为abstract和final相互排斥,前者专用于继承,后者禁止继承

抽象类中的抽象方法不能为static

非抽象方法可以为static

包裹类Integer、 String 、Float、 Double等都是final类,不能被继承!Integer i=new Integer(“6”);如果字符串不是数字,会产生运行异常(不会出现编译错误)但是对于boolean,这个规则不适用。当字符串时(大小写无关),Boolean对象代表的数值为true,其他字符串均为false如:

Boolean b = new Boolean(“afiwou”); 代表false
Boolean b = new Boolean(“tRue”); 是true
3.多态性、虚拟方法调用

 

public class Test8 {
public static void main(String [] args){
Base b = new Subclass();
System.out.println(b.x);
System.out.println(b.method());
}
}
class Base{
int x = 2;
int method(){
return x;
}
}
class Subclass extends Base{
int x = 3;
int method(){
return x;
}
}
结果是2,3,而不是3,3
Employee e = new Manager();
e.department = " Finance " ;
//department 是Manager的一个特殊属性
声明变量e后,你能访问的对象部分只是Employee的部分;Manager的特殊部分是隐藏的。这是因为编译器应意识到,e 是一个Employee,而不是一个Manager。但重写的方法除外

 

在你接收父类的一个引用时,你可以通过使用instanceof运算符判定该对象实际上是你所要的子类,并可以用类型转换该引用的办法来恢复对象的全部功能。为什么说“恢复对象的全部功能”,就是因为上一格所描述的,子类对象赋给父类句柄后,该句柄不能访问子类的那些特殊属性和方法,要用就要重新造型。这其实是多态参数的后续应用,形成这样一个链条:传入多态参数??instanceof判断类型??casting??恢复功能

Employee e = new Manager();
e.getDetails();

在此例中,Manager 重写了Employee的getDetail()方法。被执行的e.getDetails()方法来自对象的真实类型:Manager。事实上,执行了与变量的运行时类型(即,变量所引用的对象的类型)相关的行为,而不是与变量的编译时类型相关的行为。这是面向对象语言的一个重要特征。它也是多态性的一个特征,并通常被称作虚拟方法调用??“动态绑定”

写了这么多也不知道对你有没有帮助呢?

 

相关文章推荐

很不错的JAVA学习笔记

  • 2007年11月21日 10:56
  • 5KB
  • 下载

C++学习参考笔记,真的很不错的

  • 2009年03月07日 14:21
  • 711KB
  • 下载

Java Thread 很不错的一篇文章

如何停止java的线程一直是一个困恼我们开发多线程程序的一个问题。这个问题最终在Java5的java.util.concurrent中得到了回答:使用interrupt(),让线程在run方法中停止。...
  • soszou
  • soszou
  • 2012年09月23日 21:51
  • 1780

JAVA面试试题集,很不错哦

JAVA面试试题集 1、面向对象的特征有哪些方面  1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择...
  • Li_soso
  • Li_soso
  • 2013年01月24日 11:20
  • 327

java访问权限(今天突然看到觉得很不错)

java变量的隐藏问题是很容易混淆的地方,还有就是重写的时候静态方法的问题(只看引用的类型) 类中某成员(方法或属性,method or field)的访问权限: 1、pa...

java synchronized详解(个人认为很不错的讲解)

分别锁定this , obj1 , obj2 三个对象 public class Resource2 { int limit = 1000; private Food obj1 = new ...

LruCache.java这个类用来作为缓存图片是很不错的,源码的分析:

代码片段,双击复制 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ...

java 泛型(一篇很不错的文章)

java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参...

很不错的jQuery学习资料和实例

转载  http://www.cnblogs.com/gaoweipeng/archive/2009/06/05/1496587.html 这些都是学习Jquery很不错的资料,...

在ruby学习中,很不错的书籍

------TheWell-Grounded Rubyistby David A. Black$29.39Get this book. David A. Black knows Ruby.Ruby i...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:很不错的JAVA学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)