黑马程序员_面向对象

------- android培训java培训、期待与您交流! ----------

1.面向对象

class

-> 自定义一个类. 

如何定义类. 

class 类名{

成员变量(属性)

成员方法(行为)

}

类是模板,有了类可以根据类创建对象. 

对象

堆内存中的一块实体空间. 

存储了对象的属性. 

new

-> 创建对象. 

通过new 关键字创建对象. 在堆内存开辟了空间.存储了对象的属性. 

类类型 对象名=new 类名();

虽然是通过new 操作符创建的对象, new 操作符返回一个结果,该结果是对象的引用(地址值),非对象本身. 

对象的使用

-> 如何使用对象.

可以通过对象名. 的形式操作对象. 

1. 对象名.属性名=值; 

给对象的属性赋值. 

2. 对象名.属性名

取出对象的属性

3. 对象名.成员方法

执行对象的特有的行为. 

匿名对象

-> 存在的意义.

简化书写的方式.

1. 调用方法 

如果调用成员方法时, 只需要使用一次,可以使用匿名对象. 

new 类名().成员方法();  虽然使用new 操作符创建了一个对象,并执行了该对象的方法,但是只要方法执行完毕该对象

立即变为了垃圾(来及回收是不定时回收的). 

2. 作为方法的实际参数传递的. 

public Car repairCar(Car car){

}

Car c=new Car();

repairCar(c);

***************

封装

解决的问题,程序出现了问题. 需要使用该种方式解决? 

-> 封装的实现的方式. 

成员变量私有,公有的get set 方法 这就是封装的一种实现方式... 

-> 存在的意义. 

如果使用封装, 在其他类中,可以直接通过对象名.属性名的方式直接访问对象的属性. 可以属性赋值. 

出现非法的数据,对象保存了非法的数据,程序不够安全和健壮了... 

如何有效的过滤非法数据. 

1. 类的成员变量私有

其他类中, 无法通过对象名.属性名的方式直接访问该对象的属性类. 

2. 该类提供公有的get 和set 方法. 

可以在方法中加入逻辑判断,过滤非法的数据.

(只不过偷懒了... )

注意: private 实现方式仅仅是封装的一种体现... 

     方法(函数) 也是封装的一种体现... 

     一段独立功能的程序. 可以解决特定的问题,实现特定的目标... 

     Arrays.sort(数组);

dry  电脑...

主板, cpu ,内存,硬盘,电源... -> 跑了... 

风险高-> 避免安全隐患. 将电脑封装到主机箱中... 

不能封死,对外提供操作... 开机按钮,网卡口... 

对外提供开机按钮,usb ,网卡开口... 

-> 封装的好处:

隐藏了类的具体的实现(侧重隐私的).

成员变量私有的话,对外(其他类)隐藏改成员变量...

如果不提供get 和set 方法的话,在其他类中确实无法访问了... 

提高了对象的数据(属性)的安全性

在set方法中,过滤了非法数据.

提高了程序的可维护性安全性. 

提高了可维护性?

成员变量私有->无法直接通过对象. 属性的形式访问对象的属性了.

但是可以通过get 和set 方法访问... 

可以根据实际需求决定是否要提供get 或者set . 

如果需要对外提供属性->添加get 方法. 

如果需要对象提供修改属性->添加set 方法... 

员工:

工号

get 

no set

工资:

no get

set  

构造函数

作用

初始化对象. 

使用

通过创建对象时, new 操作符后 添加具体的实际参数,jvm 根据实际参数匹配对应的构造函数... 

构造函数在创建对象时,有jvm 根据实际的参数调用的,用于初始化对象的属性的. 

一个类中可以存在多个构造函数,是以重载的形式存在. 

重载: 函数名相同, 参数列表不同的. 

构造函数的特点:

1. 函数名和类名相同

2.没有返回值

3. 没有返回值类型, 和void 不同. 

4. 自定义类,如果没有提供构造函数,编译器提供一个无参数构造(默认),如果自定义了构造函数,默认的无参数构造就没有了

构造代码块

在一个类中直接以一对花括号存在{} 

作用: 初始化对象

构造函数的不同:

只要创建对象就会执行,并且优先于构造函数执行. 在创建对象的整个周期内只执行一次. 

构造函数,jvm 根据具体的实际参数确定对应的构造函数.  

this

含义:

对象的引用. 

使用场景

可以用在成员方法中

可以用在构造函数中. 

作用

1.用在成员方法中,可以区分成员变量和局部变量同名的问题.

set 方法. 

this.成员变量=局部变量. 局部变量的值赋值给了成员变量(属性)

注意:成员方法的依赖于对象. 需要通过对象名.成员方法的形式调用... 

哪个对象调用该方法,方法内部的this 就是那个对象了.

2. 用在构造函数的第一行. 调用本类的其他构造函数. 

this() -> 调用无参数构造. 

this("jack",28); 调用有参数构造.参数一为String,参数二位int 

注意的如果在一个构造函数中,调用本类的另一个构造函数,这个语句需要在第一行.

因为java 希望初始化的动作优先执行... 

static

静态

修饰成员变量

使用场景,作用是什么

类变量, 不需要创建对象,可以直接通过类名来访问了.

静态变量随着类的加载初始化,存在于方法区(类的字节码文件.class 文件也存储在方法区)由于类只加载一次,静态变量只有1份. 

如果对象和对象之间出现了共享的数据,可以使用静态变量. 

实际开发:

public static final  数据类型 常量名=常量值; 

静态和常量和公共一起出现. 

公共的->访问权限最大.都可以直接通过类名访问. 

static -> 静态的,只有1个. 

final  ->最终的,不能被改变的,常量 

public static final dobule PI=3.14

Math.PI . 

修饰成员方法

使用场景,作用是什么. 

如果设计的方法,不想创建对象,就像调用的话,直接将方法设计为静态的... 

什么时候考虑使用这样的方法呢?

设计工具类时, 例如Arrays Collections  Maths 这些工具类...  

为了方便的让大家使用导工具类中的方法,直接将所有方法设置为静态的,有了避免多余的创建对象,将工具类的构造函数私有化. 

只能通过 类名.方法名访问了工具类中的方法了...

静态代码块

随着类的加载而执行,并只执行一次. 

想要执行第二次或者第三次,重新启动程序...  所以在整个正序的运行周期内,只执行一次. 

适合初始化类(程序)

例如: 静态代码块中连接库... 

     图书管理系统初始化书库...

*****************

类和类之间的关系

继承

extends 

解决了什么问题,好处的什么. 

如果类和类之间符合is a 的关系... 

ia a   

xxx 是 yyy 的一种(一类)

可以使用继承建立类和类之间的关系. 

如果建立了继承关系,可以提高代码的复用性,减少重复代码... 

1.描述类和类之间的关系,并减少了重复代码,提高代码的复用性. 

注意:

不要为了减少重复代码就使用继承,要符合is a 关系. 

super

使用场景

子类中. 

1. 访问父类属性. 

2. 访问父类的成员方法. 

3. 访问父类的构造函数. 

在子类的构造函数第一行有默认的语句super() ,创建子类对象时,先默认的调用父类的无参数构造. 

当子类的构造函数中,自定义的调用类父类的构造函数时,默认的super() 就没有了... 

注意: 如果在构造函数中,调用父类的构造函数是,不同同时出现this,调用本类的构造函数. 

都是初始化的动作,都需要在第一行. 

class fu{

private String name; 

fu(){

}

fu(String name){

this.name=name;

}

public void setName(String name){

this.name=name;

}

public String getName(){

return name; 

}

}

class zi extends fu{

zi(){

}

zi(String name){

super(name);

}

}

class sun  extends zi{

sun(){

}

sun(String name){

super(name);

}

}

重写

override 覆盖. 

存在的意义,java设计了重写的意义.

使用前提:

子父类中(实现类实现接口的实现类中),子类继承类父类的方法,如果父类的方法无法满足子类的需求,子类可以重写父类的方法. 增强子类的方法.

核心:

子类是比父类强的. 

使用场景:

子类继承类父类,父类是抽象类,存在抽象方法. 

子类如果调用该方法,必须重写... 

实现类实现类接口,接口中有方法. 

