Chinaunix首页 | 论坛 | 博客

fx

  • 博客访问: 1372327
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3964
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-02 14:36
文章分类
文章存档

2022年(2)

2019年(2)

2018年(10)

2017年(1)

2016年(50)

2015年(12)

2014年(9)

2013年(29)

分类: Java

2015-10-20 18:59:10



2015-8-25
多态数组:声明一个引用变量时,任何extends过声明引用变量类型的对象都可以赋值给这个引用变量。
final :修饰类时表示该类时继承树的末端,不能被继承。修饰final表示该方法不可以被覆盖。
重载:不能只改变返回类型,参数必须不同。
抽象方法:抽象方法没有内容,只是为了标记处多态而存在。这表示在继承树结构下的第一个具体类必须要实现所有的抽象方法。
Object:Object类是所有类的源头,它是所有类的父类。
Object有两个主要的目的,作为多态让方法可以应付多种类型的机制,以及提供java在执行期间对任何对象都有需要的方法的实现程序代码(让所有类都会继承到)
任何从ArrayList取出的Object都会被当作是Object这个类的实例,编译器无法将此对象识别为Object以外的事物
对父类变量的引用变量赋值子类时,编译器根据引用类型来判断有哪些方法可以调用,调用的方法取决于引用变量指向的实例而不取决于父类(该方法子类覆盖父类实现)
java不支持多重继承,只能最多有一个父类。
接口可以同时实现几个


如何判断应该是设计类,子类,抽象类或接口:
如果新的类无法对其他的类通过IS-A测试时,就设计不继承其他类的类
只有在需要某类的特殊化版本时,以覆盖或增加新的方法来继承现有的类。
当你需要定义一群子类的模板,又不想让程序员初始化此模板时,设计出抽象类给他们用。
如果想要定义出类可以扮演的角色,使用接口
supper关键词能让程序再子类中调用父类的被覆盖的方法。


2015-8-26
抽象的类可以带有抽象的方法和非抽象的方法。
如果类带有抽象的方法,则此类必定标识为抽象的。
抽象的方法没有内容,声明是以分号结束。
抽象的方法必须在具体的类中实现。
Java所有的类都是Object直接或间接的子类。
不管实际上锁引用的对象是什么类型,只有在引用变量的类型就是带有某种方法的类型时才能调用该方法。
Object引用变量在没有类型转换的情况下不能赋值给其他的类型,若堆上的对象类型与所要转换的类型不兼容,则此转换会在执行产生异常。
接口就像是100%纯抽象类
interface关键字声明接口
实现接口时要用implements关键字
calss可以实现多个接口
实现某接口的类必须实现它所有的方法,因为这些方法都是public与abstract的


实例变量保存在所属的对象中,位于堆上。
如果实例变量是个对对象的引用,则引用于对象都是在堆上。
构造函数必须与类同名切没有返回类型,如果没有写构造函数,编译器会自动生成一个。
抽象的类也有构造函数
调用父类构造函数的唯一方法是调用super();需要在 类的构造函数中调用。如果没有调用,编译器会自动为每个构造函数加上,但是只会添加没有参数版本的父类构造函数
对super()的调用必须是构造函数的第一个语句。
this是对象本身的引用,只能用在构造函数中,并且必须是第一行语句。
每个构造函数可以选择调用super()或this(),但不能同时调用。
局部变量只会存活在声明该变量的方法中
类中的实例变量的寿命与对象相同,如果对象还存在,实例变量也会存在
只要引用变量"活着",引用指向的对象也就"活着"。当最后一个引用消失时,对象就会变成可回收的。


2015-8-27
当引用永久性的离开它的作用域,或被重新复制到其他的对象上,或被直接设定为null时,先前所指的对象都会被垃圾收集器处理
可以用私有的构造函数来限制非抽象类被初始化。
静态方法以类名称来调用。非静态方法必须以某种实例来操作。


静态的方法是在无关特定类的实例情况下执行的,以为静态方法是通过类的名称来调用,所以静态的方法无法引用到该类的任何实例变量
如:
class A{
    int a=3;
    static void fun(){
        System.out.println(a);
    }
}
编译无法通过,静态方法是不知道堆上有哪些实例的,也就无发引用到实例中的变量。


静态方法也不能调用非静态方法
class A{
    int size=3;
    int getSize(){
        return size;
    }
    static void fun(){
    System.out.println(getSize());
    }
}
问题还是处在size这个实例变量上,因为静态方法不依赖实例,而实例变量依赖实例的存在。所以静态方法中无法理解这个size是谁的size
如果非静态方法中没有用到实例变量,静态方法能不能调用他呢? 还是不能,因为如果现在可以,以后却把非静态函数改成会使用实例变量怎么办?或者子类去覆盖这个方法成有用到实例变量的
版本,这会导致混乱。


其实即使不用类名,用引用变量也是可以调用静态方法。
class A{
    static void say(){
        System.out.println("hello");
    }
}
class B{
    A a=new A();
    void fun(){
        a.say();
    }
}
编译器不会报错,但这样使用容易让人误解程序的代码。并且编译器还是会解析出原来的类,使用a来调用say()并不代表say会知道是哪个对象引用所做的调用。如此调用的方法也还是静态的。
静态变量会被同类的所有实例共享。并且只会在类第一次载入的时候被初始化。因此,可以类中定义一个静态变量,并且在类的构造函数中对该变量做增操作,已达到记录有多少类的实例被创造出来了




