子类对父类中的属性和字段的改写

子类对父类中的属性和字段的改写

刚开始听老师讲,字段要用private来修饰,属性用public来修饰,通过属性来控制字段,字段存储数据。

那为什么要用private来修饰字段呢???

原因:防止外部人员通过子类来改写父类中的属性以及字段,从而破坏了项目的初衷,造成严重的后果。

例子:

父类及成员:

class Bea
    {
        public Bea(int age,string name)
        {
            this.Name = name;
            this.Age = age;
        }
        public int _age;
        //对年龄属性的改写
        public virtual int Age
        {
            get { return _age; }
            set
            {
                if (value >= 15 && value <= 20)
                {
                    _age = value;
                }
                else
                {
                    _age = 0;
                }
            }
        }
        public string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

子类及成员:

 1 class Green:Bea
 2     {
 3         public Green(string a,int b):base(b,a)
 4         {
 5         }
 6         //对父类中的Age属性的改写
 7         public override int Age
 8         {
 9             get { return _age; }
10             set
11             {
12                 if (value >= 18 && value <= 400)
13                 {
14                     _age = value;
15                 }
16                 else
17                 {
18                     _age = 0;
19                 }
20             }
21         }
22     }

接下来在main方法中输出父类中的成员Age

1 class Program
2     {
3         static void Main(string[] args)
4         {
5             Bea father = new Green("danger",300);//将子类对象赋值给父类
6             Console.WriteLine(father.Age);
7             Console.ReadKey();
8         }
9     }

结果:300

原因: 实例father对象的时候,首先会调用父类的构造函数,当给父类中的属性Age赋值时,由于子类对父类中该属性重写,因此程序会跳过给父类中的属性Age赋值

,转而直接跳到子类中对属性的改写里面,这就解释了,结果是300而不是0.

结论:在正常的项目中,我们会对字段做保护处理(private),防止外部人员通过子类来改写父类中的成员,造成严重后果。

原文地址:https://www.cnblogs.com/sjitLearn/p/8994731.html

时间: 2024-11-08 19:39:30

子类对父类中的属性和字段的改写的相关文章

java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数

一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构 Cat继承Animal Runner里包含main函数,程序入口 Sing类主要用来打印执行顺序的序列号 二.代码 public class Animal { Sing s1=new Sing(1,"animal\tnot static field"); static Sing s2=new Sing(2,&q

子类中的属性跟父类中的属性重名的时候,会优先使用子类中的属性

package charter05; public class Animal { int age = 8; //如果父类中显示的声明了有参的构造方法, //而子类中没有显示的声明有参构造方法,此时编译会报错 public Animal(int age) {// super(); this.age = age; } } //-------子类--------------- package charter05; public class Dog { int age = 20; } //-------

子类继承父类的私有属性

最近学习继承,从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法

Java中的属性和字段有什么区别

1.Java中的属性和字段有什么区别? 答: Java中的属性,通常可以理解为get和set方法. 字段,通常叫做“类成员”. 属性只局限于类中方法的声明,并不与类中其他成员相关.例如: void setA(String s){} String getA(){} 当一个类中拥有这样一对方法时,我们可以说,这个类中拥有一个可读写的 a 属性(注意是小写a).如果去掉了set的方法,则是可读属性,反之亦然. 类成员(字段),通常是在类中定义的类成员变量,例如: public class A{ pri

关于子类和父类具有相同属性的问题

如果父类中有delegate属性,并且子类中也具有同名的属性,那么会报一下警告??.解决办法:在.m文件中添加:@dynamic delegate;具体请搜索动态绑定.如下图: // Auto property synthesis will not synthesize property 'delegate'; it will be implemented by sit superclass,use @dynamic to acknowledge intention

java中子类与父类中隐含的this引用的分析

/* 看一下下面的程序,看是否你的答案和运行的答案是否一致! */ class Parent{ public int x; public Parent p; public Parent(){} public Parent(int x){ this.x=x; p=this; } public void f(){ System.out.println("Parent::f()"); } public void g(){ System.out.println("Parent::g(

C#中的属性和字段

属性和字段的区别 在C#中,我们可以自由的访问公有字段,但在一些场合中,我们可能希望限制字段的赋值范围.或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些字段值,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作. get和set 有两个类person: public class person { public string name; } public class person { public st

C#类中的属性和字段

字段就是类中自定义的一些变量或是常量,用来记录此类的相关信息和属性,通常和外部定义没什么区别,就是需要添加public等修饰符: 属性也是是类中的概念之一,就是外部访问内部私有(private)字段的一个函数方法, 一般分为自定义属性: 使用get,set访问器自定义对字段赋值 默认定义, 只声明get和set不具体指定,则会默认生成属性字段. 注意只读和只写属性可以通过只定义get和set中的一个来实现: 属性也可以设置值来限制对字段的访问,例如在set中可以添加判断,get返回中可以返回其他

Java基础-重写-子类重写父类中的方法后执行情况

代码 public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.out.println(shape.name); shape.printType(); shape.printName(); } } class Shape { public String name = "shape"; public Shape(){ System.out.println(