精华内容
下载资源
问答
  • 抽象类可以作为子类吗
    千次阅读
    2019-10-01 10:11:00
    package com.wtd;
    
    public abstract class Car {
        private String name= "car";
    
        public Car(String name) {
            this.name = name;
        }
    }
    
    
    public class JeepCar extends Car {
        public JeepCar(String name){
            super(name);
        }
    }

    现在我要创建JeepCar的实例,JeepCar jC= new JeepCar();那么我在debug的过程中,看到jvm运行的时候,先调用抽象父类的构造器Car(){},将属性初始化,然后回到JeepCar(){}子类构造器。

    疑问:因为知道抽象类是不能初始化的,那么super(name)调用父类构造器,会初始化父类实例吗?如果不初始化父类实例,那么也就是说调用构造器并不一定初始化实例了,那这里的super(name)又有什么用处呢?

    对这些疑问,自己很迷惑,所以只有求助于网络了。从网上找了些感觉比较靠谱的解释。

    解释1:

      调用子类构造方法都会调用它的直接父类的构造方法。可以认为new才会返回一个实例的引用,而抽象类是不能new的(这个是规定,没理由)。
    调用子类构造方法是调用了它的抽象父类的构造方法,但构造方法是用来做初始化工作的,它并不会返回实例。

    解释2:

      抽象类中的构造方法其实是用来给继承的子类来用的,因为构造方法相当于初始化方法,当子类调用构造方法时必须调用父类构造方法,所以你可以在子类产生对象 时抽象类中按需求初始化抽象类中的字段以及执行一些初始化代码。其实并不是一定要生成某个类的实例才调用构造方法,子类也需要调用父类构造方法。而生成实 例也并不一定会调用构造方法,在某些特殊实现中或者特殊情况下,生成实例不会调用构造方法。而调用了构造方法也不一定就生成了一个实例,但是那一定是一个 实例调用的,就像一个普通的实例方法一样。

    解释3:

      抽象类不能被实例化是说Person p=new Person();这样是错误的;但是Person p=new Employee(); 是可以的,创建子类的实例,父类的引用指向它
    在上述主程序中,new Employee后,它会初始化对象,初始化顺序为:
    父类静态块初始化---->子类静态块初始化---->父类非静态块初始化---->父类构造方法---->子类非静态块初始化---->子类构造方法。(先静后动,先父后子) 
    这个主程序会先初始化person类的非静态属性和构造函数再初始化employees类的非静态属性和构造函数

    这就是你第一个问题的当子类的父类为抽象类时,构造方法如何追溯?而抽象类作为父类也会创建实例么?没有创建实例只是构造函数在对抽象类Person的属性初始化,对于一个类的声明,赋值     和使用两件事情,前者不需要实例化,后者必须实例化 。

     

    自己的简单总结:类的构造器,不论抽象还是非抽象,作用都一样,就是初始化属性的;

            只有构造器和new连在一块使用时,才是创建类的实例(对象)。

            抽象类中的构造方法是怎么回事?就是初始化属性的作用

        

    转载于:https://www.cnblogs.com/westward/p/5323111.html

    更多相关内容
  • 抽象类Shape及其子类

    千次阅读 2020-03-19 14:19:21
    定义抽象类Shape,圆形Circle、长方形Square、Rectangle为子类。 Shape类有一个数据成员(double型),定义带参构造方法、抽象方法calArea()(返回值类型:double)在Circle、Square两个类中,实现calArea()方法。在...

    定义抽象类Shape,圆形Circle、长方形Square、Rectangle为子类。

    Shape类有一个数据成员(double型),定义带参构造方法、抽象方法calArea()(返回值类型:double)在Circle、Square两个类中,实现calArea()方法。在Rectangle类中,增加一个数据成员(double型),实现calArea()方法。编写测试类:定义一个Shape类引用shape,分别指向一个Circle类、Square类、Rectangle类对象,利用多态,计算各平面图形的面积并输出。(结果保留三位小数)要求:1.数据成员全部为私有成员;2.数据从键盘输入,调用带参构造方法创建子类对象。提示:使用Math类的PI

    import java.util.Scanner;
    public class ShapeDemo {
    	public static void main(String[] args) {
    		Scanner in=new Scanner(System.in);
    		double a,b,c,d;
    		a=in.nextDouble();
    		b=in.nextDouble();
    		c=in.nextDouble();
    		d=in.nextDouble();
    		Shape sh=new Circle(a);
    		System.out.printf("圆的面积:%.3f",sh.calArea());
    		System.out.println();
    		sh=new Square(b);
    		System.out.printf("正方形的面积:%.3f",sh.calArea());
    		System.out.println();
    		sh=new Rectangle(c,d);
    		System.out.printf("矩形的面积:%.3f",sh.calArea());
    		in.close();
    	}
    
    }
    abstract class Shape
    {
    	private double a;
    	public Shape()
    	{
    		a=0;
    	}
    	public Shape(double a)
    	{
    		this.a=a;
    	}
    	abstract double calArea();
    	public double getA() {
    		return a;
    	}
    	public void setA(double a) {
    		this.a = a;
    	}
    }
    class Circle extends Shape
    {
    	public Circle(double a)
    	{
    		super(a);
    	}
    	double calArea() {
    		return getA()*getA()*Math.PI;
    	}
    	
    }
    class Square extends Shape
    {
    	public Square(double a)
    	{
    		super(a);
    	}
    	double calArea() {
    		return getA()*getA();
    	}
    	
    }
    class Rectangle extends Shape
    {
    	private double b;
    	public Rectangle(double a,double b)
    	{
    		super(a);
    		this.b=b;
    	}
    	double calArea() {
    		return getA()*b;
    	}
    	
    }
    
    展开全文
  • JAVA——抽象类

    千次阅读 2021-03-09 00:47:50
    一、抽象类的概念包含一个抽象方法的类就是抽象类,其本质是对多个普通类中相同的部分的抽象。二、抽象类的特点1.抽象方法和抽象类使用 abstract 修饰;...6.抽象类的抽象方法强制子类重写;7. 抽象类中所有的内容...

    一、抽象类的概念

    包含一个抽象方法的类就是抽象类,其本质是对多个普通类中相同的部分的抽象。

    二、抽象类的特点

    1.抽象方法和抽象类使用 abstract 修饰;

    2.有一个抽象方法的类必须是抽象类;

    3.抽象类中一定有抽象方法,反之不成立;

    4.抽象类不能够实例化 ,即不能创建对象;

    5.抽象类的成员一般使用 public 或者 protected修饰;

    6.抽象类的抽象方法强制子类重写;

    7. 抽象类中所有的内容均是用来给子类使用;

    三、抽象类与普通类的区别

    抽象类和普通类在结构上的区别:抽象类有抽象方法,而普通类没有。

    四、抽象类的子类的特点

    1 如果子类想要继承抽象类,就必须实现抽象类中所有的抽象方法;

    2 如果子类不想实现父类的抽象方法,那么子类必须升级为抽象类。

    五、代码演示

    例:编写一个交通工具类,具有前进run()功能,其子类有自行车、小轿车、地铁,重写父类方法。

    主人有属性name,age属性,方法回家goHome(交通工具),需要使用交通工具,使用抽象类优化程序。

    public static void main(String[] args) {

    Hoster hoster = new Hoster("张三", 30);

    Vehicle v = new Bike(); //使用多态创建对象

    hoster.goHome(v); //调用goHome()方法

    //创建匿名对象new Car(),并将其作为goHome()方法的形式参数

    hoster.goHome(new Car());

    //创建匿名对象new Hoster("李四", 31)并赋值,再调用goHome()方法

    new Hoster("李四", 31).goHome(new Subway());

    }

    class Hoster {

    private String name;

    private int age;

    public Hoster() {

    super();

    }

    public Hoster(String name, int age) {

    super();

    this.age = age;

    }

    public void goHome(Vehicle v) {

    v.run(this); //将参数传递给此处goHome方法,再调用this所指向对象 // (谁调用的goHome就指向谁)的run()方法。

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    }

    abstract class Vehicle { //abstract修饰的抽象类

    public abstract void run(); //abstract修饰的抽象方法

    public abstract void run(Hoster hoster); //abstract修饰的抽象方法

    }

    class Bike extends Vehicle {

    @Override //run()方法重写

    public void run() {//实现父类中的抽象方法

    System.out.println("自行车在跑");

    }

    @Override//run(Hoster hoster)方法重写

    public void run(Hoster hoster) {//实现父类中的抽象方法

    System.out.println(hoster.getName() + "骑着自行车回家"); //执行

    }

    }

    class Car extends Vehicle {

    @Override//run()方法重写

    public void run() {//实现父类中的抽象方法

    System.out.println("小轿车在跑");

    }

    @Override//run(Hoster hoster)方法重写

    public void run(Hoster hoster) {//实现父类中的抽象方法

    System.out.println(hoster.getName() + "开着小轿车回家");//执行

    }

    }

    class Subway extends Vehicle {

    @Override //run()方法重写

    public void run() {//实现父类中的抽象方法

    System.out.println("地铁在跑");

    }

    @Override // run(Hoster hoster)方法重写

    public void run(Hoster hoster) {//实现父类中的抽象方法

    System.out.println(hoster.getName() + "坐着地铁回家");//执行

    }

    }

    展开全文
  • 方法的形参是抽象类名,其实需要的是抽象类子类对象 方法的返回值是抽象类名,其实返回的是抽象类子类对象 三,接口名作为形参和返回值 方法的形参是接口名,其实需要的是接口的实现类对象 方法的返回值是...

    一,类名作为形参和返回值

    方法的形参是类名,其实需要的是该类的对象
    方法的返回值是类名,其实返回的是该类的对象
     

    二,抽象类名作为形参和返回值

    方法的形参是抽象类名,其实需要的是抽象类的子类对象
    方法的返回值是抽象类名,其实返回的是抽象类的子类对象

    三,接口名作为形参和返回值

    方法的形参是接口名,其实需要的是接口的实现类对象
    方法的返回值是接口名,其实返回的是接口的实现类对象

    四,案例

    类名作为形参和返回值之前的学生信息管理案例有所涉及,不再练习

    PlayGame接口

    public interface PlayGame {
        String name="小米";
        void playgame();
        void show(PlayGame p);
    }

    Phone抽象类

    public abstract class Phone {
        public String name;
        public abstract void call();
        public abstract void send();
        public abstract void show(Phone p);
    
    }
    

    elderphone,cellphone类

    public class ElderPhone extends Phone{
        @Override
        public void call(){
            System.out.println("老年机可以打电话");
        }
        @Override
        public void send(){
            System.out.println("老年机可以发信息");
        }
        public Phone newelderphone(){
            Phone p=new ElderPhone();
            return p;
        }
        @Override
        public void show(Phone p){
            System.out.println(p.name+"这是一个老年机");
        }
    }
    
    public class CellPhone extends Phone implements PlayGame{
        @Override
        public void call(){
            System.out.println("智能机可以打电话");
        }
        @Override
        public void send(){
            System.out.println("智能机可以发信息");
        }
    
        @Override
        public void show(Phone p) {
            System.out.println("智能机");
        }
    
        @Override
        public void playgame(){
            System.out.println("智能机可以玩游戏");
        }
        public PlayGame newcellphone(){
            PlayGame p=new CellPhone();
            return p;
        }
        @Override
        public void show(PlayGame p){
            System.out.println(p.name+"可以玩游戏");
        }
    }
    

    测试类

    public class test {
        public static void main(String[] args) {
            System.out.println("--------------------");
            ElderPhone ep=new ElderPhone();
    //        返回值是Phone类类型,实际上返回的是Phone的子类对象
            Phone ep1=ep.newelderphone();
            ep1.call();
    //        形参是Phone类类型,实际上传的是Phone的子类对象
            Phone ep2=new ElderPhone();
            ep2.name="诺基亚";
    //        将name赋值给ep2,可以看出show中传的参数确实是ep2
            ep1.show(ep2);
            System.out.println("--------------------");
            CellPhone cp=new CellPhone();
    //        返回值是接口名PlayGame,其实返回的是接口的实现类对象
            PlayGame cp1=cp.newcellphone();
            cp1.playgame();
    //        形参是接口名PlayGame,其实需要传入的是接口的实现类对象
            PlayGame cp2=new CellPhone();
            cp1.show(cp2);
        }
    }
    

    测试结果

    展开全文
  •  它可以有构造器,但是不能构造对象,抽象类中的构造器,在构造具体子类对象时调用,抽象方法决定抽象类抽象类可以没有抽象方法,具体父类型可以作为引用类型的声明;抽象父类型也可以作为引用类型的声明;...
  • PHP抽象类 介绍

    2020-12-19 10:19:53
    在自然语言中,我们理解抽象的概念是,一个物体的一种大的描述,这种描述对某类物体来说是共有的特性。那么在PHP中也是一样的,我们把一个类进行抽象,可以指明类的一般行为,这个类应该是...在子类实现抽象类的方法时
  • 抽象类能实例化吗

    千次阅读 2021-02-12 14:14:53
    抽象类能实例化吗?这个问题我想了一个晚上,看了好几篇...也可以用匿名内部类,在抽象类中创建一个匿名的子类,继承抽象类,通过特殊的语法实例化子类的对象 。(后面会细说)现在重点来了,要研究这个问题,前提是你...
  • 如何在抽象类中注入bean

    千次阅读 2021-03-16 18:28:05
    抽象类是无法实例化的,因此无法使用@Service等这种注解直接将抽象类交给ioc容器管理,但是项目中往往需要有很多子类公用抽象父类的模板方法,那么怎么实现呢?错误演示1、抽象类@Componentpublic abstract ...
  • 方法是:获取路径上存在的所有类名的列表加载每个并测试它是否是所需或接口的子类或实现者在Eclipse中,有一个很好的功能叫做类型层次结构,可以非常有效地显示它。如何以编程方式进行操作?15个解决方案112 ...
  • Spring在抽象类中注入bean

    千次阅读 2020-03-01 16:47:46
    在进行支付宝回调业务开发时,使用到了抽象类。把回调之后的业务处理如增加余额等公共的逻辑写在父类中。至于业务处理之前的验签工作依据子类对象配置的不同交由子类自己实现。 public abstract class ...
  • 抽象类作为方法的参数和返回值

    千次阅读 2019-02-26 11:01:02
    抽象类作为方法的参数 今后开发中,抽象类作为方法参数的情况也很多见。当遇到方法参数为抽象类型时,要传入一个抽象类的子类对象,如下图所示,先建立一个抽象类Animal,定义一个抽象方法eat 将抽象类类型,作为...
  • 想写一个List,其中Node的定义如下: ``` public abstract class Node{ public Node son=null;...这样然后实体作为参数传给Node可以实现的这种事情我也是知道的。单纯是觉得不美丽。
  • 抽象类作为方法参数与返回值

    千次阅读 2020-02-03 11:02:36
    一、抽象类作为方法参数 今后开发中,抽象类作为方法参数的情况也很多见。当遇到方法参数为抽象类类型时,要传入一个实现抽象类所有抽象方法的子类对象。如下代码演示: //抽象类 abstract class Person{ ...
  • Kotlin中的抽象类实现

    2020-08-25 09:49:47
    主要介绍了Kotlin中的抽象类实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Java关于抽象类能否被实例化的问题

    千次阅读 2021-02-27 12:43:48
    我对抽象类能否被实例化产生...而且,自己也知道,抽象类作为父类,其子类是能调用他的属性和已实现方法的。这证明抽象父类在内存是有一定空间的。(百度百科说:实例化其实就是在内存中开放一个空间用于存储新的产...
  • java抽象类 继承

    千次阅读 2021-03-08 06:02:32
    关于java抽象类 继承的搜索结果回答抽象类和接口的区别:默认的方法实现抽象类可以有默认的方法实现完全是抽象的。接口根本不存在方法的实现。抽象类可以有已经实现了的方法,也可以有被abstract修饰的方法(抽象...
  • Java抽象类中是否可以有构造方法

    千次阅读 2021-03-23 10:40:52
    之所以产生这个疑问,是因为Java抽象类本身的要求抽象类是不能被实例化的,抽象类只能作为其他类的父类,或者通过向上转型指向其子类。所以既然抽象类是不允许被实例化的,那么他的构造方法存在是否还有实际意义? ...
  • 主要介绍了Java面向对象程序设计:抽象类,接口用法,结合实例形式分析了java抽象类与接口相关概念、原理、用法与操作注意事项,需要的朋友可以参考下
  • 对应这一现象,Java中提供了抽象类,它只能作为父类,不能实例化。定义抽象类的作用是将一类对象的共同特点抽象出来,成为代表该类共同特性的抽象概念,其后在描述某一具体对象时,只要添加与其他子类对象的不同之处...
  • Java中的抽象类和接口

    千次阅读 多人点赞 2022-04-08 15:17:42
    各位铁汁们大家好呀!今天让我们继续学习java,看看java中的抽象类和接口到底是什么? 里面也会讲到多态呀,一起来看看吧
  • 1.定义一抽象类Pet(宠物)类,作为基类。 2.类中定义两个私有字段毛色和年龄,定义抽象方法完成宠物的自我介绍功能; 3.定义两个派生类Cat和Dog,再覆写基类抽象方法; 4.定义包含主方法的类MainClass,通过抽象类...
  • java学习笔记(12-继承、抽象类

    千次阅读 2021-03-15 17:45:41
    1.继承关键字extendsjava中继承特点:在Java中,只支持单...而B可以去继承A,这时,C也可称作A子类子类只能获取父类非私有成员super:可以获取父类的成员变量和成员方法,用法和this是相似的package c...
  • 关于抽象类无法实例化,但是可以使用"new"来实例的疑问. 背景:昨天下午回答一个实习生问的问题,大致的经过是这样的: 他问的:“为什么抽象类无法实例化,但是可以new出来一个实例,官方这么说是什么意思?而且去了各类...
  • Java抽象类

    2021-03-01 08:02:24
    一、解释:Java的普通类是一个完善的功能类,可以直接实例化...拥有抽象方法的类就是抽象类抽象类可以直接实例化对象,无法进行实例化操作:因为抽象类里有抽象方法,但抽象方法又没有方法体,无法调用,无法调...
  • 子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。 3 .如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个...
  • 简单理解Java的抽象类

    2020-09-03 07:44:46
    主要介绍了Java的抽象类,是Java入门学习中的基础知识,需要的朋友可以参考下
  • 抽象类中是否可以有静态的main方法? 上面这个题目我们来慢慢的剖析一下。先从基本的概念说起。 一、接口 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,...
  • Java中的抽象类

    2021-04-17 03:20:38
    从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。作用:限制规定子类必须实现某些方法,但不关注细节。使用规则:absabstract定义抽象类absabstract定义抽象类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,719
精华内容 93,087
关键字:

抽象类可以作为子类吗