zoukankan      html  css  js  c++  java
  • Java——面向对象

    方法重载:

    定义:

    同一个类中的方法,方法名称相同,参数列表不同,我们称之为方法重载

    注意事项:

    不能根据方法的返回值来区分方法是否重载,因为java调用方法时可以忽略方法的返回值,假如现在同一个类中有两个方法,int f(),void f(),这两个方法方法名称相同,参数列表相同,只有返回值不同,当你调用f()时,你知道调用的是哪个方法吗?这时你糊涂了,那么java系统也会糊涂,所以不能根据返回值来判断一个方法是否重载

    This关键字:

    定义:

    this关键字总是指向调用该方法的对象。根据this出现位置的不同,this作为对象的引用有两种情况:1、构造器中引用该构造器正在初始化的对象;2、在方法中引用调用该方法的对象

    注意事项:

    1. 静态方法中不能使用this关键字,因为静态方法通过类名直接调用,可以不用对象调用,既然连对象都没有了,何来的this
    2. 在类的某个方法中调用该类的另一个方法时,可以省略this关键字比如在run()方法中调用jump()方法,可以直接jump();调用,虽然这里的this省略了,但是本质上还是通过this来调用jump()方法

    成员变量和局部变量:

    定义:

    成员变量:指的是在类中定义的变量,成员变量分为类变量和实例变量

    • 类变量:用static关键字修饰的变量,可以直接通过类名来访问
    • 实例变量:没有用static关键字修饰的变量,只能通过类的实例来访问

    局部变量:指的是在方法中定义的变量

    多态:

    Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态

    现在有如下代码:

    class BaseClass{
    	public int book=6;
    	public void base() {
    		System.out.println("父类的普通方法");
    	}
    	
    	public void test() {
    		System.out.println("父类被覆盖的方法");
    	}
    }
    
    
    public class SubClass extends BaseClass {
    	public String book="java编程思想";
    	public void test() {
    		System.out.println("子类覆盖父类的方法");
    	}
    	public void sub() {
    		System.out.println("子类的普通方法");
    	}
    	
    	public static void main(String[] args) {
    		BaseClass bc=new BaseClass();//测试1
    		System.out.println(bc.book);
    		bc.base();
    		bc.test();
    		System.out.println("===========");
    		
    		SubClass sc=new SubClass();//测试2
    		System.out.println(sc.book);
    		sc.base();
    		sc.test();
    		System.out.println("===========");
    		
    		BaseClass bs=new SubClass();//测试3
    		System.out.println(bs.book);
    		bs.base();
    		bs.test();
    //bs.sub();这行代码编译时报错 } }

      

    运行结果:

    6
    父类的普通方法
    父类被覆盖的方法
    ===========
    java编程思想
    父类的普通方法
    子类覆盖父类的方法
    ===========
    6
    父类的普通方法
    子类覆盖父类的方法
    

      

    测试1和测试2编译时类型和运行时类型相同,所以没有多态发生,测试3编译时类型是BaseClass,而运行时类型是SubClass,所以当执行bs.base()时首先去SubClass类中查找此方法,发现没有base方法,则去父类中查找,发现存在该方法,则调用父类的base方法,接着执行bs.test(),由于之类重写了父类的test方法,所以此时执行的是之类的test方法,大家可能会有疑问,为什么bs.book的值不是java编程思想,而是6呢?照理说应该访问的是子类的book。与方法不同的是,对象的实例变量不具备多态性,所以这里输出的是父类的实例变量。bs.sub()编译时报错,因为BaseClass bs=new SubClass();这行代码编译的类型是BaseClass,而BaseClass中没有sub()方法,所以编译错误

  • 相关阅读:
    JS使用readAsDataURL读取图像文件
    python20个骚操作
    HTML标签的for属性
    进程、线程、协程理解
    mysql 深度解析auto-increment自增列"Duliplicate key"问题
    2020年MySQL数据库面试题总结(50道题含答案解析)
    如何用Redis统计独立用户访问量
    Redis中的布隆过滤器及其应用
    redis系列教程以及面试题
    大厂面试爱问的「调度算法」,20 张图一举拿下
  • 原文地址:https://www.cnblogs.com/wugongzi/p/11309919.html
Copyright © 2011-2022 走看看