精华内容
下载资源
问答
  • 1.在子类父类中有相同参数,子类继承分类后如何进行调用,判断创建的对象属性哪个类(instanceof) 2.子类继承父类时,怎么调用父类构造函数,以及如何访问到父类的私有属性,子类是否能够继承父类的私有属性 3.根父类...

    导航
    1.在子类父类中有相同参数,子类继承分类后如何进行调用,判断创建的对象属性哪个类(instanceof)
    2.子类继承父类时,怎么调用父类构造函数,以及如何访问到父类的私有属性,子类是否能够继承父类的私有属性
    3.根父类:Object类

    ————————————————————————————————————————

    1.在子类父类中有相同参数,子类继承分类后如何进行调用

    package cn.campsg.java.experiment;
    
    public class Student {
    	public static class clsSuper{
    		public int m_a = 5;
    	}
    	public static class clsSub extends clsSuper{
    		public int m_a = 6;
    	}
    	public static void main(String[] args){
    		clsSuper o1 = new clsSuper();
    		System.out.println(o1.m_a);  //这里是访问父类的m_a
    		
    		clsSuper o2 = new clsSub();
    		System.out.println(o2.m_a);  //这里也是访问的父类m_a
    		
    		if(o2 instanceof clsSub){   //进行判断是否是clsSub类
    			System.out.println("o2是clsSub类型");
    		}
    		else
    			System.out.println("no");
    		
    		clsSub o3 = new clsSub();
    		System.out.println(o3.m_a);  //这里访问的子类m_a		
    	}
    	
    }
    

    运行结果
    在这里插入图片描述

    ————————————————————————————————————————

    2.子类继承父类时,怎么调用父类构造函数,以及如何访问到父类的私有属性,子类是否能够继承父类的私有属性

    回答:使用super()来调用父类的构造函数。子类继承父类时,是不能继承父类的私有属性的,只能通过从父类继承到的公共方法来得到私有属性

    看下面例子
    这里步骤是创建子类对象,并且通过调用子类的构造函数,也给父类进行构造函数调用,并且输出子类以及父类中的属性
    其中父类的属性由本身的公共方法进行输出或者在子类中使用super.的形式来输出父类中的私有属性

    package cn.campsg.java.experiment;
    
    public class Student {
    	public static class clsSuper{
    		private int m_a=20;
    		public clsSuper(){   //缺省构造函数
    		}
    		public clsSuper(int a){  //有参构造函数
    			m_a = a;
    		}
    		public void get(){     //得到父类的私有属性
    			System.out.println("a="+m_a);
    		}
    	}
    	public static class clsSub extends clsSuper{
    		private int m_b=30;
    		public clsSub(int b,int a){
    			super(a);   //调用父类的构造函数
    			m_b = b;
    		}
    		public clsSub(int b){
    			m_b = b;
    		}
    		
    		public void get1(){   //子类本身也可以使用父类的私有属性
    		System.out.println("a="+super.m_a);  //也可以使用super.的形式访问到父类的私有属性
    		}
    	}
    	public static void main(String[] args){
    		clsSub o1 = new clsSub(20,40);
    		o1.get1();                          //输出父类中的m_a
    		System.out.println("b="+o1.m_b); //输出子类中的m_b
    	}
    	
    }
    

    运行结果
    在这里插入图片描述

    注意:super可以用来区分子类还是父类同名的属性,也可以进行父类构造函数使用
    super在构造器中必须要在第一行,在子类其他作用域时可以在任意行

    ————————————————————————————————————————

    3.根父类:Object类

    3.1认识object类

    使用object中的toString()使用下

    package cn.campsg.java.experiment;
    
    public class Student {
    	public static class clsSuper{
    		public void show(){
    			
    		}
    	}
    	public static void main(String[] args){
    		clsSuper s = new clsSuper();
    		System.out.println(s.toString());
    	}
    }
    

    打印
    在这里插入图片描述

    提供的一组方法
    在这里插入图片描述


    3.2 equals方法使用与继承

    在这里插入图片描述

    package cn.campsg.java.experiment;
    
    public class Student {
    	public static class clsSuper{
    		private int m_score=20;
    		public boolean equals(Object obj){
    			if(obj instanceof clsSuper){
    				clsSuper o = (clsSuper)obj;
    				if(o.m_score == this.m_score){
    					return true;
    				}
    				else{
    					return false;
    				}
    			}
    			else{
    				return false;
    			}
    		}
    	}
    	public static void main(String[] args){
    		clsSuper s = new clsSuper();
    		clsSuper s1 = new clsSuper();
    		System.out.println(s.equals(s1));
    	}
    }
    

    运行:true

    展开全文
  • -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {  self = [super initWithNibName:...子类视图控制器加上上面这一段,通过该初始化方法,子类就可以继承父类的样式了

    -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    {

        self = [super initWithNibName:NSStringFromClass([self.superclass class]) bundle:nibBundleOrNil];

        return self;

    }

    子类视图控制器加上上面这一段,通过该初始化方法,子类就可以继承父类的样式了

    展开全文
  • 如果您需要继承TextWriter实现自己的类型,您会怎么做?继承TextWriter不难,不过接下来,您打算覆盖(override)掉哪些方法?今天我就遇到了这样的问题。还是先来看看TextWriter的成员吧: [Serializable] ...

    如果您需要继承TextWriter实现自己的类型,您会怎么做?继承TextWriter不难,不过接下来,您打算覆盖(override)掉哪些方法?今天我就遇到了这样的问题。还是先来看看TextWriter的成员吧:

    [Serializable]
    [ComVisible(true)]
    public abstract class TextWriter : MarshalByRefObject, IDisposable
    {
        protected char[] CoreNewLine;
        public static readonly TextWriter Null;
    
        protected TextWriter();
        protected TextWriter(IFormatProvider formatProvider);
    
        public abstract Encoding Encoding { get; }
        public virtual IFormatProvider FormatProvider { get; }
        public virtual string NewLine { get; set; }
    
        public virtual void Close();
        public void Dispose();
        protected virtual void Dispose(bool disposing);
        public virtual void Flush();
        public static TextWriter Synchronized(TextWriter writer);
        public virtual void Write(bool value);
        public virtual void Write(char value);
        public virtual void Write(char[] buffer);
        public virtual void Write(decimal value);
        public virtual void Write(double value);
        public virtual void Write(float value);
        public virtual void Write(int value);
        public virtual void Write(long value);
        public virtual void Write(object value);
        public virtual void Write(string value);
        [CLSCompliant(false)]
        public virtual void Write(uint value);
        [CLSCompliant(false)]
        public virtual void Write(ulong value);
        public virtual void Write(string format, object arg0);
        public virtual void Write(string format, params object[] arg);
        public virtual void Write(char[] buffer, int index, int count);
        public virtual void Write(string format, object arg0, object arg1);
        public virtual void Write(string format, object arg0, object arg1, object arg2);
        public virtual void WriteLine();
        public virtual void WriteLine(bool value);
        public virtual void WriteLine(char value);
        public virtual void WriteLine(char[] buffer);
        public virtual void WriteLine(decimal value);
        public virtual void WriteLine(double value);
        public virtual void WriteLine(float value);
        public virtual void WriteLine(int value);
        public virtual void WriteLine(long value);
        public virtual void WriteLine(object value);
        public virtual void WriteLine(string value);
        [CLSCompliant(false)]
        public virtual void WriteLine(uint value);
        [CLSCompliant(false)]
        public virtual void WriteLine(ulong value);
        public virtual void WriteLine(string format, object arg0);
        public virtual void WriteLine(string format, params object[] arg);
        public virtual void WriteLine(char[] buffer, int index, int count);
        public virtual void WriteLine(string format, object arg0, object arg1);
        public virtual void WriteLine(string format, object arg0, object arg1, object arg2);
    }

    看到这么多方法,每个都是virtual的,我真怕了。正如之前讨论的那样,遇到一堆一堆的virtual方法,最终确定需要从什么地方入手实在是一件极具挑战的事情。从Reflector的观察结果发现,其中所有的方法最终都会委托给这样一个空方法:

    public override void Write(char value) { }

    其他所有的方法,例如Write(string)方法,都会把需要输出的内容最终委托给Write(char)方法——例如拆成一个一个字符。这种做法的性能自然是比较差的(至少要多出很多Method Call,不是吗?),因此只覆盖Write(char)方法只能保证最终成果“可以运行”,却无法保证是最优秀的结果。但是又有谁可以告诉我,究竟该怎么做呢?

    无奈之下,最终还是借助于Refactor,想要观察一下.NET框架内置的一些TextWriter是如何实现的。最终比较之下,发现StringWriter是一个不错的参考。因为它够简单,并且拥有了其他TextWriter子类所“共有”的扩展方式。简单地说,所有的Write(WriteLine)方法最终被“归类”为以下三种形式:

    • 写入单个字符
    • 写入字符串
    • 写入一个字符数组的一部分

    表示成代码则是:

    public class MyTextWriter : TextWriter
    {
        public override void Write(char value) { ... }
    
        public override void Write(string value) { ... }
    
        public override void Write(char[] buffer, int index, int count) { ... }
    }

    例如StringWriter会将这些内容写入至内部的StringBuilder对象中。其他如StreamWriter等TextWriter的子类也几乎都是这样,看来这就是微软认为创建TextWriter的“最佳实践”了。

    值得一提的是,在TextWriter的Close和Dispose的方法都会调用GC.SuppressFinalize(this):

    public class TextWriter : MarshalByRefObject, IDisposable 
    {
        public virtual void Close()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }
    
        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }
    
        // other members
    }

    这意味着如果我们的Writer是在与非托管资源打交道的话,可以构造一个析构函数(Finalizer)由GC作最后一道防线。如果用户明确调用了Close或Dispose方法,则GC.SuppressFinalize(this)可以避免对象进入“析构队列”,这样对象便可以得到快速释放。但是,如果一个TextWriter的子类明确不会和非托管资源打交道的话,则GC.SuppressFinalize(this)也是一种无谓的浪费。因此,StringWriter同时还重写了TextWriter的Close方法:

    public class StringWriter : TextWriter
    {
        public override void Close()
        {
            this.Dispose(true);
        }
    
        // other members
    }

    当然,如果是一个“有可能”会涉及到非托管资源的TextWriter,如StreamWriter,或者是一个TextWriter的封装类,那么还是保留GC.SuppressFinalizer(this)比较妥当,毕竟进入Finalizer队列的性能开销比这GC.SuppressFinalizer的性能损耗要严重得多。

    转载于:https://my.oschina.net/abcijkxyz/blog/721388

    展开全文
  • Java子类继承父类构造器

    千次阅读 2018-05-04 11:16:26
    子类如何继承父类的构造器?2.子类与父类构造器执行顺序?二、创建父类创建父类Animal,有两个构造器class Animal{ private Integer high; public Animal() { System.out.println("Animal()"); } ...

    一、研究问题

    1.子类如何继承父类的构造器?

    2.子类与父类构造器执行顺序?

    二、创建父类

    创建父类Animal,有两个构造器

    class Animal{
        private Integer high;
    
        public Animal() {
            System.out.println("Animal()");
        }
    
        public Animal(Integer high) {
            System.out.println("Animal(Integer high)");
            this.high = high;
        }
    
    //    set、get方法
        public Integer getHigh() {
            return high;
        }
    
        public void setHigh(Integer high) {
            this.high = high;
        }
    }

    三、创建子类

    创建子类Dog,继承Animal,有四个构造器

    class Dog extends Animal{
        private String name;
    
        public Dog() {
            System.out.println("Dog()");
        }
    
        public Dog(String name) {
            this.name = name;
            System.out.println("Dog(String name)");
        }
    
        public Dog(Integer high) {
            super(high);
            System.out.println("Dog(Integer high)");
        }
    
        public Dog(Integer high, String name) {
            super(high);
            this.name = name;
            System.out.println("Dog(Integer high, String name)");
        }
    
    //    set、get方法
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    四、调用子类构造器

    public class MyMain {
        public static void main(String[] args) {
            System.out.println("- - - - - - - new Dog() - - - - - - -");
            Dog dog = new Dog();
    
            System.out.println("- - - - - - - new Dog(Integer high) - - - - - - -");
            Dog highDog = new Dog(180);
    
            System.out.println("- - - - - - - new Dog(String name) - - - - - - -");
            Dog nameDog  = new Dog("张二狗");
    
            System.out.println("- - - - - - - new Dog(Integer high, String name) - - - - - - -");
            Dog highNameDog = new Dog(180,"张二狗");
    
        }
    }

    五、输出结果

    - - - - - - - new Dog() - - - - - - -
    Animal()
    Dog()
    - - - - - - - new Dog(Integer high) - - - - - - -
    Animal(Integer high)
    Dog(Integer high)
    - - - - - - - new Dog(String name) - - - - - - -
    Animal()
    Dog(String name)
    - - - - - - - new Dog(Integer high, String name) - - - - - - -
    Animal(Integer high)
    Dog(Integer high, String name)

    六、结论

    1.子类通过super调用父类构造器

    子类通过super()调用父类无参构造器;通过super(参数)调用父类有参构造器;如果不写super,子类默认调用父

    类无参构造器

    2.子类创建对象时,父类构造器会先执行。

    因为在构造器中super必须放在第一个执行,否则会报错


    展开全文
  • 如题,我有一个类: ...请问函数内部如何实现,才能创建出一个实例? 本来我是想通过const int id = QMetaType::type()来创建,但调试发现返回得到的id总是0(QMetaType::UnknownType),所以无法创建实例。
  • 尽管Java的内置异常处理大多数常见错误,你也许...当然,它继承了Throwable提供的一些方法。因此,所有异常,包括你创建的,都可以获得Throwable定义的方法。这些方法显示在表中。 你还可以在你创建的异常类中覆盖一个
  • 当我们声明了一个带参的构造方式时,需要显示的声明一个不带参的构造方法,以便其他用到无参构造创建对象,其原因就是因为当我们没有声明构造方法时,虚拟机会自动给我们隐式的声明一个无参构造方法,当我们手动声明...
  • 今天我们来研究下javascript中如何用构造函数创建对象以及子类继承 第一步 创建一个 基类对象 car; function Car(name,id,tyep){ this.name=name;//车辆品牌 this.id=id;//车牌号 this.type=type;//车型 } ...
  • 继承能够有效的进行代码的管理,当某个类有问题只要修改这个类就行,而其继承这个类的子类往往不需要就修改 继承 程序员总是想避免多次输入同样的代码。这通过创建函数来达成这个目标,但现在要解决一个更微妙的...
  • 子类继承了父类,它该如何处理默认成员函数 我们创建下面的父类Person和子类Student讲解 class Person { public: Person(const char* name = "peter") :_name(name) { cout << "构造" << endl; } ...
  • 3:直接创建Thread的子类对象创建线程。4:调用start方法开启线程并调用线程的任务run方法执行。----------------------------------------------- package TestException; public class test1 { public st...
  • 举例说明: class A(): def __init__(self,name,age): self.name =name self.age = age ...问题:如何设置,让B类在创建实例对象时,name和age必填,score可以进行选填
  • 写于2017-08-26 16:42:54 由...实际上无论如何子类对象被创建都要调用父类的构造函数,在《java编程思想中说》,父类对象必须被创建,并被包含在子类对象内部所以在子类构造函数第一行一定会有super();至于super...
  • 创建线程继承Thread和实现Runnable接口继承Thread类在java中如何创建线程: 1、继承Thread类; 线程类:只有Thread类或者Thread类的子类 1.写个类A继承java。lang。Thread类 2.在类A中重写Thread中的run()...
  • 需求: 创建了一个泛型父类Demo。... 在使用中的时候,子类如何创建Other或Other1对象?Class typeclass = (Class)((ParameterizedType)(getClass().getGenericSuperclass())).getActualTypeArguments()[0]; Obj
  • 如何看待Java继承

    2020-05-19 15:30:28
    在类创建者实现程序得过程中,会遇到虽然这个类能满足你的需求,但是你又想为他扩充功能得时候,此时就可以使用继承来解决这个问题。比如父类是person,拥有吃饭、睡觉得功能(方法),子类是programmer。我们可以知道...
  • 子类方法调用如何实现

    千次阅读 2018-10-22 09:43:26
    类中方法分为构造方法和普通方法,对于有继承关系的类是如何调用构造方法和普通方法呢? 首先子类中调用构造方法和普通方法的实现是不一样的: [构造器]调用 初始创建对象时,要先执行父类构造方法,然后执行子类构造...
  • 如何创建Activity

    2019-04-18 16:37:47
    1)定义一个类继承自android.app.Activity或其子类 2)在res/layout目录下创建一个xml文件,用于创建一个Activity的布局 3)在app/manifests目录下的AndroidManifest.xml清单中注册Activity <?xml version=...
  • Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:  Tread thread = new Thread();  执行该线程可以调用该线程的start()方法:  thread.start();...
  • Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:Tread thread = new Thread();执行该线程可以调用该线程的start()方法:thread.start();在上面的例子...
  • Python中如何继承

    2020-01-28 17:21:45
    继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类继承又分为单继承和多继承 继承表达式:class 子类名(父类名),继承可以让子类从父类...
  • 如何创建线程

    2017-09-06 14:27:53
    可通过两种方式创建线程 1.声明一个继承了Thread类的子类,在此类中,实现Thread类的run()方法 2.声明一个实现Runnable接口的类,然后实现run()方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 959
精华内容 383
关键字:

如何创建子类继承