没有声明,这个方法出处在哪,引入即可
(抽象类一定不能new)
因为由子类的抽象方法的具体实现来完成。
例子:
//具体定义
abstract class Person{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
//只声明而为实现的方法(不能直接使用,只能由子类的抽象方法来实现完成)
public abstract void getPerson();
}
public class Test{
public static void main(String[] args) {
}
}
定义抽象类的目的就是想让类继承,实现覆写
private与abstract不能同时出现,抽象方法必须被覆写而private方法无法被覆写
(解释:抽象类是“半成品”,不能直接new 自己;由于存在向上转型,如果子类是一个普通类,可以把他变为抽象类进行使用)
且子类依然遵循对象实例化流程,先调用抽象类构造方法而后再调用子类构造。
(解释:先调用父类构造,产生父类对象,才有子类对象)
(抽象类是普通类的超级,普通类有构造方法,那抽象类一定有构造方法)
- d.抽象类可以没有抽象方法,但是此时任然不能直接实例化对象。
例子:
//具体定义
abstract class Person{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
//只声明而为实现的方法(不能直接使用)
public abstract void getPersonInfo();
}
class Student extends Person{
public void getPersonInfo(){
System.out.println("111");
}
}
public class Test{
public static void main(String[] args) {
//通过向上转型,把Student对象指向了一个父类的引用
Person per = new Student();
//这时调用per.getPersonInfo();执行输出
per.getPersonInfo();
}
}
笔试题:
//请问输出是多少?
A.0
B.30
C.100
D.编译错误
abstract class Person {
public Person() {
this.print();
}
public abstract void print();
}
class Student extends Person{
private int num = 100;
public Student(int num){
this.num = num;
}
public void print(){
System.out.println(num);
}
}
public class Test{
public static void main(String[] args) {
new Student(30);
}
}
输出:A.0
解释:
一:**从入口开始看**,
第一步调用子类Student这个类的构造方法,将30传值,但是
在**子类构造中有一个隐藏的super();(因为继承关系)**,所以先调用
父类构造方法再到子类。故当调用子类这个有参构造时连方法都进不去。
二:所以先在父类(**本质上第一步从父类开始**),Person的无参构造
调用了print方法(this表示本类对象),this在父类中,且用abstract关键字修饰,
所以此时print方法调用不了。
三:故去寻找子类中有无print方法,至子类中的print方法中,
子类的print方法覆写了父类,故从子类的覆写后的方法进行输出,
此时的num还未进行this.num = num;这一行的赋值。
四:实际上private int num = 100;这一行在编译的时候在构造方法中执行,
但是在主方法中有new,所以开辟了一块新空间,所有属性都有默认值,故输出结果为0;
扩展:
扩展:
public class Test{
public static void main(String[] args) {
new Student(30).print();
}
}
输出0,30
此时Student这个构造方法已经全部执行完成,最后才调用print方法,
print方法是通过子类Student类new调用,print方法被覆写,
所以调用的一定是被覆写后的方法。(先等于100,在等于30),
故输出30.
例子:
abstract class Person{
public abstract void print();
//在抽象类内部提供了一个实现好的子类,
//(静态方法可通过类名称直接调用)
public static Person getInstance(){
//方法内部类,继承了抽象类并实现,
//方法返回了实现好的子类
class Student extends Person{
public void print(){}
}
return new Student();
}
}
public class Test{
public static void main(String[] args) {
Person per = new Student();
per.print();
}
}
例子:
abstract class Person{
public abstract void print();
//在抽象类内部提供了一个实现好的子类(静态方法可通过类名称直接调用)
public static Person getInstance(){
//匿名内部类,隐藏了没有名字的类
//等同于class 无名 extends Person{}
//直接实例化:new Person();
return new Person(){
//内部类
public void print(){}
}
}
}
.
该问题的报错提示是有未使用的方法,需要你给出的解决方案是修复未使用方法的问题以及如何使用该方法。具体的解决方案如下:
例如,假设你找到的未使用的方法名为 testMethod(),并且你在代码中需要使用该方法来输出一段文字。你可以按照以下步骤进行解决:
如果你的程序中有多个未使用的方法,需要针对每个方法进行相应的修改。
注意,该报错可能是因为你的代码中调用了未实现的方法,这种情况需要你进行相应的实现。另外,也可能是因为你没有正确地编写方法的调用语句,需要检查一遍方法的调用是否正确。如果你发现无法修复问题,可以考虑寻求程序员的帮助。