这里写目录标题
Java学习–面向对象和类
因为马上要面临找工作实习,所以从网上学习一些之前拉下的知识点,在这里当作笔记,基础知识就不过了,从一些之前掌握的有些模糊的概念或者认为比较重要的知识点开始学习。
什么是对象
面向对象思想(Object Oriented Programming):
-
一切客观存在的事物都是对象,万物皆对象。
例如,一只钢笔,钢笔是对象,一辆车,车就是对象 -
任何对象,一定具有自己的特征(属性)和行为(方法)
例如:钢笔的特征(属性)有长度、颜色等。钢笔的行为(方法)有书学、抽墨等,车的属性有(最高速度、速度等,车的行为有,启动、刹车等。
例如车的类
//车的类
public class car{
//车的属性
private double maxSpeed;//最高速度的属性
//车的方法
public void start(){
//方法指令
}
//属性的Getter和Setter方法
public double getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(double maxSpeed) {
this.maxSpeed = maxSpeed;
}
什么是类
类
类就是对现实生活中事物的总结,相当于现实事物的模板,例如咱们说的哈士奇,金毛,秋田犬,这些都属于狗的这个类,他们都有共同的行为:能吃,能睡,能玩,还有共同的特征:名字,年龄,品种,主人。
对象
如果具体到一条狗上,例如我在大街上看见了一条哈士奇,哈士奇就是套用狗这个模板的一个对象,这个对象有他自己的特征,即对象是类的实例,例如
public class dog{
//定义实例变量
private String people;//主人的名字
private String age;//狗的年龄
private String category//狗的品种
private String name//狗的品种
//set和get方法
}
这里面我想信大部分狗主人一般都不是同一位吧,就算狗主人是同一位那狗的品种也不一定一样吧,就算品种一样,年龄也不一定一样吧,就算都一样,那主人也得给他起一个不同的名字吧。
所以每一个狗都是dog类这个模板的一个对象。
为什么对属性的取值和赋值使用Getter和Setter方法:
可以验证
首先如果在调用的时候直接通过
类名.属性
上面这个方式也可以进行赋值和取值,但是如果用户在输入不相符的数据时无法进行验证,例如
年龄
>pubilc class person{
> int age;
}
如果在其他类中调用这个类时通过person.age赋值和取值,当用户输入1000岁,很明显没有这种人,如果通过setter和getter方法
> public void setAge(int age) {
> if(age<120&&age>0)
> this.age = age;
> }
这样的方式就可以对用户输入的值进行判断,或者
public String setAge(int age) {
> if(age<120&&age>0){
> this.age = age;
> return "设置年龄成功";
> }
> else{
> return "你输入的值不符合逻辑,应该在0到120岁之间";
> }
> }
在Idea编辑中可以快捷键
Alt+insert有Getter And Setter
可以保证安全
例如我们可以在修改某个值的时候加入相应的用户名
public String setName(UserModel userModel,String name)
{
if(userModel.getUserType().equals("admin")//equals比较字符串,假设是admin管理用户
{
this.name=name;
return "成功";
}else
{
return "没权限";
}
}
如何创建对象
可以通过如下方式创建
类名 变量名=new 类名();
如果类中属性不是私有的可以用如下方法对实例变量进去存和读
变量名,属性名
变量名,方法名
pubilc class test{
public static main(String args[]){//主函数,程序的入口
Dog dog=new Dog();
dog.name="小白";
dog.age=12;
System.out.println(dog.name);//idea中可以输入sout快速生成输出语句
}
}
方法
实现某个类的某个行为就叫方法。
方法的重载
重载(Overload):一个类中定义多个想同名称的方法
重载的要求
方法名称相同
参数列表不同
与访问修饰符、返回值类型无关
重载的功能
用来解决同一个行为的不同过程
例如,人吃东西可以吃很多东西,吃药用水,吃饭用筷子,过程不一样,就可以通过重载来声明方法。
public class people{
//实例属性
//实例方法
public String eat(药类 c1){
//具体方法
return null;
}
public String eat(饭类 c1){
//具体方法
return null;
}
在调用时,会通过传入的实参不同去找与之匹配的方法。
重载的好处
屏蔽使用差异,灵活,方便
如下不是重载
public void m(int a){}
public void m(int b){}
参数名称不同,不能构成给方法的重载
构造方法
什么是构造方法
类中的特殊方法,主要用于创建并初始化对象
构造方法的特点
- 名称与类名完全相同
- 没有返回值类型
- 创建对象时,就调用构造方法,不可通过句点调用
注意:如果没有在类中现实定义构造方法,则编译器默认提供无参构造方法
public class people{
//若不添加此方法,编译器默认提供无参构造方法
public people(){
System.out.println("构造方法执行了");
}
}
构造方法应用
一般完成数据初始化的操作
public class people{
int age;
String name;
String sex;
//若不添加此方法,编译器默认提供无参构造方法
public people(){
age=10;
name="哈哈";
sex="男";
System.out.println("构造方法执行了,初始化成功");
}
public void print(){
System.out.println(age);
}
}
在主类中调用
public class Test{
public static void main(String[] args){
people p=new people();
p.print();
}
}
对象的创建过程
new people() ;触发对象的创建
对象的创建过程如下:
- 开辟空间并为属性赋值默认值
- 执行构造方法的代码
- 将对象的地址赋值给变量
对象的内存分配
如下是当创建一个对象时,并且类中有构造方法时栈和堆的变化。
构造方法重载
和普通方法重载一样
this关键字
什么是this关键字
类是对象的一个模板,可服务于很多的对象,而this是类中的默认引用,代表当前的实例,具体到某个对象的时候,this.指向这个对象
例如
public class person{
String name;
public void setName(String name){
this.name=name;
}
其中没加this的是局部变量,加了this的是类的实例变量
如下是在主方法中
public class test{
public static void main(String[] args){
person p1=new person();
p1.setName("小明");
person p2=new person();
p2.setName("小红");
}
其中两个变量p1,p2所在的地址不同,各自的this代表自己当前地址下的实例变量name
this的用法
第一种用法
调用实例属性、实例方法。如this.name ,代表当前对象的实例属性。
第二种用法
调用本类中的其他构造方法。如this(),this(实参).
class Student{
String name;
int age;
String sex;
public Student(String name,int age){
this.name=name;
this.age=age;
}
public Student(String name,int age,String sex){
this(name,age);
this.sex=sex;
}
}
第二中方法中this只能被调用一次,且必须是第一条语句。