当前位置:首页 » 编程语言 » java的虚方法

java的虚方法

发布时间: 2022-07-03 19:22:14

A. java中如何实现类似c++里的虚函数的方法

你说的是多态吧?java继承之后就具有多态特性了,只需重写父类方法就可以了,运行时会自动根据对象类型调用正确的方法的,这得益于java声明变量(除基本变量外)时是基于引用的。
C++的虚函数是为了方便基类指针和引用能够指向子类对象,从而根据指向的对象类型(而不是根据指针和引用类型)调用对象的方法。(这是C++的多态,由于C++中声明普通变量与声明指针和引用是不同的,所以才要这么做)

B. java的虚方法和重写

C#的Virtual Function概念是从C++来的。对像我这样直接学java的人来说,不是个好理解的东西,而且和java的面向对象有冲突。java里没有类似的关键字。java的多态有两个重要概念:overriding(重写)和overloading(重载)。注意,不是关键字。顺便说一下,上面有个匿名的朋友把这两个搞混了,函数名相同、参数类型不同的是overloading,而且和返回类型无关。按我的理解是,你可以认为java里所有被overriding的方法都是virtual的,所有重写的方法都是override的。举个例子。class A { void func() { System.out.println("func in A"); }}class B extends A { void func() { System.out.println("func in B"); }}有这样两个类,执行下面的代码会发现,和C#里加了virtual、override的效果相同。A a = new A();A b = new B();a.func();// 这里输出func in Ab.func();// 这里输出func in B

C. 关于java抽象方法

下面是抽象方法声明时采用的语法:abstract void f();
如果从一个抽象类继承,而且想生成新类型的一个对象,就必须为基础类中的所有抽象方法提供方法定义。如果不这样做(完全可以选择不做),则衍生类也会是抽象的,而且编译器会强迫我们用abstract 关键字标志那个类的“抽象”本质。即使不包括任何abstract 方法,亦可将一个类声明成“抽象类”。如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

D. 为什么Java中的函数默认是虚拟函数

其实这个主要还是C#的问题而非Java问题。 多态的实现就是靠后绑定。当从父类中继承的时候,虚函数和被继承的函数具有相同的签名。在运行期间根据情况(参数,返回值)决定调用函数的入口地址。 Java中“所有函数默认为虚函数”,也就是说所有的方法(除final)默认都是可以继承的。 java代码class A {public void func() { System.out.println(A);}} class B extends A { public void func() { System.out.println(B);}} class C extends A {} class Test { public static void main(String[] args) { A a = new A(); A b = new B(); A c = new C(); a.func(); //A b.func(); //B c.func(); //A}}C#代码usingSystem;namespaceSouthWolf{classA{publicvirtualvoidFunc(){Console.WriteLine(A);}}classB:A{publicoverridevoidFunc()//注意override,表明重新实现了虚函数{Console.WriteLine(B);}}classC:B{}classD:A{publicnewvoidFunc()//注意new,表明覆盖父类里的同名方法,而不是重新实现{Console.WriteLine(D);}}classprogram{staticvoidMain(){Aa;Ab;Ac;Ad;a=newA();b=newB();c=newC();d=newD(); a.Func();//执行a.Func:1.先检查申明类A2.检查到是虚拟方法3.转去检查实例类A,就为本身4.执行实例类A中的方法5.输出结果A b.Func();//执行b.Func:1.先检查申明类A2.检查到是虚拟方法3.转去检查实例类B,有重载的4.执行实例类B中的方法5.输出结果B c.Func();//执行c.Func:1.先检查申明类A2.检查到是虚拟方法3.转去检查实例类C,无重载的4.转去检查类C的父类B,有重载的5.执行父类B中的Func方法5.输出结果B d.Func();//执行d.Func:1.先检查申明类A2.检查到是虚拟方法3.转去检查实例类D,无重载的(这个地方要注意了,虽然D里有实现Func(),但没有使用override关键字,所以不会被认为是重载)4.转去检查类D的父类A,就为本身5.执行父类A中的Func方法5.输出结果ADd1=newD();d1.Func();//执行D类里的Func(),输出结果FuncInD Console.ReadLine();}}} 1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数; 2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。 3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。 Java中则是根据同名函数的签名(参数列表/返回值)判断是否为多态/重载。

E. Java语言的虚函数是怎么样的

java中并没有virtual关键字指示一个函数就是虚函数,java中的普通函数就相当于C++中的虚函数,抽象函数相当于C++中的纯虚函数。


publicclassDemo2{
publicstaticvoidmain(String[]args){

Parentp=newChild();
p.print();
p.func1();
}
}

abstractclassParent{

//抽象函数
publicabstractvoidprint();

//普通函数
publicvoidfunc1(){
System.out.println("Parentfunc1");
}
}

classChildextendsParent{

//实现抽象函数
publicvoidprint(){
System.out.println("Child");
}

//覆盖父类的func1函数
publicvoidfunc1(){
System.out.println("Childfunc1");
}
}

F. java里面有虚方法么

java中没有明确说明什么是虚方法;
虚方法是C++来的
java虚方法你可以理解为java里所有被overriding的方法都是virtual的,所有重写的方法都是override的
class Program
{
static void Main(string[] args)
{

Person p = new Person("test1");
p = Person.Find("Aseven");
int Age = p.GetAge();
p.Say();
Console.ReadKey();

}
}
public class Person
{
private string _name;
private int _age;

public string Name
{
get { return _name; }
set { _name = value; }
}
public virtual void Say()
{
Console.WriteLine("******");
}
public static Person Find(string name)
{
return new Chinese(name);//模拟数据库查找
}
public int GetAge()
{
return _age;
}
public Person() { }
public Person(string name)
{
this._name = name;
}
}

public class Chinese : Person
{
public Chinese(string name)
{
this.Name = name;
}
public override void Say()
{
Console.WriteLine("你好!");
}
}
public class American : Person
{
public American(string name)
{
this.Name = name;
}
public override void Say()
{
Console.WriteLine("Hello!");
}
}

G. Java函数为什么默认是虚函数

虚函数的存在是为了多态。

以C++与Java比对说明:
C++中普通成员函数加上virtual关键字就成为虚函数。
Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为。如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数。

总结:java在最大限度地保留了面向对象三要素(封装、继承、多态)的基础上,尽最大努力讲语法进行简化。C++为实现多态需要额外的关键字,而Java则直接提供了这种机制,是的封装、继承和多态变得更加容易使用。

H. JAVA中,有没有虚方法的概念,还是C#的概念

java没有虚方法的概念的,c#中有虚方法,是从c++过来的,虚方法在c#中是实现多态的一种方式而已,java中实现多态使用的是跟c#中一样的抽象方法。当然重载也是多态的一种,希望能帮到你~

热点内容
专网数据存储安全问题分析 发布:2024-05-04 07:33:28 浏览:130
如何获得打印机无线密码 发布:2024-05-04 06:44:59 浏览:417
上古诸神录哪里改密码 发布:2024-05-04 06:43:55 浏览:262
灌篮高手手游自动盖帽脚本 发布:2024-05-04 06:42:31 浏览:424
javajs引擎 发布:2024-05-04 06:37:33 浏览:797
javalist重复 发布:2024-05-04 06:19:27 浏览:510
max脚本管理 发布:2024-05-04 06:02:31 浏览:45
自行搭建服务器 发布:2024-05-04 06:01:12 浏览:126
h3c如何查看所有配置 发布:2024-05-04 05:26:39 浏览:493
java统计字符串中字母个数 发布:2024-05-04 05:22:58 浏览:888