JAVA类和对象
一、概述
1.面向对象
- 面向对象编程的本质:以类的方式组织代码,以对象的组织(封装)数据。
- 面向对象编程的特点是抽象。
- 面向对象编程三大特征是封装,继承,多态。
- JAVA是一门面向对象编程的语言。
2.类与对象
- 先有类后有对象,类是对象的模板。
- 类是抽象的数据类型,即引用类型。
- 举例说明类是抽象的数据类型,如人是对总体人类的抽象概述,而每一个人可称为实例对象,而该人的身高,体重等为该对象的属性,该人的行为如走路,吃饭为该对象的方法。
3.抽象类、构造器私有的类和静态类
- 抽象类(abstract修饰的类)、构造器私有的类和静态类(static关键字修饰)均不能实例化对象。
- 抽象类可通过子类继承实现该抽象类内的方法。注意:抽象类与接口有很大的区别,主要在于抽象类可做方法声明也可做方法实现,而接口只能做方法实现。
- 静态类同样不能实例化对象,因静态类是全局的类,可通过类名直接调用静态类内属性和方法。
二、代码详解
1.创建与初始化对象
- 使用new关键字创建对象
类名 对象名 = new 类名(); 或 类名 对象名 = new 类名(参数);
例 person man = new person();
person为抽象类(引用数据类型),man为对象名(引用对象,存在于栈内存中),new person()为通过构造器(构造方法)初始化的实际对象,存在于堆内存中。
2.构造器(构造方法)
- 构造器是进行创建对象的时候必须调用的。
- 构造器必须和类的名字相同。
- 构造器无返回类型,也不能写void。
- 创建类是默认有无参且内部无任何执行语句的构造器,可通过重载构造器构建有参构造器和具有执行语句的构造器,且原默认构造器被隐藏。
- 类中可含多个构造器,且这些构造器必须满足方法重载条件。
重写构造器代码如下:
public class person {
String property;
public person(){
this.property = "属性";
}
public person(String property){
this.property = property;
}
}
三、三大特征
1.封装
- 封装,即禁止直接访问一个对象中数据的实际表示,而通过操作接口(此接口指对应的方法)来访问,也称为信息隐藏或数据隐藏。
- 学习封装请记住属性私有,通过对应get/set方法得到/修改属性。
public class person {
//属性私有
private String property;
//get,获取该属性
public String getProperty() {
return property;
}
//set,设置该属性的值
public void setProperty(String property) {
this.property = property;
}
}
2.继承(extands)
- 继承是类与类之间的一种关系。
- 继承关系的两个类,一个为子类(派生类),一个为父类(基类);子类继承父类,使用关键字extends来表示
- 子类包含父类中所有属性和方法
- 子类可以通过super关键字来访问父类中非私有属性和方法,包括已被重写的方法
父类
public class person {
String property = "属性";
public void init(){
System.out.println("这是父类");
}
}
子类
public class sonperson extends person{
@Override
public void init() {
System.out.println(super.property);
super.init();
System.out.println("这是子类");
}
}
3.多态
- 多态指同一个方法根据指向对象的引用不同而采取多种不同的行为方式,注意多态是方法的多态,属性没有多态性。
- 多态存在条件
1.有继承关系
2.子类重写父类方法
3.父类引用指向子类 - 父类可以指向子类,但不能调用子类独有的方法;子类调用自己或继承父类的方法。
- 父类引用对象可强制性转换子类引用对象。
父类
public class person {
String property = "属性";
public void init(){
System.out.println("这是父类");
}
}
子类
public class sonperson extends person{
@Override
public void init() {
System.out.println("这是子类");
}
public void run(){
System.out.println("子类独有方法");
}
public static void main(String[] args) {
//person类型,可以指向子类,但不能调用子类独有的方法
person man_1 = new sonperson();
//sonperson类型,调用自己或继承父类的方法
sonperson man_2 = new sonperson();
man_1.init();
man_2.init();
man_1.run(); //报错
((sonperson) man_1).run();// 强制性转换,报错解决
man_2.run();
}
}