Java基础——面向对象(封装——继承——多态 )
对象
对象:
是类的实例(实现世界中 真 实存在的一切事物 可以称为对象)
类:
类是对象的抽象描述
步骤:
1、定义一个类 (用于 描述人:)
( * 人:有特征和行为)
2、根据类 创建对象 ---- new
* 对象类型 对象名 = new 对象类型();
* 一般情况下 只有对象 才能点出 属性和方法
面向对象的的三个特征:封装 继承 多态
封装:将类的属性私有化,提供公共的get/set访问方法
例
//对属性的封装
private String name;
private int age;
// 成员方法
// getXxx()/setXxx()
//对该对象对外界提供方法的封装
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
注:get和set是成对出现的
封装的作用
① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
继承:用新类(子类、派生类)继承已有类(父类 超类 基类), 新类可以直接使用已有类的公有的方法和属性
作用:提交代码复用率 减少不必要的代码
关键字:extends
继承只能单一继承(父类可以有很多的子类 但是子类只能有一个直属父类)
子类重写父类的方法后 会优先调用子类自己方法
继承主要实现重用代码,节省开发时间。
1、C#中的继承符合下列规则:
- 继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。
- 派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
- 构造函数和析构函数不能被继承。除此之外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
- 派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
- 类可以定义虚文法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。
2、new关键字
如果父类中声明了一个没有friend修饰的protected或public方法,子类中也声明了同名的方法。则用new可以隐藏父类中的方法。(不建议使用)
3、base关键字
base 关键字用于从派生类中访问基类的成员:
- 调用基类上已被其他方法重写的方法。
- 指定创建派生类实例时应调用的基类构造函数。
例
class Person { public Person() { } } class Man extends Person { public Man() { } }
类Man继承于Person类,这样一来的话,Person类称为父类(基类),Man类称为子类
- 继承只能单一继承(父类可以有很多的子类 但是子类只能有一个直属父类)
- 子类重写父类的方法后 会优先调用子类自己方法
- 如果两个类存在继承关系,则子类会自动继承父类的方法和变量,在子类中可以调用父类的方法和变量
附:
{}:代码块
{}定义在方法中:普通代码块
{}定义在类中:构造块
{}定义在类中并且被static所修饰:静态代码块
访问修饰符:4个
public:整个工程都可以访问
Producted:同一个包下 或者 异包下的子类
默认(什么都不写):同一个包下
Private:当前类
多态:同一种实例多种形态
多态出现的的条件:在继承关系中
- 继承关系中方法的重写,同一个类下方法的重载
- 父类的引用指向子类的实体(继承关系中发生向上转型,向下转型)
多态:父类型的引用可以指向子类型的实体(对象)
//向上转型,将子类型转换为父类型
Person person=new Student();//当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
//向下转型,将父类型转换为子类型
Student stu =new (Student)Person;//如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换