//2015-9-7
内部类可以使用外部的类的所有的方法与变量,就算是私有的也一样
内部类的实例一定会绑定在外部类的实例上


//2015-9-9
swing:
当某个组件加到背景组件上面时,被加入的组件是由背景组件的布局管理器管理的。
FlowLayout布局会由左至右,由上至下依次加入的顺序来安装组件,若宽度超过时就会换行,
BoxLayout布局垂直的排列组件。
可以调用setLayout来改变面板的布局管理器




序列化对象写入文件:
FileOutputSream把字节写入文件,ObjectOutputSream把对象转换成可以写入串流的数据。
当对象被序列化时,被该对象引用的实例变量也会被序列化,且所有被引用的对象也会被序列化。这些操作自动进行。
Serializable接口没有任何方法需要实现,唯一的目的就是声明有实现它的类是可以被序列化的,就是说此类可以通过对象序列化机制来存储,
        某类是可序列化的,则其子类自动地可以序列化
如果某实例变量不能或不应该被序列化,就把它标记为transient


class A implements Serializable{
        transient String a;      //标记此变量不需要序列化
        String b;                     //该变量会被序列化
}
之所以有些变量不能被序列化的原因,可能是设计者忘记实现Serializable或者动态数据只可以在执行时求出而不能或不必存储。




//2015-9-10
通过序列化来存储对象的状态
使用ObjectOutputStream来序列化对象
FileOutputStream链接ObjectOutputStream来将对象序列化到文件上
对象必须实现序列化这个接口,才能被序列化。如果父类实现序列化,则子类自动实现,而不管是否有明确的声明。
对象被序列化时,它的是咧变量所引用的对象也会被序列化。
如果有不能序列化的对象,执行期间会抛出异常。
读对象的顺序必须与写对象的顺序相同。
readObject()的返回类型是Object,因此解序列化回来的对象需要转换成原来的类型。
静态变量不会被序列化,因为所有的对象都是共享同一份静态变量值。


2015-8-14
使用FileWriter这个连接串流来写入文本文件
将FileWriter链接到BufferWriter可以提升效率
File对象代表文件的路径而不是文件本身
FileReader 用来读取文本文件
将FileReader链接到BufferReader可以提升效率
使用spilt()方法可以把String拆开,其中的分隔字符不会被当做数据看待






2015-9-15
客户端必须知道服务器应用程序的IP地址和端口号
客户端通过建立socket来连接服务器
一旦建立了连接,客户端可以从socket取得底层串流sock.getInputStream()
建立BufferedReader 链接InputStreamReader与来自Socket的输入串流以读取服务器的文本数据
InputStreamReader是个转换字节成字符的桥梁。主要用来链接BufferedReader与底层的Socket输入串流
服务器使用ServerSocket来等待用户对特定端口的请求
当ServerSocket接到请求时,他会做一个Socket链接来接受客户端的请求


Thread需要任务,任务是实现过Runnable的实例
Runnable这个接口只有一个方法run()
调用Thread对象的start()之后,会建立出新的执行空间,它处于可执行状态等待被跳出来执行。


2015-9-16
可以使用setName方法来帮线程命名,通常可以用来除错
要让对象在线程上有足够的安全性就要判断哪些指令不能被分隔执行。
使用synchronized关键词修饰符可以防止两个线程同时进入同一对象的同一方法。
每个对象都带有单一的锁,单一的钥匙,这在对象带有同步化方法时才有实际的用途
线程尝试进入同步化过的方法时必须要取得对象的钥匙,如果钥匙已经被别的线程拿走了,那就要等
对象就算是有多个同步化过的方法,也还会只有一个锁,一旦某个线程进入该对象的同步化方法,其他线程就无法进入该对象上的任何同步化方法




//2015-9-21
每个被载入的类本身也有一个锁,当需要对静态的方法做同步化时,java会使用类本身的锁。


//2015-9-24
如果两个对象相等,则hashcode必须也是相等的
如果两个对象有相同的hashcode值,它们也不一样是相等。
hashCode的默认行为是对在heap上的对象产生独特的值。如果没有override过hashcode,则该class的两个对象怎样都不会被认为是相同的。
equals()的默认行为是执行==的比较。也就是说回去测试两个引用是否对上heap上同一个对象。如果equals()没有被覆盖过,两个对象永远
都不会被视为相同的,因为不同的对象有不同的字节组合。
如果HashSet发现在对比的时候,同样的hashcode有多个对象,他会使用equals()来判断是否有完全相同的符合。也就是说,hashcode是用来缩小寻找范围,最后还是要用equals()才能确定是否真的找到相同的项目。
所以:
a.equals(b)必须与 a.hashCode()==b.hashCode()等值。
但 a.hashCode()==b.hashCode()不一定要与a.equals()等值。


要使用TreeSet,集合中的元素必须是有实现Comparable的类型或使用重载,取用Comparator参数的构造函数来创建TreeSet。


在方法参数中使用万用字符时,编译器会阻止任何可能破坏引用参数所指集合的行为,你能够调用集合中任何元素的方法,但不能加入元素。

阅读(2616) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~