05面向对象基础

总结一下这两天的学习笔记,正所谓温故而知新嘛,希望能够更好的学习后面的新知识

1、面向对象概念
面向对象三大特征:封装、继承、多态

2、类对象是引用传递
把一个对象传递到方法中,传递的也是这个对象本身的引用,修改这个对象会影响外面的对象

3、null
表示变量没有指向任何对象
值类型(ValueType):数值类型(int、long、double等)、boolean等基本类型,枚举、结构体的值是复制传递,不能为null;
String不是值类型

4、局部变量和成员变量
(1)局部变量必须初始化,成员变量声明时已经默认初始化了(基本数值类型初始化值为0;布尔类型默认初始化值为false;string类型初始化值为null)
(2)当成员变量和局部变量(函数参数也可以看做局部变量)重名的时候,成员变量被看做局部变量,为避免混乱,访问成员变量时加上"this.","this"表示当前对象;

5、public和private

class test
{
    public int age;//被public修饰,这个成员变量可以被外部和这个类自己访问
    private string name;//被private修饰,这个成员变量只能被这个类内部访问

    //可以声明一个setName方法来提供给外界 外部通过这个方法操作给内部的私有变量name赋值
    public void setName(int name)
    {
        this.name=name;
    }
}

可以把成员变量声明为public,也可以声明为private,成员变量声明为private 就只能在类的内部调用private成员

public成员可以被类内部或者外界访问,private成员只能被内部访问,这样可以保护不希望外界调用的内部成员,包含(字段(Field)变量、方法)不被外界访问

字段(Field)/成员变量(Member Variable)一般声明为private。通过get/set方法进行取值/赋值;

6、属性
为避免外界给成员变量随便赋值,必须把成员变量声明为private,然后提供get/set方法,写起来、调用起来都麻烦,C#提供属性的一个语法
属性的声明
给一个私有成员变量声明属性给外界读取写入

private int age;//声明一个私有变量,外界不能访问
public int Age
{
    get
    {
        return this.age;//外界通过Age的返回值拿到age变量的值,
    }
    set
    {
        //value就是外界传入的值,属性赋值时调用set方法把外界的值赋值给本类的私有变量age
        this.age=value;
    }
}

属性的简化,如果是简单的get/set逻辑,可以有更简单的写法:

public int Age
{
    get;
    set;
}

get、set可以单独声明为private、protected,这样就可以设置不同的访问级别了

如果属性只有get或者set方法就是只读或者只写属性。只读只写都不能简写。

7、构造函数入门
(1)构造函数是创建类对象,并且在创建完成前对类进行初始化的特殊函数。如果定义的类是没有声明构造函数,则编译器编译时会默认给出一个无参构造函数,如果定义了任意一个有参构造函数,则不会提供默认无参的构造函数。

(2)构造函数的格式及特点:
方法名必须和类名一致
没有返回值类型
构造函数可以重载

下面是代码示例:

 1     class Person
 2     {
 3         //无参的构造方法,
 4         //如果自己重新写了一个构造函数,默认无参的构造函数会被干掉,要用的话需要自己写一个
 5         public Person()//没有返回值,方法名和类名一致
 6         {
 7         }
 8
 9         public Person(int age)//只有一个参数的有参构造函数
10         {
11             //this.age = age;
12             Age = age;
13         }
14
15         public Person(int age, string name)//有两个参数的构造函数
16         {
17             //this.age = age;
18             Age = age;
19             //this.name = name;
20             Name = name;
21         }
22
23         private int age;
24
25         public int Age
26         {
27             get { return age; }
28             set { age = value; }
29         }
30         private string name;
31
32         public string Name
33         {
34             get { return name; }
35             set { name = value; }
36         }
37         public void SayHello()
38         {
39             Console.WriteLine("name="+name+";age="+age);
40         }
41     }
42
43     //调用
44     static void Main(string[] args)
45         {
46             Person p1 = new Person();//new对象时调用无参构造方法
47             p1.SayHello();
48
49             Person p2 = new Person(19);//调用只有int类型参数的构造方法
50             p2.SayHello();
51
52             Person p3 = new Person(30, "张三");//调用有int类型参数和string类型的构造方法
53             p3.SayHello();
54
55             Console.ReadKey();
56         }

8、static介绍
(1)一些场景下会要求一个类的多个实例共享一个成员;有时候想定义一些不和具体对象关联、不需要new就调用的方法;
举例:Console类的WriteLine;MessageBox的Show
(2)static方法不需要new就可以直接通过类名调用;
(3)static变量是共享的内存空间,非static变量则是对象隔离的;
(4)static方法中无法使用this关键字,因为static独立于对象存在,不是任何人的唯一;
(5)static成员只能访问static成员,不能接访问非static成员。非static成员可以访问static成员。

9、命名空间
可以用文件系统的文件重名和文件夹来解释命名空间的问题

命名空间语法:namespace 命名空间名称