实现类实现类该接口,如果想要调用该方法,必须重写... 

注意:

子类继承父类, 实现类实现接口中. 

函数名要形同,参数类表一致,修饰符(子类>=父类),返回值类型(子类方法返回值类型<=父类方法的返回值类型)

Object 在java 是一个顶层的父类 比较大的. 

Object 子类 就是小的. 

class Animal{}

class Dog extends Animal{}

class Father{

Animal getAnimal(){

return new Animal(); 

}

}

class Son extends Father{

public Dog getAnimal(){

return new Dog(); 

}

}

Dog < Animal 

重写只存在于非静态成员方法,和成员变量,静态方法没有关系的... 

final 

使用场景

1.修饰成员变量

普通的变量,可以取值和赋值. 如果不想修改变量的值. 可以将变量设置为常量.final修饰. 

2.修饰成员方法

普通的成员方法(非私有的),子类继承并重写该方法, 如果父类不希望子类重写,可以将方法设置final. 

3.修饰类

如果该类不希望有子类... 

4.修饰形参.

避免形参随意的修改...

抽象类

abstract 

抽象方法:

如果一个类中的成员方法,方法体不明确,无法确定,可以将方法设计为抽象方法,交给子类来实现(重写)

修饰符 abstract 返回值类型 函数名(参数列表);-> 没有方法体的方法,并使用abstract 声明了的就是抽象方法了...  

抽象类:

如果一个类中存在一个以上的抽象方法,该类必须声明为抽象类... 

修饰符 abstract class 类名{

}

使用场景

实际开发中,将符合is a 关系的类, 组成一个体系, 有所谓的顶层父类和底层的实现类. 

将顶层的父类设计为抽象类,顶层的父类的方法的方法体是不确定(明确)抽象的... 

注意事项

抽象类不能创建对象. 

抽象类中存在抽象方法,功能是不完整,如果能够创建抽象类对象的,调用到抽象方法后,是没有任何意义. 

抽象类可以有成员变量可以有构造函数,可以有非抽象方法 

都是给子类使用的. 体现了继承的思想,提高代码的复用性... 

抽象类当然可以没有抽象方法

目的仅仅是为了禁止创建对象.->如果是抽象类,即使使用反射技术,也无法创建出该类对象...

使用事项:

子类继承抽象类. 

1. 子类要么重写父类中的所有的抽象方法,

子类继承的父类,如果父类还继承的有父类, 子类就需要重写全部的继承下的抽象方法... 

2. 子类要么也声明为抽象类. 

不需要重写抽象方法了,抽象类允许存在抽象方法.      

接口

interface  implements  

语法:

interface 接口名{

public static final 属性; 

public abstract 返回值类型 函数名(); 

}

使用事项:

1.类实现接口要么重写该接口中的所有方法... 

2.类实现接口要么声明为抽象类.

3. 一个类可以同时实现多个接口. 

3. 接口和接口之间是继承关系,一个接口可以继承多个接口.  

思考题:

设计一个类. 

表示古代的皇帝, 

皇帝比较特殊,唯一的... 

如果描述了皇帝类,该类在整个程序中只能创建一个对象. 只能有1个...

创建对象:

如何保证对象的唯一性  

单例设计模式. 

设计模式:

解决一类特定的问题时,发明了特定的代码适合解决该问题... 

单例:

1. 构造函数私有. 

禁止在其他类中创建该类对象. 

2. 本类提供一个本类对象. 

在成员变量的位置设置一个本类对象的成员变量,并初始化(创建本类对象).

3. 提供静态方法获取到这个本类对象. 

      

*/

public class Demo1{

public static void main(String[] args){

for(int i=0;i<10;i++){

System.out.println(Emperor.getEmperor());

}

}

}

// 单例(单态)-> 保证该类对象的唯一性...   

class Emperor{

// 本类类型的成员变量. 

private static final Emperor em=new Emperor(); 

// 构造函数私有

private Emperor(){

}

// 公共静态方法获取到本类对象. 

public  static Emperor getEmperor(){

return em; 

}

}

猜你喜欢

转载自blog.csdn.net/u014231961/article/details/84700810