抽象类:
abstract class Demo
{
void show1()
{}
void show2()
{}
}
接口
interface Demo
{
public static final int NUM = 4;
public abstract void show1();
public abstract void show2();
}
修饰符 class 类名 extends 父类implements 接口1,接口2。。。
{类体部分 ,如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法}
interface QQ extends CC,MM//接口与接口之间是继承关系,而且接口可以多继承。
{
void function();
}
class WW implements QQ
{
//覆盖3个方法。
public void show(){}
public void method(){}
public void function(){}
}
public static void method(Animal a)
{
a.eat();
if(a instanceof Cat)//instanceof:用于判断对象的具体类型,只能用于引用数据类型判断
//通常在向下转型前用于健壮性的判断, 如果传入了其他的东西就不能调用
{
Cat c = (Cat)a;
c.catchMouse();
}
else if(a instanceof Dog)
{
Dog d = (Dog)a;
d.lookHome();
}
内部类
class Outer
{
private static int num = 31;
class Inner// 内部类
{
void show()
{
System.out.println("show run..."+num);
}
/*static void function()//如果内部类中定义了静态成员,该内部类也必须是静态的
{
System.out.println("function run ...."+num);
}
*/
}
public void method()
{
Inner in = new Inner();
in.show();
}
}
①先创建外部类对象,然后再创建内部类对象
OuterClass oc=new OutClass();
InnerClass ic=oc.new InnerClss();
ic.test();
class Outer
{
int num = 3;
Object method()
{
final int x = 9;
class Inner
{
public String toString()
{
return "show ..."+x;
}
}
abstract class Demo
{
abstract void show();
}
class Outer
{
int num = 4;
/* 正常情况
class Inner extends Demo
{
void show()
{
System.out.println("show ..."+num);
}
}
*/
public void method()
{
//new Inner().show();
new Demo()//匿名内部类。 直接内容写进去
{
void show()
{
System.out.println("show ........"+num);
}
}.show(); //可以调用,也可以不调用
}
}
class InnerClassDemo4
{
public static void main(String[] args)
{
new Outer().method();
}
}
class Outer
{
void method()
{
Object obj = new Object() //匿名内部的特征就是直接在()后写内部内容
{
public void show()
{
System.out.println("show run");
}
};
obj.show();//因为匿名内部类这个子类对象被向上转型为了Object类型。
//这样就不能在使用子类特有的方法了。
}
}
class InnerClassDemo6
{
public static void main(String[] args)
{
new Outer().method();
}
}
Eg:
New IplayGame(){
Public void playGame(){
Sysout(用匿名内部类实现接口)}
}.playGame();
也可以在类的内部这样写:
IplayGame ip= new iplayGame(){
Public void playGame(){
Sysout(“使用匿名内部类实现接口”)}};
Ip.playGame();//通过这样访问这个方法
Object类:
它是所有类的根父类
- Object类的变量可以指向任何类型的对象
- Object是不断抽取而来,具备着所有对象都具备的共性内容。
- Objict的方法,参数类型是Object类型,所以可以传入任何参数
默认为:Object obj=new person()
==和equals:
1.==:对于引用类型,表叫俩个对象的内存地址是否相同,要求俩边对象是类型兼容的,若不兼容,则编译出错
2.Object类的equals方法:原义是比较俩个对象的内存地址是否相同,可以传入任何对象,通常情况我们
是比较俩个参数的值是否相同,所以可以根据业务的需要重写该方法,步骤:
Public boolean equals(object obj)
①检验传入的为person类型,若不是,直接返回false
If(!(Obj instanceof person))
Return false;
②若是person类型,则先进行强制转换
Person person=(person)obj
③比较name和age
If(name.equals(person.name)&&age==person.age)
Return ture;
Return false;
Tostring()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址(哈西码)
在进行String与其他类型数据连接操作时,自动调用tostring()方法
Date now=new date();
Sysout(now)相当于sysout(now.tostring())
输出的是
S1=”hello”;
Sysout(s1)
System.out.println(p1.toString());//
hashCode方法
当equals方法重写时,通常有必要重写hashcode方法 ,因为内容相同,地址也得相同,才能叫一样
getClass方法
获取当前对象所属的字节码文件对象
Class clazz1 = p1.getClass();
Class clazz2 = p2.getClass();
System.out.println(clazz1==clazz2);
System.out.println(clazz1.getName());
getClass().getName()获取字节码文件对象的名称:person
getClass().method()获取字节码文件对象的方
System.out.println(p1.getClass().getName()+"$"+Integer.toHexString(p1.hashCode()));//