很不错的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学习笔记

1.关于参数的传递class ValHold{ public int i = 10;}public class ObParm{public void amethod(){ValHold v = new...
  • rcyl2003
  • rcyl2003
  • 2007年04月16日 11:40
  • 465

CSDN,一个不错的网站

今天,无意中发现了这么好的一个网站,我想,这对我今后的学习和工作会有很大的帮助 ...
  • dwzsq
  • dwzsq
  • 2007年05月07日 16:28
  • 371

很不错的Spring学习笔记

因项目需要,最近在学习Spring,在博客园看到一篇很好的学习笔记,特摘抄在此, http://www.cnblogs.com/cyjch/archive/2012/02/06/2340415.htm...
  • shaxiaozilove
  • shaxiaozilove
  • 2016年09月06日 14:58
  • 218

《Java JDK8学习笔记》读书笔记(4)

第4章 认识对象 学习目标  区分基本类型与对象类型  了解对象与引用的关系  从打包器认识对象  以对象观点看待数组  认识字符串的特性...
  • mouyong
  • mouyong
  • 2016年04月18日 20:10
  • 4537

java多线程学习笔记(一)!更好的理解多线程

1.线程的创建 之前知道java中一个多线程的创建方法是继承Thread类或者实现Runable接口,但是看不懂下面这种创建线程的方法 第一种 new Thread(new Runnable()...
  • a347911
  • a347911
  • 2016年11月15日 09:56
  • 453

我的博客在http://webzzy3571.blog.163.com/profile/ 有兴趣的朋友可以看下

 
  • zhangzhiyong168
  • zhangzhiyong168
  • 2008年01月04日 11:55
  • 352

窗体缩放方法

首先,一个窗口是否可以拖动改变大小决定于border的属性, 仅当border为Resizing是窗口可以拖动改变大小,其它属性时则不可以。 待续.......
  • jiangqin115
  • jiangqin115
  • 2014年12月06日 14:54
  • 692

《Java JDK8学习笔记》读书笔记(3)

第3章 基础语法,虽然很简单,但其中有些知识是平时没太留意到的,有些是JDK8加入的新特性,蛮有用的。已完成排版。...
  • mouyong
  • mouyong
  • 2016年02月25日 12:27
  • 2749

读《Java JDK 8 学习笔记》

1.Java 编程语言刚开始 Oak 橡树 办公室外 已被注册 边喝咖啡边讨论名称  2.动态加载类别文档、字符串池(String Pool)等特性为节省内存而设计 3....
  • u012677972
  • u012677972
  • 2017年03月20日 21:55
  • 375

java学习笔记参考

1. JDK、JRE和JVM分别是什么,区别是什么? 答:   ①、JDK 是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。   ②、JRE(Java Runt...
  • kggnzbzdwan
  • kggnzbzdwan
  • 2016年01月06日 15:04
  • 1199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:很不错的JAVA学习笔记
举报原因:
原因补充:

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