java 代码问题之final
发布网友
发布时间:2022-05-29 03:22
我来回答
共6个回答
热心网友
时间:2024-03-07 23:52
无法输出任何结果,因为System.out.println()是要输出结果,但是无论调用的是哪个类的yyy()方法,都声明为void,没有返回值啊。
(1)public class BB extends AA {
final AA fa = new AA();
void yyy() {
System.out.println("在fa.yyy()");
fa.xxx = 123;
}
public static void main(String[] args) {
new BB().fa.yyy();//此处修改
}
}
class AA {
int xxx;
void yyy() {
xxx = 1;
System.out.println("在fa.yyy()");//添加
}
}
(2)
public class BB extends AA {
final AA fa = new AA();
void yyy() {
System.out.println("在fa.yyy()");
fa.xxx = 123;
}
public static void main(String[] args) {
new BB().yyy();
}
}
class AA {
int xxx;
void yyy() {
xxx = 1;
}
}
(3)
public class BB extends AA {
void yyy() {
System.out.println("在fb.yyy()");
super.xxx = 123;
}
public static void main(String[] args) {
AA a = new BB();
a.yyy();
}
}
class AA {
int xxx;
void yyy() {
xxx = 1;
System.out.println("在fa.yyy()");
}
}
其实不建议在代码中随便使用继承。当使用继承的时候,应当考虑是否需要向上转型“upcasting”。一般应当首先考虑使用组合,即持有类的引用。源程序使用了继承,又在bb类中持有aa的引用,貌似继承没有用到。追问请问这三句new BB().yyy();
new BB().fa.yyy();
final AA fa = new AA();
的意思,我有点模糊,谢谢了
追答new BB().yyy();//调用BB类里面的yyy()方法
new BB().fa.yyy();//调用BB类里面的成员变量AA里面的yyy()方法
final AA fa = new AA();//将AA声明为final
我的修改主要是基于上面的程序,不建议这样写,所以还是自己先看书,把基础打好
热心网友
时间:2024-03-07 23:53
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final aa fa=new aa(); // 实例化了一个final型的aa类的对象:fa
final void yyy() //声明方法yyy()为final型方法,不能被bb类的子类覆盖
参考资料:http://ke.baidu.com/view/2116821.htm
热心网友
时间:2024-03-07 23:53
final 修饰的变量为常量 不可以被改变 且必须要初始化
final 修饰的方法不能被重写
final 修饰的类 称为最终类 也不能被继承
另外 你的代码也有些小问题
首先你已经继承了 aa 就没必要new 它了
还有 你父类 本来就有个yyy()方法 那你子类重写的时候 干嘛还加final 修饰呢
热心网友
时间:2024-03-07 23:54
java中声明类、属性和方法,可使用关键字final来修饰。
2.Final标记的类不能被继承。
3.Final标记的方法不能被子类重写
4.Final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
代码有问题 运行没结果
final aa fa=new aa(); //改为 aa fa=new aa();
System.out.println("在yyy()"); //改为 System.out.println("在" + fa.yyy());
这个程序不适合例证 final 给你举个例子
public class Test1 {
public static void main(String[] args) {
// TODO 自动生成方法存根
}
public void f1() {
System.out.println("f1");
}
//无法被子类覆盖的方法
public final void f2() {
System.out.println("f2");
}
public void f3() {
System.out.println("f3");
}
private void f4() {
System.out.println("f4");
}
}
public class Test2 extends Test1 {
public void f1(){
System.out.println("Test1父类方法f1被覆盖!");
}
public static void main(String[] args) {
Test2 t=new Test2();
t.f1();
t.f2(); //调用从父类继承过来的final方法
t.f3(); //调用从父类继承过来的方法
//t.f4(); //调用失败,无法从父类继承获得
}
}追问上面的代码是书上的一题习题来的,它上面说没有问题,但是我好像看得不懂,可以解释一下莫?具体一点,最后可以利用测试类来看看结果
追答你好
你只需要记住这样的话 就可以了 final 关键字 以后遇到只要你看的懂 并且知道什么意思什么情况用 其他不必深究 俗话说好刀用到刀刃上
java中声明类、属性和方法,可使用关键字final来修饰。
2.Final标记的类不能被继承。
3.Final标记的方法不能被子类重写
4.Final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
热心网友
时间:2024-03-07 23:54
/**
* @param args
* @throws NamingException
*/
像这种以"/**"斜杠加两个星号的注释是会被加到doc中的,如果在eclipse中还可以使用alt+shift+j自动生成注释。
热心网友
时间:2024-03-07 23:55
修饰fa的表示fa的值不能再更改(常量)
修饰yyy的表示该函数不能在子类里被重写
你创建一个bb的实例不就可以看见结果了?..写一个Main总会吧..追问那请你把完整的写下来吧,好让我运行一下,我写的就是出现问题
class aa{
int xxx;
void yyy(){
xxx=1;
}
}
public class bb extends aa{
final aa fa=new aa();
void yyy(){
System.out.println("在fa.yyy()");
fa.xxx=123;
}
public static void main (String[] args) {
System.out.println(fa.yyy());
}
}
无法从静态上下文中引用非静态 变量 fa
此处不允许使用 "void" 类型
这样的怎么解决
追答我觉得你还没有了解你的代码的意思是什么..
fa是每个bb的实例里的成员,不创建bb的实例,直接拿fa是没有意义的,好比连一个'人'都没有,就直接拿来'手'说事
把main里的fa改成new bb().fa
还有,把yyy改成public的,否则不允许外面(main里)调用的
还有,yyy都不返回值,你为什么要去打印它..把"System.out.println"去了,只保留里面的