一.类
面向对象程序设计(简称OOP),面对对象的程序是由对象产生的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分.
OOP是将数据放在第一位,然后在考虑操作数据的算法.
OOP的三大特征:继承 封装 多态
1.1类
(1). 类(class) 是构造对象的模板或者蓝图.
(2). 由类 构造(construct) 对象的过程称为创建类的实例.
(3).封装(encapsulation) 是将数据和行为组合在一个包中.
(4).对象中的数据称为 实例域(instance field).
(5).操纵数据的算法称为 方法(method).
(6).封装的 关键 在于绝对不能让类中的方法直接的访问其他类的实例域.
(7).所有的类都是来自 Object类 . 它是任何类的父类.所有类默认继承此类.
(8).在扩展一个已有的类时,这个扩展后的新类 具有 所扩展的类的 全部属性和方法.通过扩展一个类来建立另外一个类的过程称为 继承.
//创建类
class 类名 {
类体;
}
代码示例:
class Person {
public String name;//属性 成员变量 实例成员变量
public int age;
public String sex;
//行为
public void eat() {
System.out.println("吃饭!");
}
public void sleep() {
System.out.println("睡觉!");
}
}
定义了一个Peoson
类,这个类由属性和行为构成,属性有name
,age
,sex
,行为有eat
,sleep
.
1.2类的实例化
代码示例:
class Person {
public String name;//属性 成员变量 实例成员变量
public int age;
public String sex;
//行为 方法 成员方法 实例成员方法
public void eat() {
System.out.println("吃饭!");
}
public void sleep() {
System.out.println("睡觉!");
}
public void show() {
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person=new Person();
person.name="张三";
person.age=18;
person.sex="男";
person.eat();
person.sleep();
person.show();
Person person2=new Person();
Person person3=new Person();
}
}
- 一个类可以
new
多个对象 - 使用
.
来访问对象中的属性和方法.
下图是上面代码的存储方式:
1.3类的成员
类的成员包含:字段、方法、代码块、内部类和接口等.
1.3.1字段(field)
- 字段实在类中方法外部定义的变量.
- 如果一个对象的字段(成员变量)没有显式设置初始值,那么会被设置成一个默认的初值.
1.3.2方法(method)
用于描述一个对象的行为.
class Person {
public String name;//属性 成员变量 实例成员变量
public int age;
public String sex;
//行为 方法 成员方法 实例成员方法
public void eat() {
System.out.println("吃饭!");
}
public void sleep() {
System.out.println("睡觉!");
}
public void show() {
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person=new Person();
person.name="张三";
person.age=18;
person.sex="男";
person.eat();
person.sleep();
person.show();
}
}
此处的show方法,表示Person这个对象具有一个“自我展示”的行为.
方法中还有一种特殊的方法称为“构造方法”.
1.4static关键字
- static修饰的称为静态成员变量.存放在方法区.
- final修饰的称为常量,也称为实例成员变量.
- 在方法里面属于局部变量,存放在栈中,在类里面属于实例成员变量存放在堆中.
- 静态成员变量的访问( 类名.属性 ).
- 所有被static所修饰的不论是方法还是成员都不依赖于对象.
- 静态方法可以访问静态数据成员,并可以更改静态数据成员的值.
- 静态方法不能直接使用非静态数据成员或调用非静态方法.
1.5封装
private/ public
这两个关键字表示 “访问权限控制” .
代码示例
class Person {
//一般属性都是私有的
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
this("曹操!");
System.out.println("Person()");
}
public Person(String name) {
this.name=name;
System.out.println("Person(String)");
}
public Person(String name,int age) {
this.name=name;
this.age=age;
System.out.println("Person(String,int)");
}
public void show() {
System.out.println("name: "+name+" age: "+age);
}
}
public class TestDemo {
public static void main(String[] args) {
//会调用合适的构造方法
Person person=new Person();
//Person person2=new Person("李四");
//Person person3=new Person("张三",22);
//person.setAge(18);
//person.setName("李四");
// person.show();
//System.out.println(person.getAge());
System.out.println(person.getName());
}
}
//运行结果:
Person(String)
Person()
曹操!
初始化方式:
-
提供一系列的get set方法
-
构造方法: 实例化一个对象-》调用构造方法 new -----();
如果在实现类的时候,没有写构造方法,那么编译器会自动生成一个不带有参数的构造方法,但是如果自己写了一个不带有参数的构造方法,那么编译器将不会生成.
构造方法没有返回值.也能发生重载.**一个对象的生成分为两步:** 1.为对象分配内存 2.调用**合适的构造方法**不止一个
this代表当前对象的引用,构造方法执行完对象才产生.
this.成员方法(非静态)
this.成员变量(非静态)
this(); //是语法 通过this调用别的构造方法时,必须放第一行
代码示例
class Person {
private String name;
private int age;
}
public class TestDemo {
public static void main(String[] args) {
Person person=new Person();
System.out.println(person);
}
}
//运行结果
Person@1540e19d
如果直接打印对象的引用,在底层都会调用Object类中的toString()方法
重写toString方法:
class Person {
private String name;
private int age;
@Override //注解 重写 Object的toString方法
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class TestDemo {
public static void main(String[] args) {
Person person=new Person();
System.out.println(person);
}
}
//运行结果:
Person{name='null', age=0}