zoukankan      html  css  js  c++  java
  • java抽象类怎么实例化了及C++中抽象类的构造函数

    Q:程序中A句实例化了抽象类OutputStream 怎么回事?抽象类不是不能实例化的么?

      import java.net.*;
      import java.io.*;
      public class TCPClient {
      public static void main(String[] args) throws Exception {
      Socket s = new Socket("222.91.106.117", 6666);
      OutputStream os = s.getOutputStream();  // A
      DataOutputStream dos = new DataOutputStream(os);
      dos.writeUTF("LJ be bravery!");
      dos.flush();
      dos.close();
      s.close();
     }
    }

    A:A句并没有实例化了抽象类OutputStream 
    OutputStream os 只是声名一个类型为OutputStream 变量
    s.getOutputStream(); 是获取一个抽象类OutputStream 的实例对象
    基础最重要  好好看一下基础

    Q:String urlStr = "http://dict.baidu.com/";
          URL url = new URL(urlStr);
      
          URLConnection con = url.openConnection();
          int contentLength = con.getContentLength();

          URLConnection在API中定义为public abstract class URLConnectionextends Object

    A:URLConnection为抽象类表示本身不能被实例化,即:URLConnection uc= new URLConnection();这就是一种错误的写法,但是URLConnection有两个子类:HttpURLConnection和JarURLConnection , url.openConnection()方法返回肯定就是这两个子类中的一个,这是java多态性的一种体现,想必楼主应该可以相通了吧!

    Q:抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。这是API上写的  为什么说此类的实例?

    A:java的多态性就是体现在用一个父类声明,可以实例化其子类对象!我举个例子:譬如:
    abstract class Person{....}   class Student extends Person{...},表明这个Student类继承了抽象类Person,我们在程序中可以这么声明:Person p = new Student();这里就是用父类声明,实例化其子类对象,这个Student对象也能说成是抽象类Person的实例。不知道这么说你可理解了!

    抽象类的构造函数

    1、抽象类是可以有构造函数的。但很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数(FxCop.设计规则)。但不应该有“公共”的构造函数,和不应该有构造函数,这是两个不同的概念,所以,FxCop.设计规则中也说,如果抽象类需要构造函数,那么应该声明为“protected”。

    2、既然抽象类是可以,甚至有时候应该有构造函数,那抽象类的构造函数的作用是什么?我觉得至少有两个:

    (1)初始化抽象类的成员;

    (2)为继承自它的子类使用。

    比如以下例子:

    public abstract class Component
    {
            protected string name;
    
            public Component(string name)
            {
                this.name = name;
            }
    
            public abstract void Add(Component component);
            public abstract void Remove(Component component);    
    }
    
    public class Composite : Component
    {
           private List<Component> children = new List<Component>();
    
            public Composite(string name)
                : base(name)
            { }
                   
            public override void Add(Component component)
            {
                this.children.Add(component);
            }
    
            public override void Remove(Component component)
            {
                this.Remove(component);
            }        
    }

    3、即使我们声明一个没有构造函数的抽象类,编译器还会为我们生成一个默认的保护级别的构造函数。子类实例化时(不管是否为带参构造)只会调用所有父类的无参构造函数,而带参构造必须通过显式去调用.调用顺序是先调用抽象类的无参构造函数,如果子类实例化时是使用带餐的构造函数,则再接着调用抽象类的带参构造函数,最后调用子类本身的构造函数。

  • 相关阅读:
    Leetcode 1. Two Sum (Python)
    视觉机器学习------KNN学习
    anaconda新建虚拟环境安装各个依赖包
    Matconvnet安装
    argparse模块
    Matconvnet笔记(一)
    Ubuntu14.04下如何安装TensorFlow
    springboot2+freemarker简单使用
    mongodb安装4.0(rpm)
    检测web界面不能访问后重启
  • 原文地址:https://www.cnblogs.com/renyuan/p/3060941.html
Copyright © 2011-2022 走看看