day06、07 - 面向对象概述
面向对象概述:
- 对象:
静态部分: 属性(高矮 胖瘦 颜色)
动态部分: 动态属性(行为)
- 类:同一类事物(具有相同属性和行为)的统称
实际上就是封装对象地属性和行为的载体,对象则使类抽象出来的一种实例
在类中,成员变量:定义对象的属性
方法变量:定义对象的行为
- 封装:
将对象的属性和行为封装起来,载体就是类。
类将内部数据隐藏,为用户提供对象的属性和行为的接口,用户通过这些接口使用这些类,无需知道这些类内部是怎样构成。不能操作类中的内部数据。
- 继承:
鸟类(父类/超类)—>信鸽类(子类):保留了鸟类的属性和行为,又添加了信鸽独特的属性和行为,如送信的行为。
主要利用特定对象之间共有属性。
子类的实例都是父类的实例,不能说父类的实例是子类的实例。
- 多态:
将父类对象应用于子类的特征。
抽象类???不能实例化对象,父类通常被定义为抽象类,给出一个方法的标准,但不给出具体的实现方法。
更方便的还有,将抽象类定义为接口
类:
1.成员变量:对应于类对象的属性
成员属性有默认的初始值
成员变量它存储在堆中,如果没有赋初值,它有默认值。
- 整数byte、short、int、long =0;
- char='\uoooo';
- boolean =flase;
- String =null;
- 类类型 =null;
- 数组 =null;
2.成员方法:对应于类对象的行为
中可以调用其他成员方法和类成员变量
中定义的变量为局部变量,参数也为局部变量,局部变量在使用时必须初始化。可以在互不嵌套的的作用域中同时声明两个同名同类的局部变量。在作用范围外不能使用局部变量
权限修饰符 返回值值类型 方法名(参数类型 参数名){
...//方法体
return 返回值(可有可无(void))
}
参数可有可无 参数可以是对象也可以是基本数据类型变量
权限修饰符:
控制着对类和类成员的访问
private:仅本类可见
protected:仅本类和同包其他类或子类可见
public:类和同包其他类或子类可和其他包的子类或子类都可见
当声明类时不使用权限修饰符,则这个类预设为包存取范围,即只有一个包中的类可以调用这个类的成员变量或成员方法。
PS.当成员方法的权限与类的权限不同时,类的设限会约束类成员上的权限设定
this关键字:
1.表示对本类对象的引用,可以调用本类成员变量和成员方法。(在局部变量或方法参数覆盖了成员变量时,如同名时,就要添加this关键字表明引用的是类成员还是局部变量或方法参数)
2.作方法的返回值,在方法中返回该类。
3.调用类中的构造方法。
但是,只可以在无参构造方法中的第一句调用有参构造方法。格式: this(“要传入的参数”);
类的构造方法:
不同于成员方法,构造方法于类同名
特点:没有返回值(成员方法没有返回值不同的是,成员方法需要void关键字声明),与本类的名称相同。
作用:对象的创造通过构造方法完成。
每当实例化一个对象的时候,类都会自动调用构造方法。
定义格式:
修饰符 类名称(){ }
构造方法可以带参数,为成员变量赋值,这样每当实例化本类的一个对象的湿乎乎,相应的成员变量也被初始化。
一个类中可以有多个构造方法。
如果类中没有明确定义构造方法,编译器会自动创建一个无参的默认构造方法。
如果类中的所有构造方法都不是无参的构造方法时,这时编译器会自动创建一个无参的默认构造方法,当试图以无参得得方式实例化一个对象时,编译器会报错。
static关键字:
修饰符 声明静态变量、常量和方法
可以使两个类中共享一个数据
调用静态成员的方法:
类名.静态类成员名
(可以在本类和其他类中调用)
PS.虽然静态成员也可以使用“对象.静态成员”的方式调用,但通常不鼓励,容易混淆静态成员与非静态成员。
作用:提供共享数据或方法,但静态成员同样遵循着public,private,protected修饰符的约束?
PS 在静态方法中不可以使用this关键字,不可以直接调用非静态方法
不能将方法内的局部变量声明为static
如果在执行类时,希望先执行类的初始化动作,可以使用static定义一个静态区域,如:
public class example{
static{
//some
}
}
当这段代码执行时,首先执行静态区域中的程序,并只执行一次
匿名对象:
没有名字的实体,也就是该实体没有对应的变量名引用
匿名对象要注意的事项:
1. 我们一般不会给匿名对象赋予属性值,因为永远无法获取到。
//new Student().name = "狗娃"; //匿名对象
//System.out.println(Student().name); //null
2. 两个匿名对象永远都不可能是同一个对象。
好处:可尽快的释放内存空间、简化书写。
匿名对象的用途
1,当对象对方法进行一次调用的时候,可以使用匿名对象对代码进行简化。
为什么只对方法,而不调用属性呢?因为匿名对象调用属性没意义。
如果对象要多成员进行多次调用,必须给对象起个名字。不能在使用匿名对象。
简单演示
new Car().run();
2,匿名对象可以实参进行传递。
前提: 该对象调用完一个方法之后,这个对象就不再使用了。
类的主方法:
对象:
创建对象:new关键字
格式:
Test test=new Test();
Test test= new Test(“a”);
test是对一个对象的引用,java语言中,当创建对象时,自动调用构造方法。
每个对象都是独立的,在内存中占据独立的地址。
访问对象的属性和行为:
对象.类成员
封装:
权限修饰符:权限修饰符就是控制变量可见范围的。
需求:不允许其他人可以直接操作类成员属性,如对属性进行直接的赋值。
如果不使用封装,很容易赋值错误,并且任何人都可以更改,造成信息的 不安全。
public : 公共的。 public修饰的成员变量或者方法任何人都可以直接访问。
private : 私有的, private修饰的成员变量或者方法只能在本类中进行直接访问。
封装的步骤:
1. 设置成员变量的属性为private(关键字),不能使用对象名.属性名的方式直接访问对象的属性。
2. 提供一个公共的方法设置或者获取该私有的成员属性。
命名规范:
set属性名();
get属性名();
在set方法中加入逻辑判断,过滤掉非法数据。
规范 : 在现实开发中一般实体类的所有成员属性(成员变量)都要封装起来。
实体类:实体类就是用于描述一类事物的就称作为实体类。
工具类:如Arrays数组的工具类
封装的好处:
1. 提高数据的安全性。
2. 操作简单。
对调用者而言, 他可以直接调用不在判断。。。
3. 隐藏了实现。
练习:
class Caculator {
private int number1; //操作数1
private int number2; //操作数2
private char c; //操符符
public void setNumber1(int number)
{
number1 = number;
}
public void setNumber2(int number)
{
number2 = number;
}
public void setOption(char c)
{
if(c == '+' || c == '-' || c == '*' || c == '/')
{
this.c = c;
}else{
return ;
}
}
public void caculate()
{
if(c=='+')
{
System.out.println(number1+number2);
}else if(c=='-')
{
System.out.println(number1-number2);
}else if(c=='*')
{
System.out.println(number1*number2);
}else if(c=='/')
{
System.out.println(number1/number2);
}else
{
System.out.println("can not caculate");
}
}
}
class Cacul{
public static void main(String[] args){
//创建一个计算器对象
Caculator cacu = new Caculator();
Caculator cacu2 = new Caculator();
cacu.setNumber1(7);
cacu.setNumber2(8);
cacu.setOption('b');
cacu.caculate();
cacu2.setNumber1(10);
cacu2.setNumber2(10);
cacu2.setOption('*');
cacu2.caculate();
}
}
遗留问题: 什么是多态?
浙公网安备 33010602011771号