当前命名空间中的类无需引用;使用using引用其它包中的类;

还可以通过“命名空间+类名”的方式使用“System.Data.SqlClient.SqlConnection” ,不用using,适用于同时使用多个重名的类,比uising时候的别名好;

10、继承(inherit)

C#中一个类可以“继承”自其它类,如果A继承B,则A叫做B的子类,B叫做A的父类(基类)。子类会从父类继承所有非private成员。子类还可以有子类;

C#中一个类只能有一个父类,如果没有指定父类,则System.Object为父类

子类的构造方法默认都去访问父类的无参构造方法;在子类的构造方法后都有一行默认语句base()

class Fu
{
    public Fu()
    {
        Console.WriteLine("FU");
    }
}
class Zi:Fu
{
    public Zi():base()//不管是否显式调用base(),new 子类对象时控制台都会输出fu
    {
        Console.WriteLine("zi");
    }
}

//new子类对象时,先去执行父类的构造函数把父类初始化完成,再去初始化子类的。
Zi z = new Zi();

可以通过 base(参数) 去访问父类中的有参构造函数。见下面代码:

class Fu
{
    public Fu(int a)//父类定义了一个有参的构造函数,则没有无参的构造函数
    {
        Console.WriteLine("FU"+a);
    }
}
class Zi:Fu
{
    public Zi():base(0)//如果父类没有无参的构造函数,则需要显示调用父类的其它的有参构造函数
    {
        Console.WriteLine("ZI");
    }
    public Zi(int a):base(a)
    {
        Console.WriteLine("ZI"+a);
    }
}

定义了一个有参的构造函数,则没有无参的构造函数,父类没有无参的构造函数,则需要显示调用父类的其它的有参构造函数

11、private、public和protected的区别
public成员可以被所有类访问

private成员无法被子类和外部类访问,子类只能通过父类的public方法“间接”访问父类的private成员。这样保证了父类private成员的安全性。
protected成员只能被自己以及自己的子类(直接或者间接)访问,无法被“外姓人”访问。

12、多态
面向对象三大特征:封装、继承、多态。多态是面向对象最强大的一个特征,也是最难的一个特征,设计模式等都是多态的表现
子类中定义和父类中一样的方法就叫“重写(override)或覆盖”,父类中可以被override的方法要声明为virtual。

override修饰符

    class DiQiuRen
    {
        //public void SayHello()
        public virtual void SayHello()//父类中希望子类可以 override的方法标注virtual
        {
            Console.WriteLine("我是地球人");
        }
    }
    class ZhongGuoRen : DiQiuRen
    {
        //public void SayHello()
        public override void SayHello()//子类中override父类中的同样的方法必须标注override
        {
            Console.WriteLine("我是中国人");
        }
    }

调用:

//调用
static void Main(string[] args)
{
    ZhongGuoRen zgr1 = new ZhongGuoRen();
    zgr1.SayHello();//中国人子类override父类的方法,所以调用的是ZhongGuoRen的SayHello方法

    //可以用父类的变量指向子类的对象
    DiQiuRen dqr1 = new ZhongGuoRen();
    dqr1.SayHello();//调用的方法实现还是对象的实现,而不是变量的实现,调用的还是new出来的对象的方法
    //dqr1.BaiNian();不管实际指向的是什么类型的对象,能够调用什么方法取决于变量的类型
}

父类变量可以指向子类对象,内存中也还是子类对象,有且只有这一个对象  变量是什么类型没关系,到底执行谁的方法主要取决于内存中的对象是什么类型的

抽象类

抽象类的抽象方法主要用来限制子类“必须实现这些抽象方法”;子类也可以不实现,那么子类也要是抽象类,由子类的子类...去实现。试想一下:如果子类继承了抽象类而你没有实现抽象方法,万一你调用了抽象方法怎么办?我这个抽象方法没有具体的实现,你叫我怎么调用?

抽象方法
抽象方法没有方法体;一旦类中定义了抽象方法,类必须被修饰为抽象;抽象类无法实例化(new);

13、接口

语法:

public interface ISpeakable
{
    void speak();//不提供体具体实现连{}都不用
}

(1)接口是一种用声明"能力"的类型,不提供具体实现
(2)不提供实现方法,连{}都不能有
(3)接口无法实例化,只能被类“实现”

public class TeacherCang:ISpeakable//继承接口
{
    public void speak()//实现接口的方法
    {
        Console.WriteLine("yamadie");
    }
}

(4)既可以使用接口类型变量又可以使用类类型变量调用speak
(5)接口的意义是定义“做什么”,类定义“怎么做”
(6)接口中不能声明变量(字段)一个没有实现代码的接口声明变量没有意义
(7)接口可以定义多个方法,也可以不定义任何方法(* 标识接口)
(8)接口是“能力”不是实现,因此也不能定义构造函数(没这个必要)
(9)类只有一个父类,类可以实现多个接口

