万金流
初次使用博客园,目前感觉还不错。 不知不觉用了4年零4个月了,越来越喜欢博客园。

-----------------------面向对象基础------------------------------------
方法(函数)

(c#p10为主,p27;javap96)+资料,讲如下问题:
1、类概念[类、对象]

2、面向对象基本特征(封装、继承、多态)

}

3、类的主要构成(属性和方法)

4、程序中如何实现类:

类格式(类头、成员变量、成员方法,实例化)

例:Person类(姓名,年龄,show_Me)(+set_Me)(+不同文件)
Person类内存分配
例5-1 学生类(仅java)
(c#提一下public)

小练习:写一个学生类【属性:学号、姓名、专业、入学成绩;方法:修改专业(入学成绩低于300分不允许修改)】,并在主程序中调用它。

类对象作为方法的形参

例:人摸动物

{

c#代码:

 1 class 动物
 2     {
 3         public string 名字;
 4         public string 叫声;
 5         public void 叫()
 6         {
 7             Console.WriteLine("凶恶的" + 名字 + "在咆哮:" + 叫声 + "~~~~~~~~");
 8         }
 9     }
10     class11     {
12         public void 摸动物(动物 x)
13         {
14             x.叫();
15         }
16     }
17     class Program
18     {
19         static void Main(string[] args)
20         {
21             人 张三=new 人();
22             动物 狗, 机器猫;
23             狗 = new 动物();
24             机器猫 = new 动物();
25             狗.名字 = "旺财";
26             狗.叫声 = "";
27             机器猫.名字 = "小叮当";
28             机器猫.叫声 = "";
29             张三.摸动物(狗);
30             张三.摸动物(机器猫);
31             Console.ReadKey();
32         }
33     }

}

当类作为方法的形参和返回值时,可以带入/带出多个不同类型的值。注意:它是引用类型。


战斗程序

//java(源代码

//c# 猫狗互咬代码(战斗程序源代码

变量作用域(c#略,见p76)

P103直接讲例5-2(仅java)
重载
例:两、三个数最大值
p128,例5-14(仅java,多个数的和)
构造方法
介绍构造方法的意义,构造Person
P108例5-6,知识点:构造重载(长方体,设各边长,算体积)
掷色子程序(仅C#)
静态
{ //仅java
静态方法:P112例5-7

静态属性:提一下
看p111-112页,1,2

注:java里静态内容实际上可以被对象访问,但这不是通用写法,其他语言并不允许。应尽量使用类来访问静态内容。


//C#
静态属性+静态方法

例:

class Person
    {
        public static int rk = 50;
        public static void war()
        {
            rk--;
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Person a = new Person();
            /*作为静态属性和方法,人口和战争属于全人类,无法被某个人访问。
             * 以下两行代码错误
            a.rk = 30;
            a.war();
            */
            Person.rk--;
            Person.war();
            Console.WriteLine(Person.rk);
            Console.ReadKey();
        }
    }

---------------面向对象进阶----------------------------

继承例:球继承圆的半径、面积。代码

修饰符(JAVA看看视频,17分28秒,C#P12页第三点)
this和super
P119例5-9(this),例5-10(主要讲super),例5-11(this和super综合)

子类对象是可以赋值给父类变量的(例:球对象赋值给圆变量)
{//仅java
子类与父类具有同名方法时:默认为方法重写

例:Person1继承Person类,内存初始化
简单子类重写父类方法:P129,例5-15
final修饰方法可阻止重写
子类重写父类方法:P126例5-13

{//仅C#

具有同名方法时内存中的状态:默认为屏蔽

例:Person1继承Person类,内存初始化
以圆球为例说明方法的屏蔽与重写

1、父类授权【可以(virtual),不可以(无,即屏蔽)】
2、子类是否重写【重写(override),不重写(new)】

---------------团队编程内容--------------------------
抽象类与抽象方法(必须一起用,规定了必须重写方法)

抽象类不应当直接被实例化。

一般用于开发小组内部讨论概念的时候,通常作为后续开发的标准和依据。

{//java
P124例5-12

例5-12扩展讲解:

建抽象类的时候,注意如下图设置(省得手输)

抽象类“形状”代码:

public abstract class Shape
{
	abstract void getArea();
}

  实现类“圆”代码:

public class Circle extends Shape
{
	double r;
	Circle(double x)
	{
		r=x;
	}
	void getArea()
	{
		System.out.println("圆形面积是:"+3.14*r*r);
	}
}

  实现类“矩形”代码:

public class Rectangle extends Shape
{
	double c,k;
	Rectangle(double x,double y)
	{
		c=x;
		k=y;
	}
	void getArea()
	{
		System.out.println("矩形面积是:"+c*k);
	}
}

  main代码:

public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		Circle cc=new Circle(5.6);
		Rectangle rt=new Rectangle(8, 6);
		Shape s;
		cc.getArea();
		rt.getArea();
		s=cc;
		s.getArea();
		s=rt;
		s.getArea();
	}

  对比这个例子和书上的例5-12,看看有什么不同。

  差异最大的是main函数。声明的抽象类变量可以指向任何一个它派生的具体类。道理和继承相同。由此可见抽象类的作用(可用于检验的类设计模版)

}

{//c#

对于任意一个封闭平面图形shape,都应当具有周长和面积两个方法。

在设计阶段,就有下面的抽象类:

abstract class shape
    {
        abstract public float L();
        abstract public float S();
    }

  具体实现的程序员负责实现这两个方法。

  例如编写“三角形”类的程序员,它的类继承这个抽象类,必须实现这两个方法(不实现会报错)

class Three:shape
    {
        public int a, b, c;
        public override float L()
        {
            return a + b + c;
        }
        public override float S()
        {
            float s = (a + b + c) / (float)2;
            s =(float) Math.Sqrt(s * (s - a) * (s - b) * (s - c));
            return s;
        }
    }

主程序中,可以用抽象类表示一切由他派生的平面封闭图形:

static void Main(string[] args)
        {
            shape a = new Three() { a = 3, b = 4, c = 5 };
            Console.WriteLine($"该图形周长为:{a.L()},面积为:{a.S()}");
        }

运行效果:

 

 

}
接口(一般用于项目总体设计时,跨开发小组统一开发标准):

  1. 一般仅用于描述要实现的动作(C#中无字段,可有属性、方法声明,不允许实现,无访问修饰符。属性方法需要具体实现。),以小项目松散耦合为目的,可多继承。
  2. 应尽量避免使用中的接口污染,即接口功能应尽量单一(比如规划“通话”接口时想着手机,规定必须有接打电话和收发短信的功能,这就让写“对讲机”的程序员很难受)。
  3. 用法与抽象类类似(都是相当于模版的东西),注意体会概念和使用场合的区别。

例:龟车赛跑


c#中一些跟类有关的运算符(多用于可空变量,冒号不是)

is 运算符:检查表达式的运行时类型是否与给定类型兼容

as 运算符:将表达式显式转换为给定类型(如果其运行时类型与该类型兼容)

??:null合并运算符。如果左操作数的值不为 null,则返回该值;否则,它会计算右操作数并返回其结果。

??=: 如果左操作数的值为 null,则赋值;否则,不赋值,也不计算右操作数。

?.:null条件运算符。如果左侧类不为空,则调用其方法。

例:

动物类:

class 动物
    {
        public string 叫声 { get; set; } = "嗷~~~~~~";
        public void 叫()
        {
            Console.WriteLine(叫声);
        }
    }

猫类:

class 猫:动物
    {
        public void 睡觉()
        {
            Console.WriteLine("猫在睡觉,呼噜噜~~~");
        }
    }

狗类:

class 狗:动物
    {
        public void 作死()
        {
            Console.WriteLine("狗在作死,哈吃哈赤~");
        }
    }

主程序:

 1 static void Main(string[] args)
 2         {
 3             动物 猫1 = new 猫();
 4             动物 狗1 = new 狗();
 5             if(猫1 is 猫 t01)
 6             {
 7                 Console.WriteLine("1");
 8                 t01.睡觉();
 9             }
10             if(狗1 is 猫 t02)//t02不会被赋值
11             {
12                 Console.WriteLine("2");
13                 t02.叫();
14             }
15             else
16             {
17                 Console.WriteLine("2");
18                 Console.WriteLine("狗1不是猫");
19             }
20             var t1 = 猫1 as 猫;
21             var t2 = 狗1 as 猫;//t2为猫类型,值为null
22             Console.WriteLine("3");
23             t1?.睡觉();
24             Console.WriteLine("4");
25             t2?.睡觉();
26             Console.WriteLine("5");
27             (t2??new 猫()).睡觉();
28         }

运行结果如下,自行体会:

 

posted on 2019-06-10 22:55  万金流  阅读(829)  评论(0编辑  收藏  举报