JAVA超难理解的问题:为什么要这样定义?????
父类名变量名=new子类名()l;抽象类变量名=new类名()l;接口变量名=new类名()l;尤其是父类名变量名=new子类名()l;为什么要这样做???相比子类名变量...
父类名 变量名=new 子类名()l;
抽象类 变量名=new 类名()l;
接口 变量名=new 类名()l;
尤其是父类名 变量名=new 子类名()l; 为什么要这样做???相比子类名 变量名=new 子类名()l; 有什么好处??例如有父类Person ,子类student,Person p=new Student(); 为什么有时候这样写呢?还这样写呢:Student p=new Student(); ???? 展开
抽象类 变量名=new 类名()l;
接口 变量名=new 类名()l;
尤其是父类名 变量名=new 子类名()l; 为什么要这样做???相比子类名 变量名=new 子类名()l; 有什么好处??例如有父类Person ,子类student,Person p=new Student(); 为什么有时候这样写呢?还这样写呢:Student p=new Student(); ???? 展开
6个回答
展开全部
多态的一种:父类的引用指向子类的对象。
好处:
1.泛化。例如你有一个方法,入参设置为Student,那么这个方法只能处理学生。而Person,就既可以处理学生又可以处理其它子类对象。
2.代码依赖抽象,解耦!当你的程序依赖于抽象的时候,就不会受到具体类的影响,便于替换。例如:
List list = new ArrayList(); //如果以后发现集合使用的不合适,只要重新new LinkedList()就可以,后面调用代码不需要修改
.......
ArrayList list = new ArrayList();//这就不容易修改例如,将ArrayList换为LinkedList的话,后面调用可能会大量修改。因为之前list的类型是ArrayList调用到的方法是ArrayList中的所有方法,即包括List接口定义的方法也包括除List接口外,自身添加的方法。
........
好处:
1.泛化。例如你有一个方法,入参设置为Student,那么这个方法只能处理学生。而Person,就既可以处理学生又可以处理其它子类对象。
2.代码依赖抽象,解耦!当你的程序依赖于抽象的时候,就不会受到具体类的影响,便于替换。例如:
List list = new ArrayList(); //如果以后发现集合使用的不合适,只要重新new LinkedList()就可以,后面调用代码不需要修改
.......
ArrayList list = new ArrayList();//这就不容易修改例如,将ArrayList换为LinkedList的话,后面调用可能会大量修改。因为之前list的类型是ArrayList调用到的方法是ArrayList中的所有方法,即包括List接口定义的方法也包括除List接口外,自身添加的方法。
........
追问
可以写出代码帮我理解吗?Person p=new Student(); 这个p是属于哪个对象的?是不是属于Person又属于Student????“=”在这是不是赋值的意思?这个p是不是既可以调到Person中的方法又可以调用Student中的方法??
追答
p是一个引用(在C中称为指针)。引用在栈区开辟空间,p在栈区。p会指向堆区中的一块空间,而这块空间就是由Student创建的。Person p,是在说明指针p的类型是Person类型。那么p就可以指向Person及其所有子类的对象。p调用方法的时候,能调用到Person中声明的方法。但是,并不是说Student中的方法调用不到,因为在继承的时候可以对方法重写。所以如果Student中重写了Person中的方法,那么p就会调用到Student中的方法。但是Student中的方法是独有的方法,那么用Person是调用不到的。
展开全部
这是基本的使用
class Base {
String var = "BaseVar"; // 实例变量
static String staticVar = "StaticBaseVar"; // 静态变量
void method() { // 实例方法
System.out.println("Base method");
}
static void staticMethod() { // 静态方法
System.out.println("Static Base method");
}
}
public class Sub extends Base {
String var = "SubVar"; // 实例变量
static String staticVar = "StaticSubVar"; // 静态变量
void method() { // 覆盖父类的method()方法
System.out.println("Sub method");
}
static void staticMethod() { // 隐藏父类的staticMethod()方法
System.out.println("Static Sub method");
}
String subVar = "Var only belonging to Sub";
void subMethod() {
System.out.println("Method only belonging to Sub");
}
public static void main(String args[]) {
Base who = new Sub(); // who被声明为Base类型,引用Sub实例
System.out.println("who.var=" + who.var); // 打印Base类的var变量
System.out.println("who.staticVar=" + who.staticVar); // 打印Base类的staticVar变量
who.method(); // 打印Sub实例的method()方法
who.staticMethod(); // 打印Base类的staticMethod()方法
}
class Base {
String var = "BaseVar"; // 实例变量
static String staticVar = "StaticBaseVar"; // 静态变量
void method() { // 实例方法
System.out.println("Base method");
}
static void staticMethod() { // 静态方法
System.out.println("Static Base method");
}
}
public class Sub extends Base {
String var = "SubVar"; // 实例变量
static String staticVar = "StaticSubVar"; // 静态变量
void method() { // 覆盖父类的method()方法
System.out.println("Sub method");
}
static void staticMethod() { // 隐藏父类的staticMethod()方法
System.out.println("Static Sub method");
}
String subVar = "Var only belonging to Sub";
void subMethod() {
System.out.println("Method only belonging to Sub");
}
public static void main(String args[]) {
Base who = new Sub(); // who被声明为Base类型,引用Sub实例
System.out.println("who.var=" + who.var); // 打印Base类的var变量
System.out.println("who.staticVar=" + who.staticVar); // 打印Base类的staticVar变量
who.method(); // 打印Sub实例的method()方法
who.staticMethod(); // 打印Base类的staticMethod()方法
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
抽象类 变量名=new 类名()l;
接口 变量名=new 类名()l;
这两个是不能定义的。。。抽象类不能够实例化对象。
后面的是多态的定义方式。。你可以查一下。
接口 变量名=new 类名()l;
这两个是不能定义的。。。抽象类不能够实例化对象。
后面的是多态的定义方式。。你可以查一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
父类名 变量名=new 子类名()
例如 ;一家有一对儿女,别人家要取他女儿,找她父亲问女儿。别人家要嫁他儿子,找他父亲问他儿子。
例如 ;一家有一对儿女,别人家要取他女儿,找她父亲问女儿。别人家要嫁他儿子,找他父亲问他儿子。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是java多态性的体现,使用父类名 变量名=new 子类名(),这样父类的引用指向子类对象可以使用子类中新定义的方法,也可以使用父类自己原有的方法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
上面已经涉及到技巧性的问题了。使用得多了自然会发现其中有什么不同。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询