多态中访问变量、实例方法、静态方法的区别

先上结论

在多态中,变量和静态方法都是与类相挂钩的,和具体的对象是哪个无关。而实例方法的访问可以通过一条口诀来记忆:编译看左边,运行看右边

结论验证

1. 访问变量和静态方法

之所以将它们俩归在一起总结,是因为结论很类似,但实际上,静态内容和实例内容差别是很大的。
比如 Parent p = new Child(); 如果是通过引用p去方法静态方法或者变量,那么访问的一定是父类中的内容,无论子类中是否存在与父类同名的静态方法或变量。

public class Parent
{
	// 成员变量
	public String publicString = "父类public修饰的成员变量";
	// 静态变量
	public static String staticString = "父类static修饰的静态变量";
	
	// 静态方法
	public static void method2()
	{
		System.out.println("父类public static修饰的成员方法");
	}
	
	public static void main(String[] args)
    {
        Parent p = new Child();
        System.out.println(p.publicString );
        System.out.println(p.staticString);
        p.method2();
    }
}
class Child extends Parent 
{
	//与父类同名的成员变量
    public String publicString = "子类public修饰的成员变量";
    //与父类同名的静态变量
    public static String staticString = "子类static修饰的成员变量";

	// 与父类重名的静态方法
    public static void method2()
    {
        System.out.println("子类public static修饰的成员方法");
    }
}

输出结果
父类public修饰的成员变量
父类static修饰的静态变量
父类public static修饰的成员方法

2.访问实例方法

实例方法才是多态的表现,静态方法和变量在多态中都是无效的。在 Parent p = new Child();中,使用引用p去调用实例方法,需要Parent类中有这个实例方法,才能编译通过,这称为静态绑定。但是在运行的时候,需要去在Child中寻找对应的方法,称为动态绑定。

public class Parent
{
	// 父类中的成员方法
	public void method1()
	{
		System.out.println("父类public修饰的成员方法");
	}
	
	public static void main(String[] args)
    {
        Parent p = new Child();
        p.method1();
    }
}
class Child extends Parent 
{
	// 与父类重名的成员方法
    public void method1()
    {
        System.out.println("子类public修饰的成员方法");
    }
}

运行结果:
子类public修饰的成员方法

但是,好像在子类中不重写父类的方法,好像一样可以调用方法。

public class Parent
{
	// 父类中的成员方法
	public void method1()
	{
		System.out.println("父类public修饰的成员方法");
	}
	
	public static void main(String[] args)
    {
        Parent p = new Child();
        p.method1();
    }
}
class Child extends Parent 
{
	// 子类中没有重写父类的method1方法
}

运行结果
父类public修饰的成员方法

虽然看起来好像是调用了父类中的方法,但实际上是因为子类继承了父类中的这个方法,运行的时候,还是去子类中寻找的。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 面向对象程序设计的基本特征: 面向对象程序设计的基本特征包括:封装、继承和多。封装是将数据和代码封装在一起,隐藏内部实现细节,提供对外的接口。继承是指从已有类派生出新的类,新类可以继承已有类的属性和方法,同时还可以添加新的属性和方法。多是指同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。 2. 类与对象的区别: 类是对某一类事物的抽象描述,包含了该类事物的属性和方法;而对象则是类的一个实例化对象,具有该类事物的属性和方法。 3. 构造方法的特点: 构造方法是一种特殊的方法,用于创建对象时初始化对象的状。构造方法的名称必须与类名相同,没有返回值类型,并且在创建对象时自动调用。 4. 变量的种类及作用域: 变量包括局部变量、成员变量和类变量。局部变量是在方法或代码块定义的变量,作用域仅限于该方法或代码块。成员变量是在类定义的变量,作用域是整个类。类变量是用static关键字定义的变量,作用域是整个类,可以通过类名直接访问。 5. 传值和传引用: 传值是指将方法调用时实际参数的值传递给形式参数,形式参数和实际参数是两个不同的变量。传引用是指将方法调用时实际参数的引用传递给形式参数,形式参数和实际参数是同一个变量。 6. Static 及运行程序的过程: Static是Java的一个关键字,可以用来修饰变量方法和代码块。Static修饰的变量是类变量,Static修饰的方法是类方法,可以通过类名直接访问。当程序运行时,首先会加载类的字节码文件,然后创建类的实例,调用实例方法或类方法。 7. 包的作用: 包是Java对类和接口的封装,可以将相关的类和接口组织在一起。包可以避免类名的冲突,方便类的管理和维护。 8. 静态绑定和动绑定概念,并能根据静态绑定和动绑定的基本原理来理解程序的运行结果: 静态绑定是指在编译时确定方法的调用,根据变量的声明类型来确定方法的调用。动绑定是指在运行时确定方法的调用,根据变量的实际类型来确定方法的调用。当调用方法时,如果是静态绑定,那么调用的是变量声明类型的方法;如果是动绑定,那么调用的是变量实际类型的方法。 9. 多的实现: 多是Java面向对象编程的重要特性,可以提高代码的可扩展性和可维护性。多的实现可以通过继承、接口和重写实现。当父类引用变量指向子类对象时,可以调用子类重写的方法,实现多。 10. 通过类、抽象类、接口实现UML语言描述的类、抽象类、接口: UML是一种面向对象建模语言,可以用来描述类、接口、抽象类等。在Java,可以通过类、抽象类、接口来实现UML语言描述的类、抽象类、接口。 11. 能区别异常处理catch和finally语句: 在异常处理,catch语句用于捕获异常并进行处理,finally语句用于在try语句块的代码执行完毕后必定执行的代码块,无论是否发生异常。 12. 线程(重点):定义、多线程、临界资源,如何访问临界资源: 线程是程序的执行单元,Java使用Thread类来实现线程。多线程是指程序同时执行多个线程,可以提高程序的效率和响应速度。临界资源是指多个线程同时访问的共享资源,需要采用同步机制来保证数据的一致性和正确性,如使用synchronized关键字或Lock锁。 13. Java操作数据库:JDBC: JDBC是Java Database Connectivity的缩写,是Java连接数据库的标准API。JDBC可以通过驱动程序连接数据库,执行SQL语句,获取查询结果等操作。JDBC可以连接各种类型的数据库,如MySQL、Oracle等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值