时间: 2024-10-05 22:10:16

05面向对象基础的相关文章

java基础学习05(面向对象基础01--类实例分析)

面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过setter和getter设置和取得4.如果需要可以加入若干构造方法 5.再根据其它要求添加相应的方法6.类中的所有方法都不要直接输出,而是交给被调用处调用 Demo 定义并测试一个名为Student的类,包括属性有"学号"."姓名"以及3门课程"数学".

java基础学习05(面向对象基础02)

面向对象基础02 实现的目标 1.String类的使用 2.掌握this关键字的使用3.掌握static关键字的使用 String类 实例化String对象一个字符串就是一个String类的匿名对象,就是已经开辟了堆内存空间的并可以直接使用的对象.1.采用直接赋值的方式进行操作. String name = "zhangsan"; 使用这种方式,如果一个字符串已经被一个名称所引用,则以后再有相同的字符串声明时,就不会再开辟内存空间.2.直接调用String类的构造方法(public S

[Java 05 OO] (基础篇) 《Java开发实战经典》

p5OO 第五章 面向对象 (基础篇) Notes (1), Constructor / this / String   String str1 = "hello"; 解释 : 是把一个在堆内存空间的使用权给了 str1 对象.   String str2 = "hello"; str1 == str2 是 true   String 字符串的内容不可改变 (2), Java 常用的内存区域    1), 栈内存空间    2), 堆内存空间    3), 全局数据

3.2面向对象基础语法

面向对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的,我们之前学习的 变量.数据.函数 都是对象 在 Python 中可以使用以下两个方法验证: 在 标识符 / 数据 后输入一个 .,然后按下 TAB 键,iPython 会提示该对象能够调用的 方法列表 使用内置函数 dir 传入 标识符 / 数据,可以查看对象内的 所有属性及方法 提示 __方法名

C#面向对象基础(一)

面向对象这个词我很早就知道了,但具体是什么东西?什么是面向对象?一直以来都 不理解,只知道它有三大特征,即封装-继承-多态.直到学习完C#视频和看完设计模式 中面向对象基础后,对C#面向对象才有了一个大致的理解.下面这幅图是我对它的一个 宏观的认识. 一.基本知识 1.类成员 属性 C#不直接访问类的数据,通过get和set访问类中字段 方法 表示类的行为.方法可以构造,也可以重载 2.封装 每个对象都包含它能进行操作所需要的所有信息,这种特性就是封装 3.继承 如果两个对象A和B,可以描述为B

Python学习系列(八)( 面向对象基础)

 Python学习系列(八)( 面向对象基础) Python学习系列(七)( 数据库编程) 一,面向对象 1,域:属于一个对象或类的变量.有两种类型,即实例变量—属于每个实例/类的对象:类变量—属于类本身. 2,类的方法:对象也可以使用属于类的函数来具有功能,这样的函数称之为类的方法.域和方法合称为类的属性.类使用class关键字创建,类的属性被列在一个缩进块中. 3,self:类的方法与普通的函数只有一个特别的区别----他们必须有一个额外的第一个参数名称,但是在调用的时候不能为其赋值,Pyt

软件工程——理论、方法与实践 之 面向对象基础

软件工程——理论.方法与实践 之 面向对象基础 面向对象技术是软件工程领域中的重要技术,这种技术比较自然的模拟了人类认识客观世界的方式,是当前计算机软件工程学中的主流方法.面向对象方法认为:客观世界是由对象组成的,任何客观的事物或实体都是对象,复杂的对象可以由简单的对象组成:具有相同数据和相同操作的对象可以归并为一个类,对象是对象类的一个实例:类可以派生出子类,子类继承父类的全部特性(数据和操作),又可以有自己的新特征,子类与父类形成类的层次结构:对象之间通过消息传递相互联系:类具有封装性,其数

附录A培训实习生-面向对象基础(2):构造方法和带参数的构造方法

构造方法,又叫构造函数,其实就是对类进行实例化.构造方法与类同名,无返回值,也不需要void,在new时候调用.也就是说,就是调用构造方法的时候. 所有类都有构造方法,如果你不编码则系统默认生成空的的构造方法,如你有定义构造方法,那么默认的构造方法就会失效. 有参数的构造方法:比如我们希望每个小猫一诞生都有姓名,那么就应该写一个有参数的构造方法. 这是一个有参数的构造方法,可以看下: 1 using System; 2 using System.Collections.Generic; 3 us

【Java面向对象基础(三)】面向对象思想

[喵"的Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinking in Java中提到“Everything is an object”,即万物皆对象.这里的“对象”指的是任何实体或者任何可以当作实体看待的“虚幻的事物”.比如现实中的人(男人.女人.老人.小孩而...).动物(大象.狮子.猴子...).桌子.凳子.汽车.ATM机等等,也可以使看不见摸不着的空气(氧气.二氧化碳.氮气