java回顾之多态、内部类、权限修饰符、代码块
java回顾之多态、内部类、权限修饰符、代码块
一、多态
1.1、多态的概念
一个对象可以表现多种形态,这就叫做是多态,比如:我们可以说猫是一只猫,我们也可以说猫是一个动物
java中多态的前提
要有继承extends或者实现implement关系
体现多态要有方法重写
要有父类引用指向子类对象
实例代码:
//创建对象 Cat c=new Cat(); //要有父类引用指向子类对象 Animal a=new Cat();
1.2、多态的成员访问特点
成员变量
编译看左边(父类),运行看左边(父类)
(这个意思就是,当写代码的时候,用到的变量都是父类的变量,运行的时候也是父类的变量)
成员方法
编译看左边(父类)、运行看右边(子类)
(这个意思就是,用到的方法,父类中要有,运行的话其实是子类中重写的父类的方法)
//动物 public class Animal { String name = "123"; public void method(){ System.out.println("父类的方法"); } } //猫 public class Cat extends Animal{ String name = "321"; public void method(){ System.out.println("子类的方法"); } } public class Demo { public static void main(String[] args) { //创建对象 Cat c = new Cat(); //要有父类引用指向子类对象 Animal a = new Cat(); //编译看左边(父类),运行看左边(父类) System.out.println(a.name); //编译看左边(父类), 运行看右边(子类) a.method(); } }
1.3、多态的好处和弊端
弊端:
多态情况下,不能调用子类的特有方法
因为父类中没有子类的特有方法,编译就没有办法编译
好处:
提高了代码的扩展性
比如吃饭一个方法,参数是类型 public static void method(Cat c){ 这代表猫吃饭,但是如果传过来一个狗,这个方法就接不了参数,因为类型不同,就需要再写一个吃的方法,参数中定义的是Dog d } public static void method(Dog d){ 但是如果有多态,可以将参数这写成动物接口,然后所有的类来实现动物 } //使用多态 //一个方法可以接受任意动物的子类,这个方法提高了代码扩展性 public static void method(Animal a){
//相当于 Animal a = new Cat(); // Aniaml a = new Dog(); } }
这样就可以节省代码,接收参数更灵活
1.3多态的转型
把子类类型转成父类类型
Animal a = new Cat(); //把Cat类型转成Animal类型
把父类类型转成子类类型
//子类类型 变量名 = (子类类型)父类类型对象;
Cat c = (Cat) a;
作用:
为了调用子类的特有方法
2.内部类
2.1分类
成员内部类
局部内部类
匿名内部类
2.2成员内部类
定义在类中方法外的内部类就是成员内部类
创建对象的方式
外部类名.内部类名 变量名=new 外部类().new 内部类();
变量重名时的访问
访问外部类的成员变量
外部类名.this.变量名
2.3局部内部类
定义在方法中的内部类就是局部内部类
局部内部类没什么大作用,因为局部限制了他的使用范围,只能在当前方法中使用,所以这个东西真没什么使用场景
在局部内部类中访问了外部类的局部变量,那么这个变量就变成了final变量,不能被修改。
2.4匿名内部类
没有类名的内部类就是匿名内部类
格式:
new 类名/接口名(){
方法重写
};
写法二:调用方法
method(new Animal(){ @Override public void eat() { System.out.println("匿名内部类吃饭方法"); } });
三、权限修饰符
四、代码块
4.1、静态代码块
static{
要执行的代码
}
执行时机
在当前类第一次被使用的时候静态代码块会执行,且只执行一次
如果有些代码只需要执行一次且需要在别的代码之前执行,就可以放在静态代码块中,比如加载驱动。
4.2、构造代码块
在类中方法外:
{
里面可以写代码;
}
在构造方法执行的最开始先执行构造代码块
多个构造方法中有相同的代码,为了提高代码复用性,可以把相同的代码抽取到构造代码块中