查看: 537|回复: 0

[Java学习] java 面向对象 概念相关内容

发表于 2018-2-2 08:00:02

java 面向对象
面向对象概念产生,到流行,归根结底就是:人都是比较懒得;
尤其是程序员(写代码,做出来产品能够提升效率的群体;牛逼的程序员能够改变世界;)

不会偷懒的程序员不是一个合格的程序员;

什么是重复造轮子?
有很多事情前人已经都做过了(不必过于纠结别人做的是好是坏),你再去耗费过多的时间,精力去做重复的事情显然是不太明智的,因为有更重要的事情等着后人去做;

面向对象编程就能有效地避免这种重复造轮子的方式;
你学会使用前人已经写好的东西以实现自己的目的,这种方式是所有人都乐见的,对于鄙视这种方式的人,认同这种方式的人也可以进行相应的鄙视之...

public class Person {
private String id;
private String name;
private String sex;
private Integer age;
}

public class Student extends Person{
private String school;
}

从上面这段简单的代码去发现了什么?
发现Person类中的内容Student都可以愉快的使用(通过get、set方法);
那么对于Student类本身而言,就没有去定义通用的属性;能够少写哪怕是一行代码,这符合程序员偷懒的风格;

既然面向对象编程方式能够更好的去避免造轮子,那么学会这种方式是很有必要的;

所有的程序开发都必须跟数据库(数据仓库)打交道,数据库里面有什么?
1、表结构
2、表中有数据

java 要想更好的操作数据库表中的数据,那么必须去学会相应的语法;

简单java 类
package com.curtis.bean;
public class Person {
private String name;
private String sex;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}

为什么会用到简单java类?
要想实现一条记录的添加,查询出来显示,能够看到内在隐含的身影就是数据库表中完整的一行记录;
在面向对象的编程语言里面,什么能够跟表中的一行记录进行有效的对应?就是简单java类;

简单java 类说简单简单,说有深度还是蛮有深度的;
1、包
2、定义类
2.1、访问修饰符
2.2、关键字 class
2.3、类名称(胡乱定义类名称本身就是一种不负责任的态度,例如:中文啦,类名称定义的毫无意义,类名称与.java文件不一致等等)
3、类中的属性
3.1、访问修饰符
3.2、强类型的编程语言都需要给变量声明数据类型;为啥要声明数据类型?我认为提前准备充分,比用时临阵磨枪不快也光我认为提前定义的额方式更友好点(纯属个人观点);
4、对象通过方法的调用给属性赋值,以及对象通过方法的调用从对象中取出值
4.1、方法的定义
4.1、访问修饰符public private
4.2、方法执行完是否会有内容返回(决定是否有return)
4.3、方法的名称
4.4、方法的参数列表,是一个还是多个
4.5、static 方法
4.6、方法的重载(方法名称相同,参数列表不同)
4.7、方法的覆写(有一个前提,继承关系)
4.8、普通方法、static 方法调用方式
4.2、方法的调用
5、构造方法
5.1、为对象进行初始化

普通方法跟static方法
1、普通方法是为类的对象准备的
2、static方法属于类里面的

类跟对象
1、类是编程语言语法定义的(编程语言有自己特定的语法,按照其语法定义一个类对象是为了迎合编程语言的标准)
2、对象是基于编程语言语法先声明类也可以在定义一个类,然后通过类创造出来的,基于编程语言能够声明N个类(只要有必要),通过类也能创在出来N个对象

普通方法的调用是通过类的对象完成的;

通过构造方法的调用创造一个p1 对象
p1 的数据类型是Person
String name; name的数据类型是String 类是一样一样滴;String 类是编程语言自身定义的Person是自己根据编程语言的语法定义的而已;
Person p1=new Person();

既然普通方法是由类的对象进行调用的,那么statis 方法中是肯定不能直接调用普通方法的;
类的内部普通方法能够相互调用么?答案是肯定的;
类的内部static方法能够相互调用么?答案是肯定的;
static 方法中能够调用普通方法么?答案是否定的,前面已经说过了,普通方式是由类的对象进行调用的,如果static方法中能够调用普通方法,出现矛盾;

static方法调用的方式:
1、在同一个类中,直接调用
2、在一个类中想调用其它类中的static方法:类名称.static方法名称

为什么要有static 呢?
以数据库的打开,关闭为例;
如果将数据库的打开关闭操作都定义成普通方法,那么在调用打开,关闭方法时,都需要通过类创造一个对象实例出来,再对方法普通方法进行调用,很明显不符合程序员偷懒的风格;如果定义成static方法,在用的时候直接类名称.static方法名称,用完就完了;

继承(避免重复造轮子,对父类中的内容进行扩充)
1、关键字extends
2、程序角度没有什么父亲,儿子子类的说法,语法规则而已,为啥都喜欢采用这种方式去描述,就是怕这些语法规则对初学者来说不那么好理解,所以是人为加上去的;

