---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
封装:
隐藏对象的属性和实现细节,仅对外提供公共访问方式。(函数就是最小的封装体)
好处:将变化隔离,便于使用,提高重用性,提高安全性
封装:原则:把属性都隐藏,提供公共方法对其访问。将不需要的对外提示的内容隐藏起来通过修饰符来解决private
private:私有:权限修饰符:用于修饰类中的成员(成员变量、成员函数)(私有只在本类中有效)。
------将age私有化以后,类以外,即使建立了对象也不能直接访问。
------但是人应该有年龄,那么就需要在person类中提供对应的访问方式。
------规范写法 一个成员变量有2中操作:设置值或获取值。
私有仅仅是封装的一种表现形式。私有是最小的封装表现形式。
之所以对外提供访问方式,就是因为可以在访问方式中加入逻辑判断语句
对访问的数据进行操作,提高代码的健壮性。
//以下代码是封装好处的具体操作体现
class Encapsulation
{
publicstatic void main(String[] args)
{
//封装好处、原则
}
}
class Person
{
intage;
voidspeak()
{
System.out.println("age="+age);
}
}
class PersonDemo
{
publicstatic void main(String[] args)
{
Personp = new Person();
p.age= 20;
p.speak();
}
}
继承:
面向对象的继承关系:(单继承多继承理解:java中一个孩子只能有一个父亲)
class student extends Person
子类 继承 父类(超类)
继承概述(1):提高代码复用性;让类与类产生关系,有了这个关系才有了多态的特性;
注意:千万不要为了获取其他类的功能简化代码而继承。必须是类与类之间有所属关系才继承,所属关系叫 is a
继承概述(2):java只支持单继承,也也可说支持多继承(接口和接口之间)。
Java支持多层继承。也就是一个继承体系
想要使用体系,先查阅体系中父类的描述,因为父类中定义的是该体系中的共性功能。
那么在具体调用时,要创建最子类的对象?
原因:1.有可能父类不能创建对象;2.创建子类对象可以使用更多功能(基本与特有)查阅父类功能,创建子类对象使用功能
面向对象(子父类中变量的特点)
类中成员:变量
变量:如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量用this;子类要访问父类中的同名变量super。Super的使用与this几乎一致。
This是本类对象的引用;super是父类对象的引用
类中成员:函数;
覆盖:当子类出现和父类一样的函数时,当子类对象调用该函数会运行子类函数的内容,如同父类函数被覆盖
注意:子类覆盖父类必须保证子类的权限大于等于父类权限,才可以覆盖,否则编译失败。静态只能覆盖静态。
重载只看同名函数的参数列表;重写(覆盖)是子父类方法要一模一样,包括返回值类型
目前为止学习的权限(private、public、默认权限:啥也不写——私有共有之间)
类中成员:构造函数
原因:子类对象进行初始化时,父类构造函数也会运行,那是因为子类构造函数默认第一行有一条隐式的super();
Super():会访web父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
子类的实例化过程:
结论:1.子类所有构造函数都会访问父类中空参数的构造函数。(因为子类每一个构造函数第一行都有隐式的super();
2.当父类中没有空参数构造函数时,子类必须手动通过super语句的形式来要指定要访问的构造函数(当然子类的构造函数第一行也可以手动的指定this语句开访问本类中的构造函数)
3.子类中至少会有一个构造函数会访问父类中的构造函数。
//以下代码是老师用电脑上课的例子
class demo
{
publicstatic void main(String[] args)
{
Teachere = new Teacher("老师");
try
{
e.prelect();
}
catch(NoException b)
{
System.out.println("sss");
}
}
}
class Computer
{
publicstatic void run()
{
System.out.println("电脑运行");
}
publicstatic void reset()
{
System.out.println("电脑重启");
}
}
class Teacher
{
privateString name;
privateComputer compt;
Teacher(Stringname)
{
this.name= name;
compt= new Computer();
}
/*publicvoid prelect()
{
compt.run();
sop("讲课");
}*/
publicvoid prelect() throws NoException
{
try
{
compt.run();
}
catch(NoExceptionb)
{
thrownew NoException(" ???");
}
System.out.println("讲课");
}
}
class NoException extends Exception
{
NoException(Stringmsg)
{
super(msg);
}
}
接口:初期理解:可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,该类可以通过接口的形式表示
Interface; 其中interface用于定义接口,而class用于定义类
接口定义时格式的特点:1.接口中常见定义:常量、抽象方法。2.接口中的成员都有固定修饰符,常量修饰符:public static final;方法:publicabstract
总结:接口中的成员都是public的。如下图(固定写法)
类与类之间是继承关系;接口之间是继承关系(存在多继承);接口与类之间是实现关系implements
多态:某一类事物的多种存在形态
1.多态的基本体现(父类的引用指向了自己的子类对象——父类的引用也可以接受自己的子类对象);
2.多态的前提(必须是类与类之间的关系,要么继承要么实现;通常还有一个前提就是存在覆盖);
3.多态的好处(多态的出现提高程序的扩展性);
4.多态的应用()。
5.多态的弊端(提高了扩展性,但只能使用父类的引用访问父类中的成员)。
6.多态的出现代码中的特点(多态使用的注意事项)。
//以下代码是猫 狗的代码演示
abstract class Animal
{
publicabstract void eat();
}
class Cat extends Animal
{
publicvoid eat()
{
System.out.println("吃鱼");
}
publicvoid catchMouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal
{
publicvoid eat()
{
System.out.println("吃骨头");
}
publicvoid kanJia()
{
System.out.println("看家");
}
}
class Pig extends Animal
{
publicvoid eat()
{
System.out.println("饲料");
}
publicvoid gongDi()
{
System.out.println("拱地");
}
}
class DuoTaiTest
{
publicstatic void main(String[] args)
{
Animala = new Cat(); //类型提升。向上转型。 父类类型指向子类对象
a.eat();//吃鱼
//(如果想要调用猫的特有方法时,如何操作——强制将父类的引用,转成子类类型即向下转型)
Catc = (Cat)a;
c.catchMouse();//抓老鼠
}
}
注意:不能出现这样的操作,原因是将父类对象转成子类类型
我们转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换
多态自始至终都是子类对象在做着变换
成员的特点:
1、成员函数(非静态)。
编译时期:参阅引用型变量所属的类中是否有调用的方法,有编译通过;无编译失败。
在运行时:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边
2、成员变量。
无论编译还是运行,都参考左边(引用型变量所属的类)。成员变量不涉及覆盖,函数涉及。
3、静态函数。
无论编译还是运行都参考左边。
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------