动态参数列表
public void method(Animal... animal){//父类把传入的子类做成数组。
for(int i=0;i<animal.length;i++){
if(animal instanceof Dog){
Dog dog=(Dog)animal;
dog.eat();
}else{
Cat cat=(Cat)animal;
cat.eat();
}
}
}
方法调用
method(animal1,abinal2,animal3);
|
权限修饰符
1.范围从大到小:public>protected>(default)>private
- public 公开的
- protected:受保护的
- deafult:默认的,不是关键字,一般不写【int num】
- private:私有的
|
四种情况
- 同一个类:public,protected,default,private
- 同一个包:public,protected,default;
- 子类不同包:public,protected
- 非子类不同包:public
|
建议
代码编写成员变量一般用private,构造方法,成员方法一般用public
|
|
内部类:两个类是包含关系的时候就需要考虑使用内部类,主要就是什么在上面里面
概述
将一个类定义在另一个类里面
示例:如果类A在类B里面,类A就是内部类,类B就是外部类
|
内部类分类:
1.成员内部类:放在外部类的类中方法外,充当成员内部类
格式
修饰符 class 外部类名称{
修饰符 class 内部类名称{
}
}
|
成员内部类注意事项
1.因为颞部类是外部类的成员信息,所以没有【.java文件】,所以可以使用public,产生【.class文件】,玩不累淡出产生一个,内部类也会唱上一个文件名为:【外部类名$内部类名.class】的字节码文件。
2.内部类可以创建普通方法,变量,外部类也可以创建成员方法和成员变量
3.内部类里面的方法调用:创建内部类的对象,通过对象名.方法名()就可以调用了,如果只需要调用一次就使用匿名内部类,new 内部类类名().方法名();
|
内部类要访问外部类的成员属性
内部类可以直接访问外部类的属性和方法包括私有的。this.属性();一位内部类在外部类里面。
|
外部类如何访问内部类
1.间接方式
在外部类方法里面使用内部类,外部类里面写一个成员方法,成员方法里面有内部类内部的方法调用
格式:
Body cody=new Body //外部类创建自身对象
body.method(); //外部类调用外部类的方法,【new Heat.beat()】,所以是间接调用
2.直接方式
外部类名.内部类名 对象名=new 外部类名.new 内部类名();
调用格式:对象名.beat() 所以是直接调用。
|
2.局部内部类:方法内内,又称为【匿名内部类】
匿名内部类:本质是一个带着具体实现用来实现父类或者接口的一个匿名的子类对象开发中最常用的是匿名内部类。
匿名内部类前提:必须事先继承父类或者实现接口,重写抽象方法
匿名内部类一般是作为形式参数传递的,如果形式参数是接口或者抽象类,我们一般将匿名对象作为是参传入。
public interface Animal{
public abstract void eat();
}
//定义一个测试类
public class Test{
//定义一个成员方法
public static void showEat(Animal animal){
animal.eat();
}
public static void main(String[] args){
//采用匿名内部类方式来写
Animal animal=new Animal(){
@Override
public void eat(){
System.out.println("猫吃鱼");
}
};
showEat(animal);
//简化
showEat(new Animal(){
@Override
public void eat(){
System.out.println("猫吃鱼");
}
});
}
}
|
当一个类定义在方法内部,那么这个类就是一个局部内部类。只有当前所属的方法才能使用它,出来这个方法外面就不能使用了。
对于变量
1.局部内部类里面的成员变量,要使用只能在,局部内部类所在的方法里面才能使用,通过【对象.成员变量名】调用。在测试类里面创建外部类对象,通过【对象名.方法名()】就可以了
2.如果变量位于方法内,局部内部类外面,那么那个变量就默认为是final修饰的,只能一次赋值。在JDK1.8之后,内部类想访问方法内的变量,直接使用就可以了,但是这个方法只能有一次赋值,就是被默认final修饰的。final可以不写。
原因:
-
new出来的对象保存在堆内存当中
-
局部变量随着方法压栈,而保存在内存当中
-
方法运行结束之后立刻弹栈,局部变量在内存当中消失
-
但是new出来的对象还在堆内存中不会消失,就当做一个常量保存在所以是不能变的,所以不能再赋值,所以,可以被共享。
|
定义一个类的时候权限修饰符原则 -
外部类 public,default
-
成员内部类:四个都可以写
-
局部内部类:什么都不可以写
|
匿名内部类(局部内部类的一种)
以往实现结构中的方法四步: -
定义接口
-
定义接口实现类,重写抽象方法
-
测试类里面创建实现类的对象
-
通过对象调用方法
|
** 使用匿名内部类:(没有类名)**
如果接口当中的实现类或者是父类的子类在程序当中只需要使用唯一的一次。那么这种情况下我们就可以省略该类的定义。改为使用匿名内部类。第一步中大括号里面的东西只能使用一次。
1.格式:接口名 对象名=new 接口名(){//重写接口中所有抽象方法};分号不能删。
甚至可以new 接口名(){//重写接口中所有抽象方法}.方法名(); -
对象名.方法名();
|
对于格式:new 接口名(){}分析; -
new代表创建对象
-
接口名就表示我们到底需要实现哪一个接口,创建该接口的对象
-
{}就是匿名内部类内容。
匿名对象:没有对象名
- 格式:new 接口名(){//重写接口中所有抽象方法}.方法名();
注意事项
- 匿名内部类,【创建对象】的时候只能使用一次,如果想要多次创建对象,而且内容一样,建议定义单独实现类
- 匿名对象:在【调用方法】的时候,只能使用红唯一一次,如果希望一个对象调用多次方法,建议给你们内部类加一个名字
- 匿名内部类省略了【实现类和子类】,匿名对象省略了【对象名】,两者完全不是一个
|
|
引用数据类型
使用引用数据类型其实就是把一个类作为数据类型。
1.类可以作为成员变量
2.接口可以作为成员变量
3.借口可以作为返回值和形参
注意:接口作为参数时,传的是子类对象,作为方法返回值返回的是子类对象。