Java面向对象编程
初识面向对象
面向过程思想
- 步骤清晰简单,第一步做什么,第二步做什么。
- 面向过程适合处理一些较为简单的问题。
面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题。
- 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
- 三大特性:封装,继承,多态。
类与对象的关系:
- 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。
- 对象是抽象概念的具体实例。
创建与初始化对象
使用new关键字创建对象。
使用new关键字创建对象的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:
- 必须和类的名字相同。
- 必须没有返回类型,也不能写void。
package oop.demo02;
public class Person {
String name;
//一个类即使什么都不写,它也会存在一个方法
//显示的定义构造器
public Person(){
this.name="松哥";
}
//只要有一个构造函数,默认构造函数就不会生效了
}
package oop.demo02;
public class Student {
//属性:字段
String name;
int age;
//方法
public void study(){
System.out.println(this.name+"在学习。");
}
}
package oop.demo02;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
//类是抽象的,需要实例化。
Student xiaoming = new Student();
Student xiaohuang = new Student();
xiaoming.name="小明";
xiaohuang.name="小黄";
xiaoming.study();
xiaohuang.study();
}
}
封装(数据的隐藏)
- 通常,因禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
代码练习:
package oop.demo03;
//类 private:私有
public class Student {
//属性私有
private String name; //名字
private int id; //学号
private char sex; //性别
//提供一些可以操作这个属性的方法
//提供一些public的get、set方法
//get 获得这个数据
public String getName(){
return this.name;
}
//set 给这个数据设置值
public void setName(String name){
this.name=name;
}
public int getId() {
return id;
}
//alt+insert 快捷生产get、set方法
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
package oop.demo03;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.setName("树梢的阳光");
System.out.println(student.getName());
}
}
继承
- 继承的本质是对某以批类的抽象。
- extands的意思是”扩展“。子类是父类的扩展。
- java中类只有单继承,没有多继承。
- 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
- 子类和父类之间,从意义上讲应该具有”is a“的关系。
代码练习:
package oop.demo04;
//在Java中,所有的类都默认直接或间接继承Object类。
//父类
public class Person {
public int money=10_0000_0000;
public int age;
public char sex;
protected String name="树梢的阳光";
public void say(){
System.out.println("说了一句话。");
}
}
package oop.demo04;
//Person的子类
//子类继承了父类,就会拥有父类的全部属性和方法,私有的东西 不能继承。
public class Student extends Person{
private String name="树梢的阳光的儿子";
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
package oop.demo04;
public class Application {
public static void main(String[] args) {
Student student = new Student();
// student.age=18;
// student.sxe='男';
// System.out.println(student.name+"\t"+student.sxe+"\t"+student.age);
student.test("树梢的阳光正版");
}
}
super注意点:
- super调用父类的构造方法,必须在构造方法的第一个。
- super只能出现在子类的方法或者构造方法中。
- super和this不能同时调用构造方法。
super vs this:
代表的对象不同
- this:本身调用者这个对象,调用自己类中的对象。
- super:代表父类对象的应用,调用的是父类中的对象。
前提
- this:没有继承也可以调用。
- super:只有继承了才能使用。
构造方法:
- this:本类的构造。
- super:父类的构造。
方法重写
- 前提:需要有继承关系,子类重写父类的方法。
- 方法名必须相同。
- 修饰符:范围可以扩大但不能缩小:public>protected>default>private
- 抛出的异常:范围可以被缩小不能被扩大。
代码练习:
package oop.demo05;
//重写都是方法的重写,和属性无关
public class B {
public static void test(){
System.out.println("B");
}
}
package oop.demo05;
public class A extends B{
public static void test(){
System.out.println("A");
}
}
package oop.demo05;
public class Application {
public static void main(String[] args) {
A a = new A();
a.test();
//父类的引用指向了子类
B b = new A();
b.test();
}
}
重写:
package oop.demo05;
public class A extends B{
@Override
public void test() {
System.out.println("A");
}
}
当改变子类中的输出值时,父类中的输出值也会改变。
重写跟静态方法无关。
多态
即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。
多态存在的条件
- 有继承关系。
- 子类重写父类方法。
- 父类引用指向子类对象。
- 注意:多态是方法的多态,属性没有多态性。
抽象类
接口
作用:
- 约束
- 定义一些方法,让不同的人实现
- 方法的修饰符是:public abstract
- 变量的修饰符是:public static final
- 接口不能被实例化,接口中没有构造方法
- implements可以实现多个接口
- 必须重写接口中的方法
内部类
在一个类的内部再定义一个类
成员内部类
- ```java package oop.demo09;
public class Outer { private int id; public void out(){ System.out.println(“这是外部类的方法”); }
public class Inner{
public void in() {
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性
public void getID(){
System.out.println(id);
}
}
}
-
```java
package oop.demo09;
public class Application {
public static void main(String[] args) {
//通过外部类来实例化内部类
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.getID();
}
}
静态内部类
- ```java package oop.demo09;
public class Outer { private static int id; public void out(){ System.out.println(“这是外部类的方法”); }
public static class Inner{
public void in() {
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性
public void getID(){
System.out.println(id);
}
}
}
-
局部内部类
-
```java
package oop.demo09;
public class Outer {
public void method(){
class Inner{
public void in(){
}
}
}
}
- 匿名内部类
构造器
构造器是一种特殊的方法,用来构造并初始化对象。
构造器的名字应该与类名相同。例如:Date类的构造器名为Date。要想构造一个Date对象,需要再构造器前面加上new操作符,例如:
new Date()