心情: 凑活
笔名: 花美
行业: telecommunication
TIME: 2020-4-13
程序中面向对象的意义
名言: 万物皆对象 !
类和对象
- 类是模子,确定对象将要拥有的特征(属性)和行为(方法)
- 对象是类的实例化的表现形式
- 类是对象的类型
- 对象是特定类型的数据
属性和方法:
- 属性——对象具有的各种静态特征,就是对象有什么东西
- 方法——对象具有的各种动态行为,就是对象能做什么事情
面向对象——单一职责(功能)原则:
Why use it:解耦和提高复用性
How to use:一个类class干一件事,职责分发到不同class中
例子:cat 定义成一个类(拥有属性和行为),testcat定义成一个类(实例化:new一个cat类。并且写出怎么测试cat类代码)
实例化对象的过程为 3个部分:
— 声明对象 Cat one
— 实例化对象 new Cat();
— 赋值指向 Cat one = new Cat();
注意1
:实例化两个Cat —— 在堆(Heap)中开辟 2个独立空间用于存放数据,one对象属性修改数据,对two对象不影响。栈-stack中存储的是堆-heap中的地址引用,也就是对象引用image.pngCat one = new Cat(); Cat two = new Cat();
1586695817730.png
形象化
:老张和老王一人有一个家具装修一模一样的房子,但是房子的所属者不同——每人都有一把与对方不相同的钥匙,所以对任何一个房子的重新装修,都不会影响对方
注意2
:下列是另一种创建对象方法</mark>表示将one的内存地址赋值给了two(图一),也就是将one的钥匙给了two(图二),结果(图三),此时one和two都有对cat的修改权限,当然谁最后赋值就决定cat属性值是什么,毕竟做什么事情都是一步一步来的嘛!image.png image.pngCat one = new Cat(); Cat two = one;
image.png
构造方法
- 构造方法与类名相同且没有返回值(不需要写void),在cat类里构造方法写法是
无参:
public cat(){}
| 有参:public Cat (String name){}
- 只能在对象实例化时候调用——new的好搭档
(
是的,new保养了他)
- 在没有写构造方法时,系统会自动的添加一个无参数的构造方法,使对象完成实例化操作
这就是为什么
new Cat( )
时候,需要加个( )
,因为这哥们是一个方法啊。
- 如果你手欠写了一个构造方法(无参有参都可以)这里举例有参:
public Cat (String name){}
,那么你就没有无参构造方法了也就是系统给你添加的无参构造方法:public Cat(){}
不会提供给给你了,就是系统不分配了。这时候在测试类中实例化写法是:Cat one = new Cat("小奶狗")
,乳沟你还挺倔强的,就像用无参实例化:Cat one = new Cat( )
没问题,你可以在cat类里自己多写一个:public cat(){}
- 构造方法不允许被类内的非构造方法的 方法直接调用比如:
public void run(){Cat()}
这种是不可以的
- 构造方法定义时候可以相互调用——也就是重载构造方法
public Cat(String name){this();}
函数内执行的是无参构造方法
tip:this()
必须放在方法体内第一行
System.out.print("这是cat类的构造方法,new实例化的时候最先执行一次这个cat()方法,因为实例化都在程序的最开头嘛,很显然我这里是输出这句话");
}
有参构造方法对象实例化对类数据初始化问题与 THIS
class Cat{
String name;
public Cat(String sname){
name = sname;
// 这里你的形参: sname 必须和属性值:name 不一样
//如果你写成这样 public Cat(String name){ name=name }
//因为java有就近原则 找到的其实就是你形参自己 根本没传到 Cat定义的name中——也就是cat类中第一行的name
}
public void run(){
System.out.println(name);
}
public void eat()
{
System.out.println(name+" eating! ");
}
}
class TestCat{
public static void main(String[] args){
Cat one = new Cat("小奶狗");
one.run();
}
// 结果:
// 小奶沟
}
关于this:
this范围:当前对象 ,this可调用属性也可以是方法
this.name | this.eat
解决成员属性与局部变量重名冲突(上边例子)
//上边的代码其中有参构造方法也可以这么写:
public Cat(String name)
{
this.name = name;
}
网友评论