当前位置:首页 » 编程软件 » java重写和编译器

java重写和编译器

发布时间: 2023-08-14 11:01:06

1. java什么是方法重写的语法规则

一、方法的重写。
1、重写只能出现在继承关系之中。当一个类继承它的父类方法时,都有机会重写该父类的方法。一个特例是父类的方法被标识为final。重写的主要优点是能够定义某个子类型特有的行为。

class Animal {
public void
eat(){

System.out.println ("Animal is eating.");

}
}

class Horse extends Animal{

public void eat(){

System.out.println ("Horse is
eating.");
}

}

2、对于从父类继承来的抽象方法,要么在子类用重写的方式设计该方法,要么把子类也标识为抽象的。所以抽象方法可以说是必须要被重写的方法。

3、重写的意义。
重写方法可以实现多态,用父类的引用来操纵子类对象,但是在实际运行中对象将运行其自己特有的方法。

public class Test {
public static
void main (String[] args) {

Animal h = new Horse();

h.eat();

}

}

class Animal {

public void eat(){

System.out.println ("Animal is
eating.");
}

}

class Horse extends
Animal{
public void
eat(){

System.out.println ("Horse is eating.");

}
public void
buck(){
}

}

一个原则是:使用了什么引用,编译器就会只调用引用类所拥有的方法。如果调用子类特有的方法,如上例的h.buck();
编译器会抱怨的。也就是说,编译器只看引用类型,而不是对象类型。

4、重写方法的规则。
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求!

重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别。
(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。)
比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。

重写规则之二:参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。

重写规则之三:返回类型必须与被重写方法的返回类型相同。
父类方法A:void
eat(){} 子类方法B:int eat(){} 两者虽然参数相同,可是返回类型不同,所以不是重写。
父类方法A:int
eat(){} 子类方法B:long eat(){}
返回类型虽然兼容父类,但是不同就是不同,所以不是重写。

重写规则之四:重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
例:

import java.io.*;
public class Test
{
public static void main (String[]
args) {
Animal h =
new Horse();
try
{

h.eat();

}

catch (Exception e) {

}

}
}

class Animal
{
public void eat() throws
Exception{

System.out.println ("Animal is eating.");

throw new
Exception();
}

}

class Horse extends
Animal{
public void eat() throws
IOException{

System.out.println ("Horse is eating.");

throw new
IOException();
}

}
这个例子中,父类抛出了检查异常Exception,子类抛出的IOException是Exception的子类,也即是比被重写的方法抛出了更有限的异常,这是可以的。如果反过来,父类抛出IOException,子类抛出更为宽泛的Exception,那么不会通过编译的。
注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中。

重写规则之五:不能重写被标识为final的方法。

重写规则之六:如果一个方法不能被继承,则不能重写它。
比较典型的就是父类的private方法。下例会产生一个有趣的现象。

public class Test {
public static
void main (String[] args) {

//Animal h = new Horse();

Horse h = new
Horse();

h.eat();
}

}

class Animal {

private void eat(){

System.out.println ("Animal is
eating.");
}

}

class Horse extends
Animal{
public void
eat(){

System.out.println ("Horse is eating.");

}

}
这段代码是能通过编译的。表面上看来违反了第六条规则,但实际上那是一点巧合。Animal类的eat()方法不能被继承,因此Horse类中的eat()方法是一个全新的方法,不是重写也不是重载,只是一个只属于Horse类的全新的方法!这点让很多人迷惑了,但是也不是那么难以理解。
main()方法如果是这样:

Animal h = new Horse();
//Horse h = new
Horse();

h.eat();
编译器会报错,为什么呢?Horse类的eat()方法是public的啊!应该可以调用啊!请牢记,多态只看父类引用的方法,而不看子类对象的方法!

2. Java主要有那些特性

Java主要有哪些的特性?

Java由美国SUN公司(被oracle公司收购)发明于1995年,是目前业界应用最广泛、使用人数最多的语言,连续多年排名世界第一,可以称之为“计算机语言界的英语”。

那么Java这么高的评价它的特点有哪些,下面我来为题主解答:

一、跨平台/可移植性

这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。

Java首先利用文本编辑器编写 Java源程序,源文件的后缀名为.java;再利用编译器(javac)将源程序编译成字节码文件,字节码文件的后缀名为.class; 最后利用虚拟机(解释器,java)解释执行。如下图所示:

二、安全性

Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。比如Java取消了强大但又危险的指针。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的。

三、面向对象

面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!Java则是完全的面向对象语言。

四、简单性

Java就是C++语法的简化版,我们也可以将Java称之为“C++-”。跟我念“C加加减”,指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。同时,由于语法基于C语言,因此学习起来完全不费力。

五、高性能

Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接近C++的效率。

因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。

六、分布式

Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。

七、多线程

多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。

八、健壮性

Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。

以上几种特性你了解到啦吗? 记得给个赞!

3. Java 方法重写问题

重写: 重写方法必须和被重写方法具有 相同的 方法名、参数列表、和返回值类型。
必须和父类的参数列表相同为什么:
上面说的不错,是为了多态,重写是多态的必要条件之一,多态说白了就是程序执行前(包括编写代码时和编译.java源文件的时候)你调的是父类被重写这方法,真正在运行时(程序执行以后),实际当中,动态绑定(在运行期间真正的new出该对象来,对象内部有一个指针,指向该对象重写的写个方法),调用的是子类重写的这个方法。
方法的参数是形参,形参的作用是接收调用该方法时传过来的实参,形参属于局部变量,那么毫无疑问方法内部是要使用这些个参数做一些事情的,重写要求参数列表必须相同,如果不相同,那么你调父类被重写的这个方法,参数列表不同,那实际当中还执行子类这重写方法,那不矛盾么?内部不混乱了么?参数对不上号,人家重写方法内部要用这参数怎么办啊?

下面这个不太肯定,不过我还是说一下我的看法:
构造方法能不能被继承,new一个子类对象出来的时候,子类对象里面包含着一个父类对象,也就是说,父类对象的所有东西子类对象全部都拥有了,全部都继承下来了,但是有些东西你是有拥有权,没有使用权,比方说private的方法,构造方法是new一个对象的时候必然要调用的方法,初始化对象用的,这个方法比较特殊,不像一般的方法一样,是为了做一件事儿,它就是new对象时候调的方法,我认为构造方法还是继承下来了,但是你用不了,无法用子类对象的引用去调用构造方法。

4. java中,在子类中是否允许有一个方法和父类的方法名字相同,而类型不同

在Java SE 5.0之前的版本,子类覆盖父类的方法时,返回类型必须一样。

之后的版本允许子类的覆盖方法的返回类型是原返回类型的子类型。

热点内容
怎么给游戏设置密码 发布:2025-02-04 18:03:08 浏览:921
商品存储规划 发布:2025-02-04 17:45:24 浏览:564
ios访问共享 发布:2025-02-04 17:36:33 浏览:334
javabuild 发布:2025-02-04 17:30:19 浏览:591
gnulinux编译 发布:2025-02-04 17:30:18 浏览:131
苏州阿里云服务器专网 发布:2025-02-04 17:21:05 浏览:526
如何学习php 发布:2025-02-04 17:11:55 浏览:389
sql查询锁 发布:2025-02-04 17:04:00 浏览:396
第二代长安cs55plus买哪个配置 发布:2025-02-04 16:58:16 浏览:193
彩虹岛用什么电脑配置 发布:2025-02-04 16:52:22 浏览:649