内部类
instanceof 判断一个对象是否属于某个类的实例格式:对象 instanceof 类名
Student
student
student instance
interface Animal
{
public void say();
}
class Dog implements Animal
{
public void say()
{
System.out.println("狗叫");
}
//自己的方法
public void show()
{
System.out.println("狗狗自己的方法");
}
}
class Cat implements Animal
{
public void say()
{
System.out.println("猫叫");
}
}
class AnimalPrint
{
//对动物进行打印
public static void print(Animal a)
{
//System.out.println(a.say());
a.say();
}
}
class Eemon1
{
public static void main(String[] args)
{
//狗狗对象
Dog dog=new Dog();
AnimalPrint(dog);
}
}
instanceof(实例,运算符) 判断一个对象是否属于某个类的实例
/|\|
格式:对象 instanceof 类名-------------------------------- --|
Student
student
student instance Student 返回(它是一个运算符)boolean类型 true/false
*/
interface Animal
{
public void say();
}
class Dog implements Animal//狗类
{
public void say()
{
System.out.println("汪");
}
//自己的方法
public void show()
{
System.out.println("狗狗自己的方法");
}
}
class Cat implements Animal//猫类
{
public void say()
{
System.out.println("喵");
}
}
class AnimalPrint
{
//对动物进行打印
public static void print(Animal a)//用接口去接收具体的实现类
{
//System.out.println(a.say());
a.say();
//instanceof -- a instanceof Dog//判断是否属于狗类
if (a instanceof Dog)
{
Dog dog=(Dog)a;//强行转换成狗的类型(多态的向下转型)
// -----
dog.show();
}
}
}
class Eemon1
{
public static void main(String[] args)
{
//狗狗对象
Dog dog=new Dog();
//dog.show();
AnimalPrint.print(dog);
//猫对象
Cat cat=new Cat();
AnimalPrint.print(cat);
}
}
Object
是java当中所有类的父类,也叫根类,就是最大的类
被默认继承的父类
class Father
{
...
}
class Son extends Father
{
...
}
**********************************************
toString()
getClass() 返回字节码描述的类 Class class
// -----
专门描述对应的对象的字节码
hashCode()
clone() protected 权限被保护的 意味着外面的类不能调用这个方法
//演示API
class Student
{
private String name;
private int age;
//name
public String getName()
{
return this.name;
}
public void setName(String name)//没有返回值
// ----
{
this.name=name;
}
//age
public int getAge()
{
return this.age;
}
public void setAge(int age)
{
this.age=age;
}
/*public String toString()
{
return "hello";//重写后,输出s和s.toString()都打印hello
}
*/
/*public String toString()
{
return "age="+this.age+","+"name="+this.name;
}*/
//受保护,在子类中可以调用
public Object clone()//objcet知道这个对象,但不知道找个对象具体的内容是什么
{
Student student=new Student();
student.setAge(this.getAge());
student.setName(this.getName());
//return super.clone();
return student;
}
}
//测试
class Eemon2
{
public static void main(String[] args)
{
Student s=new Student();
s.setAge(30);
s.setName("James");
System.out.println(s);//输出:Student@1db9742(十六进制)---------------
//类名 +@+ |
//打印对象时默认使用toString |
// ---------------- |
//toString |
System.out.println(s.toString());//<span style="font-family: Arial, Helvetica, sans-serif;">输出:Student@1db9742 </span>// |
// |
//getClass--返回字节码描述的类 |
System.out.println(s.getClass().getName());//输出:Student |
// ------------ |
// class Student |
// |
System.out.println(s.hashCode());//输出;31168322 |
// |
System.out.println(Integer.toHexString(s.hashCode()));//1db9742-|
//将hashcode转换为十六进制的字符
Object s1=s.clone();
System.out.println(s1);//输出:Student@106d69c(返回的是Object,但我们这里是Student)
//内容一致,但地址有变换
Student s2=(Student)s1;
System.out.println(s2);//<span style="font-family: Arial, Helvetica, sans-serif;">输出:Student@106d69c</span>
<pre name="code" class="java"> System.out.println(s2.getClass().getName());//输出:Student
System.out.println(s2.getName()); System.out.println(s2.getAge());}}
Object 类中的equal() 比较
需求:比较两个学生对象的age属性值是否相等,相等返回true,否则返回false--使用equals方法
class Student
{
private int age;
public int getAge()
{
return this.age;
}
public void setAge(int age)
{
this.age=age;
}
public boolean equals(Object obj)
{
if (!(obj instanceof Student))
{
return false;
}
Student s=(Student)obj;
return this.age==s.age;
}
}
class Dog
{
String name;
}
class Eemon3
{
public static void main(String[] args)
{
Student s1=new Student();
s1.setAge(10);
Student s2=new Student();
s2.setAge(10);
System.out.println(s1==s2);//比较的是内存地址--false
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(new Dog()));//Exception in thread "main" java.lang.ClassCastException: Dog cannot be cast to Student
}
}
内部类:
类中定义的类.
1.成员内部类--定义在成员位置上的类
特点:a.内部类能直接访问外部类的成员(包括私有的成员)
b.外部类要调用内部类的成员,只能通过创建对象的方式去调用
1.成员内部类--定义在成员位置上的类
特点:a.内部类能直接访问外部类的成员(包括私有的成员)
b.外部类要调用内部类的成员,只能通过创建对象的方式去调用
class A//外部类
{
private int num=10;
class B//内部类
{
public void showA()
{
int num1=20;
/*class C
{
void showD()
{
System.out.println("num1:"+num1);
}
}*/
System.out.println(num);
System.out.println(num1);
}
}
public void showB()
{
new B().showA();
}
/* public void showC()
{
new C().showD();
}*/
}
class Eemon4
{
public static void main(String[] args)
{
A a=new A();
System.out.println("___________");
a.showB();//10
//20
}
}
内部类的其它特点:(比较难理解)
需求:在外面的 测试类 中能否直接创建内部类的实例进行操作?
可以的:
格式: 外部类.内部类=new 外部类().new 内部类();
-------------------------------------------------------
这种写法几乎不会用
条件:内部类不能是私有化的,是public or 默认的
static的类中只能访问静态的成员,不能被new访问(不需要去new一个实例了)
2.静态的成员内部类 如何在测试类中实例化(直接new出一个静态的内部类的成员实例)
格式 外部类.内部类 = new 外部类.内部类();
-------------
去接收一个对象
class A
{
int num1=5;
static int num2=10;
/*private*/static class B//这里设置了静态,就不能用第一种方法了
{
public void showA()
{
System.out.println("num="+num2);
}
}
}
class Eemon5 //测试类
{
public static void main(String[] args)
{
//B b=new B();//类B找不到
//b.showA();
//外部类.内部类=new 外部类().new 内部类();
//A.B b=new A().new B();
//b.showA();
A.B b2=new A.B();
b2.showA();
}
}
静态内部类中的成员特点:
静态内部类中的成员可以有非静态成员吗?可以class A
{
static int num1=10;
static class B//静态内部类
{
int num2=20;//非静态成员
static int num3=30;//静态成员
public void show()
{
System.out.println("num1:"+num1);
System.out.println("num2:"+num2);
System.out.println("num3:"+num3);//非静态的可以去访问那个静态的
}
public static void show1()
{
System.out.println(num1);
// System.out.println(num2);//虽然num2在静态类中,但是还是一个非静态的成员,必须通过new对象的方式去调用,"类.方法"的方式
System.out.println(num3);
}
}
}
class Eemon6
{
public static void main(String[] args)
{
A.B b=new A.B();
b.show();//num1:10
//num2:20
//num3:30
A.B.show1();//10
//30
}
}
内部类 面试题:
this.num 这写法就是 当前类的对象
类.this 这种写法就是"类的this",指定的是这个类的对象
class A
{
int num=10;
class B
{
int num=20;
public void show()
{
int num=30;
//打印30
System.out.println(num);
//打印20
System.out.println(this.num);//当前类的对象的属性
//打印10
//System.out.println(new A().num);//创建对象调用
System.out.println(A.this.num);//A类对象的num属性
}
}
}
class Eemon7
{
public static void main(String[] args)
{
A.B b=new A().new B();
b.show();//30
//20
//10
}
}
局部内部类:定义在方法中
特点:局部内部类可以直接访问自己的内部变量,也可以访问当前方法中的局部变量
直接访问外部类的成员变量
外部类$1局部内部类
外部类$成员内部类(没有匿名)
Q:局部内部类为什么要多出一个编号?
A:局部内部类可以有匿名的.
class A
{
int num=10;//ok
class B//成员内部类---A$B.class
{
int num2=20;//false
}
public void show()
{
int num3=30;//ok
class C//局部内部类---A$1C.class
{
int num4=40;//ok
public void say()
{
System.out.println("局部内部类say:"+num);
}
}
new C().say();//
}
}
class Eemon8
{
public static void main(String[] args)
{
A a=new A();
a.show();
}
}
匿名内部类:没有名称的局部内部类
格式:new 外面的类/接口/外面的抽象类 (){覆盖外面的类方法/实现外面接口的方法/实现外面抽象类的方法}abstract class A1
{
public abstract void show1();
public abstract void show2();
}
class A
{
int num1=10;
public void show()
{
int num2=20;
System.out.println(num2);//20
//匿名内部类--返回的是子类(匿名内部类)的对象--节省空间,提高效率
A1 a1= new A1()//多态向上转型
//---------------
//拿父类去接受子类的对象
{
public void show1()
{
System.out.println("show1");
}
public void show2()
{
System.out.println("show2");
}
};//这里要";"
//.show1()可以
a1.show1();//输出
a1.show2();//输出
}
}
class Eemon9
{
public static void main(String[] args)
{
A a=new A();
a.show();
}
}
接口的例子:
作业;匿名内部类 普通类的例子
interface Demon
{
public void show();//
}
class A
{
public void show1()
{
Demon d= new Demon()
{
public void show()
{
System.out.println("匿名内部类接口的例子");//输出
}
};
d.show();
}
}
class Eemon10
{
public static void main(String[] args)
{
A a=new A();
a.show1();
}
}
题目;根据下面的代码写出具体的类和方法
Outer.method().show();Outer.method()--类Outer 里面有method的方法,这个肯定是static
Outer.method().show();--method()返回的是一个对象,这个对象中必须有show()这个方法
interface Demon
{
public void show();
}
class Outer
{
public static Demon method()
{
return new Demon()
{
public void show()
{
System.out.println("爵士");//输出
}
};
}
}
class Eemon11
{
public static void main(String[] args)
{
Outer.method().show();
}
}