面向对象编辑——类与对象基础学习总结
面向对象介绍
类与对象的定义与使用
面向对象介绍
1.面试对象三大特征:(重要)
(1)封装性:所谓封装,是指类将自己的数据和方法只给信任的类或者对象操作,对不可信的信息隐藏。简而言之,就是内部操作对外部而言不可见,体现了保护性。(就好比你有一张信用卡,去银行取款只有知道你银行卡密码才能取走钱,其余人均不可以)
(2)继承性:继承是指可以直接使用现有项,并能对其功能进行扩展,体现了可重用性。
(3)多态性:多态是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。
2.面向对象缩写及名词扩展
OO(面向对象)
OOA(面向对象分析)
OOD(面向对象设计)
OOP(面向对象编程)
3.面向对象特点
面向对象最大的特点就是可以进行现实生活的抽象。
类与对象的定义与使用
1.类、对象的基本概念
类:是指共性的概念。(比如人类)
对象:指类中一个具体的、可以使用的事物。(比如你的同学张三,他是人类中的一个具体的人)
类与对象的关系:
首先产生类,然后生成对象。对象的所有行为,一定是在类中做了完整的定义。(例如你在路边见到一只狗狗对你汪汪叫,而一只猫只会对你喵喵叫,这是因为狗类中定义了汪汪叫,猫类中没有定义)
对象与对象的区别:
对象与对象的区别在类中定义的具体的属性值不同。(例如狗分为好多种类型)
类中的组成:
(1)方法(操作的行为)
(2)属性(变量,描述每个对象的具体特点)
2.定义与使用
类的定义:
class Person{
//属性
public String name;
public int age;
//方法
public Person(){//构造方法,下文会详细讲解
System.out.println("************************");
}
public String getName(){//getter方法,下文详细讲解
return name;
}
public int getAge(){
return age;
}
}
public class Test{
public static void main(String[] args){
Person per=new Person();//根据Person类生成一个Person对象,此对象名称为per
per.name="张三";//对象实例化
per.age=18;//对象实例化
System.out.println(per.name);
System.out.println(per.age);
}
}
注意:这就是一个类完整的定义(粗略的可以划分为属性和方法两大类),此时的类必须由对象调用,不再通过主类直接调用。
对象的定义
(1)类名称 (2)对象名称=(3)new (4)类名称();
//Person per=new Person();
(1)类名称指的是任何对象都有其对应的类,类是对象的蓝图;
(2)对象名称是此对象唯一的一个标记,引用一块堆内存;
(3)new表示在堆内存中开辟了新的空间;
(4)类名称()表示构造方法。
内存分配
那么类、对象定义后内存是怎么分配的呢?
我们来看一个简单的例子:
class Person{
public String name;
public int age;
}
public class Test{
public static void main(String[] args){
Person per=new Person();
per.name="张三";
per.age=18;
System.out.println(per.name);
System.out.println(per.age);
}
}
注意:对象(引用数据类型)必须在实例化之后调用,否则会NullpointerException(运行时错误),编译时不会出现。
引用内存分配
那么如果类与类之间发生了引用传递内存又会如何分配呢?
先来看一个一般的代码:
class Person{
private String name;//私有属性,开发中几乎属性均用private修饰,下文会详细介绍
private int age;
public Person(String name,int age){
this.name=name;//this关键字此时调用本类属性
this.age=age;
}
public void getPersonInfo(){//输出
System.out.println(this.name+"今年"+this.age);
}
}
public class Test{
public static void main(String[] args){
Person per1=new Person("张三",18);//名称为per1的对象
Person per2=new Person("小花",22);//名称为per2的对象
per1.getPersonInfo();//调用普通方法
per2.getPersonInfo();
}
}
内存分配:
注意:类属性开辟空间和调用构造方法几乎同时完成,故构造方法在生成对象时调用,构造方法用于本类私有属性的初始化(相等于setter方法,好处是能减少使用setter方法使用方法)
输出结果:
进行引用传递后的代码:
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void getPersonInfo(){
System.out.println(this.name+"今年"+this.age);
}
}
public class Test{
public static void main(String[] args){
Person per1=new Person("张三",18);
Person per2=new Person("小花",22);
per1=per2;//引用传递
per1.getPersonInfo();
per2.getPersonInfo();
}
}
内存分析:
输出结果:
由上面程序输出结果可以看出,引用传递使per1指向per2所指空间,故per1原所指空间便没有**任何栈空间指向,这种堆空间称为垃圾空间。**但JAVA中垃圾空间会不定期自动回收,但为了避免程序性能下降,建议不要产生无用空间。