1.匿名对象
1.概述
new Person();
匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。
2.用处
匿名对象可以作为方法接收的参数、方法返回值使用
2.内部类
定义:定义在一个类的内部的类,内部类也可以看做是外部类的成员。
实现方式:
Outer.Inner inner = outer.new Inner();
访问方式:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
0.内部类:间接实现多继承
class X extends A1{
class Y extends B1{
}
}
1·局部内部类:间接实现函数嵌套
定义:定义在一个类方法中的类
public void play() {
class Inner{
public void gongneng1(){
System.out.println("功能1");
}
public void gongneng2(){
System.out.println("功能2");
}
}
Inner inner = new Inner();
inner.gongneng1();
inner.gongneng2();
}默认定义局部内部类同级别的值为final修饰
2.局部变量的默认final
class Outer4{
Object object = null;//定义obj成员变量
public void show() {
- - final:被final修饰的变量会被放在常量区,而常量区的值的存在时间要大于当前的方法,相当于扩大了原来局部变量的作用域,
- 即方法执行完了,变量也不会被释放
- 前提:方法中使用了局部内部类
- 在jdk1.7之前,要想保住这个值必须手动添加final
- 在jdk1.8及之后,java的内部机制已经在变量的前面默认添加了final
int age = 6;
class Inner{//局部内部类
public void run() {
System.out.println("跑"+age);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "toString "+age;
}
}
//show的内部使用局部内部类
object = new Inner();//多态
}
public void eat(){
System.out.println(object.toString());
System.out.println("eat");
}
}
//object不会随着show方法的结束而消失,是随着对象的存在,但是obj指向inner对象,当show结束age消失,
//在eat方法中object使用toString方法,会使用age。所以age会自动加final
3.静态内部类
public class Demo17 {
public static void main(String[] args) {
//创建静态内部类对象
//构成: new + 外部类名字.内部类的构造方法
Out.Inn inn = new Out.Inn();
//调用方法
inn.play();
//调用静态方法
Out.Inn.show();
}
}
class Out{
static int age;
//静态内部类不一定有静态方法,有静态方法的一定是静态内部类
static class Inn{//静态内部类
public void play() {
System.out.println("play");
}
public static void show() {
System.out.println("show");
}
}
}
4.匿名内部类
定义:定义在一个类方法中的匿名子类对象,属于局部内部类
注意:匿名内部类对象必须有父类或者父接口
作用:
- 当只用到当前子类的一个实例对象的时候,定义好马上使用
- 当不好起名字的时候
- 作为参数和返回值
public class Demo18 {
public static void main(String[] args) {
//研究匿名子类对象
Animal11 animal = new Animal11();
new Animal11().eat();//匿名对象
//匿名子类对象
//第一种方式:使用已有的子类创建匿名子类对象
//使用场景:已经创建好的子类可以多次使用,适用于相同的功能被多次调用
new Dog11().eat();
//第二种方式:这里也是Animal的匿名子类对象
//直接创建了没有名字的Animal的匿名子类对象
//构成: new + 父类的名字/接口的名字 + () + {写当前子类的成员} + ;
//使用场景:只能使用一次,使用完会被当做垃圾回收,适用于每次都使用不能的功能
new Animal11() {
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
}
public void show() {
}
}.show();
//匿名内部类:
Test1 test1 = new Test1();
test1.canShuTest();
test1.canShuTest1();
}
}
//研究匿名子类对象
class Animal11 {
public void eat() {
System.out.println("fu-eat");
}
}
class Dog11 extends Animal11
{
public void eat() {
System.out.println("zi-eat");
}
}
//匿名内部类:
class Test1{
public void show() {
//匿名内部类
new Animal() {
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
}
};
}
//普通的匿名对象作为参数
public void canShuTest() {
System.out.println(new Animal());
}
//匿名内部类作为参数
public void canShuTest1() {
System.out.println(
new Animal() {
public void eat() {
// TODO Auto-generated method stub
super.eat();
}
@Override
public String toString() {
return "haha";
}
}
);
}
//普通的匿名对象作为返回值
public Animal fanHuiZhiTest() {
return new Animal();
}
//匿名内部类作为返回值
public Animal fanHuiZhiTest1() {
return new Animal() {
};
}
}
3.修饰符
1.权限
[外链图片转存失败(img-aaizElYe-1565170361375)(C:\Users\root\Desktop\总结\assets\修饰符.jpg)]
2.修饰
1.public、默认修饰符(friendly):只能修饰类、方法(含构造方法)、成员。
3.private、protected:只能修饰方法(含构造方法)、成员变量。private其修饰的部分只能在自身类中访问。成员变量设置为private的,对外提供set/get方法对其进行访问。