是不是父类中的所有内容子类都能够愉快的使用?
当然不是
private 修饰的内容子类是无法使用的;
为啥呢?
很好理解呀,你老爸能将他所有东西都给你?很明显不可能嘛;假设你老爸眼睛近视,作为儿子你眼睛不是近视,那你是要还是不要呢?(哈哈...一个不太恰当的说法,指在说明父类中的所有内容并不是会全部显示继承到子类上的)

方法的重载与方法的重写
1、同一个类中方法名称相同,方法的参数列表不同,这样现象称之为方法大的重载
2、方法的重写,前提:必须要有继承关系,否则不要提起重写这个名词;之所以会有这么一个概念可以理解成,前面定义了标准你按照标准去实现即可,不按照标准也不是不可以,后面会通过代码进行说明;

Person p2=new Student();
父类引用指向子类实例化对象;

面向接口编程里面这个异常关键,很多刚开始接触的人死活不明白为什么能够这样;
按照易经里面的说法:道生一,一生二,二生三,三生万物;那么这个万物是否能够归结到道上面去?很明显是可以的;

this关键字
指代本类
package com.curtis.bean;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
name 是Person的一个属性
方法内的this.name 很明显表示的是当前这个类里面的东西,而右边的name很明显是方法的参数传进来的;

super关键字
这个关键字有个前提:发生在有继承关系的两个类中;在子类中调用父类中的方法,为了说明调用的是父类中的方法用到的,当然还能用在构造方法上面;

继承关系里面创造子类对象时,跟父类是否有关系?
必须是有关系的;
没有青天哪来的流云;所以在实例化创造子类过程中,会先调用父类中无参数的构造方法;

什么叫做实例化?
程序员编写的是.java 文件,要想用这个.java 文件,必须要到内存中去,从.java 到内存中的过程可以想象成是在实例化(说法并不标准,但是可以这样理解);

Person p3=new Person();
p3.setName("Curtis");

上面这个set方法的调用很有意思;
设置了一个值,为什么不能用这个之呢?类又没有被垃圾回收机制回收掉,既然没被回收掉,那么设置的值能够被使用也没什么难理解的;
下面的案例:
Person p3=new Person();
p3.setName("Curtis");
IMemberService service = ServiceFactory.getInstance(MemberServiceImpl.class);
System.out.println(service.add(p3));// 这个地方的p3 里面肯定是有值得,set 方法进行了设置嘛

无参数的构造方法
1、按照编程语言语法声明一个类,如果不显示定义构造方法,那么语法会自动隐含声明一个无参数的构造方法
2、如果显示的定义了一个有参数的构造方法,那么语法不会声明一个无参数的构造方法了,你自己定义了,还让系统给你自动声明一个干么呢?
3、构造方法的作用是给类中的属性进行赋初值(如果总是通过set方法的的调用给属性赋值,不符合程序员懒的风格)
4、构造方法是一中特殊的方法,方法名称与类名称相同
5、构造方法当然也能进行方法的重载
6、如果在类的声明中,自己已经定义了一个有参数的构造方法,那就务必显示声明一个无参数的构造方法,跟反射有关系的

package com.curtis.bean;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 无参数的构造方法
public Person(){}

  1. // 有参数的构造方法
  2. public Peron(String name){
  3. this.name=name;
  4. }
复制代码

}

抽象类
1、抽象类用到了关键字abstract
2、抽象类跟普通的类区别
2.1、抽象类比普通类多了个抽象方法(抽象方法是没有方法体的,也就是没有{})
2.2、抽象类不能被实例化
2.3、抽象类是给普通类去继承的
2.4、普通类继承了抽象类,必须覆写抽象类中的抽象方法(也可以叫做重写override)
2.5、抽象类中的抽象方法就是给出方法的标准
2.6、类的继承用extends关键字
2.7、一般不建议继承一个已经实现好的类,当然语法上面是没有错误的
2.8、既然抽象类是有一项是给普通类定义标准,那么抽象类中抽象方法绝对不能使用private关键字修饰
2.9、如果类中有些方法不希望子类进行覆写,那么可以使用final 关键字修饰

接口
implement
面向接口编程是java 里面一个比较有意思的
1、抽象类能够实现接口,接口中定义的方法,抽象类中并不一定要提供提具体实现(抽象类中能定义抽象方法嘛)
2、普通类既继承了抽象类,又实现了某个接口,先继承,后实现接口,也就是写法上是:类 extends 抽象类 implement 接口
案例:public class MemberDAOImpl extends AbstractDAO implements IMemberDAO{}
3、接口里面只有常量、抽象方法
4、普通类实现接口必须实现接口中定义的抽象方法
5、接口也是一种特殊的类,所以接口对象,能够指向普通类的实例

反射
...



回复

使用道具 举报