***1 匿名内部类
就是内部类的简化写法
前提:
存在一个类或者接口
这里的类可以是具体类也可以是抽象类
格式:
new 类名或者接口名(){
重写方法;
}
本质是什么呢?
是一个继承了该类或者实现了该接口的子类匿名对象
interface Inter{
public abstract void show();
public abstract void show2();
}
class Outer{
public void method(){
//一个方法的时候
/*
new Inter(){
public void show(){
System.out.println("show");
}
}.show();
*/
//两个方法的时候
/*
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show();
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show2();
*/
//如果我们有很多个方法,那就很麻烦了
//那么,有没有什么改进的方案?
Inter i = new Inter(){ //多态
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
};
i.show();
i.show2();
}
}
class InnerClassDemo{
public static void main(String[] args){
Outer o = new Outer();
o.method();
}
}
2 匿名内部类在开发中的使用
//用完之后就是垃圾,可以被回收,所以在安卓中用的多,手机内存小,而EE用的少。
interface Person{
public abstract void study();
}
class PersonDemo{
//接口名作为形式参数
//其实这里需要的不是接口,而是该接口的实现类的对象
public void method(Person p){
p.study();
}
}
//实现类
class Student implements Person{
public void study(){
System.out.println("好好学习,天天向上");
}
}
class InnerClassTest2{
public static void main(String[] args){
//测试
PersonDemo pd = new PersonDemo();
Person p = new Student();
pd.method(p);
System.out.println("------------------");
//匿名内部类在开发中的使用
//匿名内部类的本质是继承类或者实现了接口的子类匿名对象
pd.method(new Person(){
public void study(){
System.out.println("好好学习,天天向上");
}
});
}
}
***3 匿名内部类的面试题
按照要求补齐代码
Interface Inter{ void show(); }
class Outer {// 补齐代码 }
class OuterDemo{
public static void main(String[] args){
Outer.method().show();
}
要求在控制台输出"HelloWorld"
---------------------------------
Interface Inter{
void show();
}
class Outer{
//补齐代码
public static Inter method(){
//子类对象 -- 子类匿名对象
return new Inter(){
public void show(){
System.out.println("HelloWorld");
}
};
}
}
class OuterDemo{
public static void main(String[] args){
Outer.method().show();
/*
1:Outer.method() 可以看出method()应该是Outer中的一个静态方法。
2:Outer.method().show()可以看出method()方法的返回值是一个对象
又由于接口Inner中有一个show()方法,所以我认为method()方法返回的是一个接口。
}
}
4 eclipse
(1) 自动生成构造方法,自动生成get/set方法
自动生成构造方法
a:无参构造方法 在代码区域右键--source--Generate Constructors from Superclass
b:带参构造方法 在代码区域右键--source--Generate Constructors using fields.. -- finish
自动生成get/set方法
在代码区域右键--source--Generate Getters and Setters...
(2) 继承抽象类或者实现接口的简化
通过eclipse 一键简化 重写 父类抽象方法
@Override
这个注解的意思是说,这个方式是重写父类的
如果和父类名出线了偏差,就会报错。
5 jar包
(1)jar包就是多个class文件的压缩包
(2)jar包有什么用?用别人写好的东西
(3)如何打jar包? 选中项目--右键--Export--Java--Jar--自己指定一个路径和一个名称--Finish
(4)使用jar包 复制到项目路径下并添加至构建路径
(5)生成说明书。。。选中项目--右键--Export--Java--Javadoc—Finish
(6)修改项目问题
不要随意修改项目名称
如果真要修改,不要忘记了配置文件.project中的
<name>把这里改为你改后的名称</name>
6 Debug调试
(1)作用:
调试程序
查看程序执行流程
(2)如何查看程序执行流程
要想看程序流程,就必须设置断点
(3)什么是断点:
就是一个标记,从哪里开始
(4)如何设置断点:
你想看哪里的程序,就在那个有效程序的左边双击即可
(5)在哪里设置断点:
哪里不会点哪里。
(6)如何运行:
在代码区域--右键--Debug as--Java Appliaction
弹出一个界面:问你是否需要打开断点界面。并问你是否需要记录。
是(Yes),是(选中复选框)。
(7)看哪些地方:
Debug:断点测试的地方
在这个地方,记住F6,或者点击start off也行
Variables:查看程序的变量变化
ForDemo:被查看的源文件
Console:控制台
(8)如何去断点:
a:再次双击即可
b:找到Debug视图,variable界面,找到Breakpoints,并点击,然后看到所有断点,点击双叉(remove all)
7 常见对象
API 应用程序编程接口
Java API就是java提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用就行。
8 Object类
(1)Object类 是类层次结构的根类,每个类都是用Object 作为超类
每个类都直接或间接的继承自Object类
(2)构造方法
public Object()
回想面向对象为什么说:
子类的构造方法默认访问的是父类的无参构造方法?
因为Object 只有一个无参构造方法
(3)public int hashCode()
A:返回该对象的哈希码值
B:注意:哈希值是根据哈希算法计算出来的一个值,这个值根地址值有关,但是不是实际地址值。你可以理解为地址值。
Studnet s1 = new Student();
Sytem.out.println(s1.hashCode());//11299397
Studnet s2 = new Student();
Sytem.out.println(s2.hashCode());//24446859
Studnet s3 = s1;
Sytem.out.println(s3.hashCode());//11299397
(4)public final Class getClass()
A:返回此Object 的运行时类
B:Class类的方法: public String getName():以String的形式返回此class对象所表示的实体
Student s = new Student();
Class c = s.getClass();
String str = c.getName();
Systm.out.println(str);// cn.itcast_01.Student 包名及其类名
--------链式编程
String str2 = s.getClass().getName();
Systm.out.println(str2);// cn.itcast_01.Student
**(5)public String toString()
A:返回该对象的字符串表示
B:方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
//即等价于getClass().getName() + '@'+Integer.toHexString(hashCode())
//this.getClass().getName() + '@'+Integer.toHexString(hashCode())
Student s = new Student();
System.out.println(s.toString());// cn.itcast_02.Student@42552c
----------------------------------------
a:Integer类下的一个静态方法:
public static String toHexString(int i);把一个整数转成一个十六进制表示的字符串
b:这个信息的组成了解了,但是这个信息是没有任何意义的,所以,建议所有子类都重写该方法。
怎么重写呢?
把该类的所有成员变量值组成返回即可
@Override
public String toString(){
return "姓名:"+name+",年龄"+age;
}
重写的最终版方案就是自动生成toString()方法。
c:注意:
直接输出一个对象的名称,其实就是调用该对象的toString()方法
System.out.println(s.toString());//Student{name=null,age=0}
System.out.println(s);//Student{name=null,age=0}
***(6)public boolean equals(Object obj);
A:指示其他某个对象是否与此对象“相等”。
B:==:
基本类型:比较的就是指是否相同
引用类型:比较的就是地址值是否相同
C:默认比较的是地址值
Student s1 = new Student("小林",7);
Student s2 = new Student("小林",7);
Student s3= s1;
System.out.println(s1.equals(s2));//false
System.out.println(s1.equals(s1));//true
System.out.println(s1.equals(s3));//true
D:@Override
public boolean equals(Object obj){
//但是这里需要改进,根据这里比较的成员变量来决定返回的是true还是false
//这里其实要比较的就是name和age
//但是,name是String类型的,而String是引用类型的,所以,在这里不能直接用==比较,应该用equals()比较
//String的equals()方法是重写自Object类的,比较的是字符串的内容是否相同
//this ---s1
//obj ---s2
//我们要使用的是学生类的特有成员变量,所以要向下转型
Student s = (Student)obj;// s---obj---s2
if(this.name.equals(s.name)&&this.age ==s.age){
return true;
}else{
return false;
}
}
}
(7) protected void finalize() 和 protected Object clone()
A:protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法-----------用于垃圾回收,但是什么时候回收不确定。-----了解一下
B:protected Object clone():创建并返回此对象的一个副本-------了解
A:重写该方法
就是内部类的简化写法
前提:
存在一个类或者接口
这里的类可以是具体类也可以是抽象类
格式:
new 类名或者接口名(){
重写方法;
}
本质是什么呢?
是一个继承了该类或者实现了该接口的子类匿名对象
interface Inter{
public abstract void show();
public abstract void show2();
}
class Outer{
public void method(){
//一个方法的时候
/*
new Inter(){
public void show(){
System.out.println("show");
}
}.show();
*/
//两个方法的时候
/*
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show();
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show2();
*/
//如果我们有很多个方法,那就很麻烦了
//那么,有没有什么改进的方案?
Inter i = new Inter(){ //多态
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
};
i.show();
i.show2();
}
}
class InnerClassDemo{
public static void main(String[] args){
Outer o = new Outer();
o.method();
}
}
2 匿名内部类在开发中的使用
//用完之后就是垃圾,可以被回收,所以在安卓中用的多,手机内存小,而EE用的少。
interface Person{
public abstract void study();
}
class PersonDemo{
//接口名作为形式参数
//其实这里需要的不是接口,而是该接口的实现类的对象
public void method(Person p){
p.study();
}
}
//实现类
class Student implements Person{
public void study(){
System.out.println("好好学习,天天向上");
}
}
class InnerClassTest2{
public static void main(String[] args){
//测试
PersonDemo pd = new PersonDemo();
Person p = new Student();
pd.method(p);
System.out.println("------------------");
//匿名内部类在开发中的使用
//匿名内部类的本质是继承类或者实现了接口的子类匿名对象
pd.method(new Person(){
public void study(){
System.out.println("好好学习,天天向上");
}
});
}
}
***3 匿名内部类的面试题
按照要求补齐代码
Interface Inter{ void show(); }
class Outer {// 补齐代码 }
class OuterDemo{
public static void main(String[] args){
Outer.method().show();
}
要求在控制台输出"HelloWorld"
---------------------------------
Interface Inter{
void show();
}
class Outer{
//补齐代码
public static Inter method(){
//子类对象 -- 子类匿名对象
return new Inter(){
public void show(){
System.out.println("HelloWorld");
}
};
}
}
class OuterDemo{
public static void main(String[] args){
Outer.method().show();
/*
1:Outer.method() 可以看出method()应该是Outer中的一个静态方法。
2:Outer.method().show()可以看出method()方法的返回值是一个对象
又由于接口Inner中有一个show()方法,所以我认为method()方法返回的是一个接口。
}
}
4 eclipse
(1) 自动生成构造方法,自动生成get/set方法
自动生成构造方法
a:无参构造方法 在代码区域右键--source--Generate Constructors from Superclass
b:带参构造方法 在代码区域右键--source--Generate Constructors using fields.. -- finish
自动生成get/set方法
在代码区域右键--source--Generate Getters and Setters...
(2) 继承抽象类或者实现接口的简化
通过eclipse 一键简化 重写 父类抽象方法
@Override
这个注解的意思是说,这个方式是重写父类的
如果和父类名出线了偏差,就会报错。
5 jar包
(1)jar包就是多个class文件的压缩包
(2)jar包有什么用?用别人写好的东西
(3)如何打jar包? 选中项目--右键--Export--Java--Jar--自己指定一个路径和一个名称--Finish
(4)使用jar包 复制到项目路径下并添加至构建路径
(5)生成说明书。。。选中项目--右键--Export--Java--Javadoc—Finish
(6)修改项目问题
不要随意修改项目名称
如果真要修改,不要忘记了配置文件.project中的
<name>把这里改为你改后的名称</name>
6 Debug调试
(1)作用:
调试程序
查看程序执行流程
(2)如何查看程序执行流程
要想看程序流程,就必须设置断点
(3)什么是断点:
就是一个标记,从哪里开始
(4)如何设置断点:
你想看哪里的程序,就在那个有效程序的左边双击即可
(5)在哪里设置断点:
哪里不会点哪里。
(6)如何运行:
在代码区域--右键--Debug as--Java Appliaction
弹出一个界面:问你是否需要打开断点界面。并问你是否需要记录。
是(Yes),是(选中复选框)。
(7)看哪些地方:
Debug:断点测试的地方
在这个地方,记住F6,或者点击start off也行
Variables:查看程序的变量变化
ForDemo:被查看的源文件
Console:控制台
(8)如何去断点:
a:再次双击即可
b:找到Debug视图,variable界面,找到Breakpoints,并点击,然后看到所有断点,点击双叉(remove all)
7 常见对象
API 应用程序编程接口
Java API就是java提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用就行。
8 Object类
(1)Object类 是类层次结构的根类,每个类都是用Object 作为超类
每个类都直接或间接的继承自Object类
(2)构造方法
public Object()
回想面向对象为什么说:
子类的构造方法默认访问的是父类的无参构造方法?
因为Object 只有一个无参构造方法
(3)public int hashCode()
A:返回该对象的哈希码值
B:注意:哈希值是根据哈希算法计算出来的一个值,这个值根地址值有关,但是不是实际地址值。你可以理解为地址值。
Studnet s1 = new Student();
Sytem.out.println(s1.hashCode());//11299397
Studnet s2 = new Student();
Sytem.out.println(s2.hashCode());//24446859
Studnet s3 = s1;
Sytem.out.println(s3.hashCode());//11299397
(4)public final Class getClass()
A:返回此Object 的运行时类
B:Class类的方法: public String getName():以String的形式返回此class对象所表示的实体
Student s = new Student();
Class c = s.getClass();
String str = c.getName();
Systm.out.println(str);// cn.itcast_01.Student 包名及其类名
--------链式编程
String str2 = s.getClass().getName();
Systm.out.println(str2);// cn.itcast_01.Student
**(5)public String toString()
A:返回该对象的字符串表示
B:方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
//即等价于getClass().getName() + '@'+Integer.toHexString(hashCode())
//this.getClass().getName() + '@'+Integer.toHexString(hashCode())
Student s = new Student();
System.out.println(s.toString());// cn.itcast_02.Student@42552c
----------------------------------------
a:Integer类下的一个静态方法:
public static String toHexString(int i);把一个整数转成一个十六进制表示的字符串
b:这个信息的组成了解了,但是这个信息是没有任何意义的,所以,建议所有子类都重写该方法。
怎么重写呢?
把该类的所有成员变量值组成返回即可
@Override
public String toString(){
return "姓名:"+name+",年龄"+age;
}
重写的最终版方案就是自动生成toString()方法。
c:注意:
直接输出一个对象的名称,其实就是调用该对象的toString()方法
System.out.println(s.toString());//Student{name=null,age=0}
System.out.println(s);//Student{name=null,age=0}
***(6)public boolean equals(Object obj);
A:指示其他某个对象是否与此对象“相等”。
B:==:
基本类型:比较的就是指是否相同
引用类型:比较的就是地址值是否相同
C:默认比较的是地址值
Student s1 = new Student("小林",7);
Student s2 = new Student("小林",7);
Student s3= s1;
System.out.println(s1.equals(s2));//false
System.out.println(s1.equals(s1));//true
System.out.println(s1.equals(s3));//true
D:@Override
public boolean equals(Object obj){
//但是这里需要改进,根据这里比较的成员变量来决定返回的是true还是false
//这里其实要比较的就是name和age
//但是,name是String类型的,而String是引用类型的,所以,在这里不能直接用==比较,应该用equals()比较
//String的equals()方法是重写自Object类的,比较的是字符串的内容是否相同
//this ---s1
//obj ---s2
//我们要使用的是学生类的特有成员变量,所以要向下转型
Student s = (Student)obj;// s---obj---s2
if(this.name.equals(s.name)&&this.age ==s.age){
return true;
}else{
return false;
}
}
}
(7) protected void finalize() 和 protected Object clone()
A:protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法-----------用于垃圾回收,但是什么时候回收不确定。-----了解一下
B:protected Object clone():创建并返回此对象的一个副本-------了解
A:重写该方法