可以被包外继承本类的类的实例化对象使用和包内的类的实例化对象方法使用 只能被本类的成员方法使用
◆本身不能被实例化,但继承它的子类在实例化自己的时候会初始化一些抽象类的属性。 ◆继承了同一接口的不同类。在声明时声明成接口类型,在实例化时可以实例化成这几个不同类(但实例化后的对象只能使用接口本身的方法)
■private ◆类中的成员属性
■interface ◆功能的集合,但方法都没有实体,默认都是public 方法和默认的public final 属性。 ■abstract ■多态
■继承 ◆子类可以继承父类的全部protected和public的方法和属性
例子:
com.org.bluedot包中一个类 public class A
{
protected int age; }
com.org.bluedot.test包中一个类
import com.org.buledot.*; public class B extends A {
public static void main(String [] args) { }
protected类型的成员属性和方法只能有本包内的方法操作和外包的子类对象操作(外包子类中new的父类对象不能操作父类的protected)
■内部类 ◆内部类的实例化发生于外部类已被实例化以后可有两种实例方法
1、在外部类实例化以后,用实例化的对象(My1.MyIn2 a = a0.new MyIn2();)在实例化内
部对象。
2、在外部类的方法中加入实例化内部类。
内部类和外部类可以互相操作对方的private的成员属性和成员方法,不用this可直接操作,但在内部类前加上static后,内部类就不能访问外部类的属性了
内部类之间可以继承
内部类的public,private,protected修饰符同外部类的属性定义权限一样! public的内部类可以被实例化了外部类的所有类实例化 private的内部类只能被本类的对象实例化
protected的内部类能被本包中实例化了外部类的所有类实例化和外包中继承了该外部类的实例化对象实例化
内部类隐藏的是它的类型! ◆例子
class My1 {
// 帮助类,工具类,辅助类
B b = new B(); b.age; a.age; }
//可以这样引用 //不可以这样引用
A a = new A();
private class MyIn { }
private class MyIn3 extends MyIn { }
//复杂内部类 public class MyIn2 { }
public static class MyIn4 { }
private int a;
public void add() { }
public void show() {
a++;
//a++; // 没有外部对象的指针 public void f() { }
System.out.println(\public void f() { }
a++; //可访问外部
System.out.println(\public void f() { }
super.f();
System.out.println(\private int m; public void f() { }
a++; //可访问外部
System.out.println(\
}
System.out.println(a); MyIn x = new MyIn(); x.f();
x.m++; //外部可访问内部类
public void g() { } }
public class InnerC {
public static void main(String av[]) { } }
■存储
◆类在实例化后,成员属性放在堆中,方法中的局部变量放在栈中
/*
My1 a = new My1(); a.add(); a.show(); a.show(); */ /*
My1 a0 = new My1();
//My1.MyIn2 a = new My1.MyIn2(); 经典错误 My1.MyIn2 a = a0.new MyIn2(); a.f(); */
My1 a = new My1(); a.g();
//MyIn a = new MyIn3(); //a.f();
// 只用一次的类不需要定义 MyIn x = new MyIn() { }; x.f();
public void f(){ }
super.f();
System.out.println(\
■合成 ◆在新的类里面直接创建旧的类的对象,新的类是由旧的类合成而来,所复用的是代码的功能,
不是代码的形式
■toString()◆由一个对象调用,返回一个字符串!如果默认则使用由Object继承下来的toString(),返回
这个对象的内存地址Object.toString()方法内容:
return getClass().getName() + \一个典型的重写toString()的例子: public static String toString(int [] a) {
StringBuffer result = new StringBuffer(\ for(int i=0;i
result.append(\ return result.toString(); }
■上传 ◆在某个类的应用中,把一个派生类的对象当做基类的对象来使用 ■HasMap ◆ Key value
■Map ◆ Key 的set和value的collection ■List ■Set
◆Value 有序的集合,继承于collection(非排序) Key value 没有重复的集合,继承于collection
(如果要做很多随机访问,请用ArrayList,但是如果要在List的中间做很多插入和删除的话,就应该用LinkedList,LinkedList能提供队列,双向队列和栈的功能)
(Map提供的不是对象与数组的关联,而是对象和对象的关联。HashMap看重的是访问速度,而TreeMap看重键的顺序,因而它不如HashMap那么快,而LinkedHashMap则保持对象插入的顺序,但是也可以用LRU算法为它重新排序)
(Set只接受不重复的对象,HashSet提供了最快的查询速度,而TreeSet则保持元素有序,LinkedHashSet保持元素的插入顺序)
■判断两个对象是否相同 ◆equals,hashCode返回一个int ■iterator ◆集合的通用接口,有三个方法
◆例子:
import java.util.*; import java.util.List; public class TestMap { public TestMap() {
List ls= new ArrayList(); List ls1= new ArrayList();
Map map = new HashMap();
■collection ◆总的集合(无规则集合)(Map不是从这里继承的)
result.append(a[i]); if(i
result.append(\
ls.add(\李科长\里面都是对象 ls.add(\刘科长\ls.add(\赵科长\
ls1.add(\处长\ls1.add(\科长\ls1.add(\赵科长\
map.put(\李局长\map.put(\王局长\
List show=(List)map.get(\李局长\返回是Object,所以要转换成List List show1=(List)map.get(\王局长\
Iterator it=show.iterator();//迭代接口,里面有三个方法可调用,是相对于集合的
}
Iterator it1=show1.iterator();
while(it.hasNext()) { } { }
System.out.println((String)it1.next()); System.out.println((String)it.next());
while(it1.hasNext())
public static void main(String[] args) { } }
■有效和正确定义hashCode()和equals()
有效和正确定义hashCode()和equals() 作者:unknown 更新时间: 2005-03-22
有效和正确定义hashCode()和equals()
级别:入门级
Brian Goetz (brian@quiotix.com) Quiotix Corp首席顾问 2003 年 8 月
每个Java对象都有hashCode()和 equals()方法。许多类忽略(Override)这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性。在Java理念和实践这一部分,Java开发人员Brian Goetz向您介绍在创建Java类以有效和准确定义hashCode()和equals()时应遵循的规则和指南。您可以在讨论论坛与作者和其它读者一同
new TestMap();