九、Java面对对象
面向对象编程(OOP)
java的核心思想
面向过程
思想:
- 步骤清晰简单,第一步做什么,第二步做什么...
- 适合处理一些较为简单的问题
面向对象
-
思想:
-
分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考,最后,对分类下的细节进行面向过程的思索
-
适合处理复杂的问题,多人协作的问题
-
-
本质:以类的方式组织代码,以对象的组织(封装)数据
-
抽象
-
三大特性:
-
封装
-
继承
-
多态
-
方法回顾
方法定义
- 修饰符 public
- 返回类型 void、 int、 String
- break和return的区别 break:跳出switch 结束循环 return:方法结束,返回一个结果
- 方法名 :见名知意 驼峰命名法
- 参数列表
- 异常抛出
方法调用
-
静态方法
-
非静态方法
//静态方法 static 和类一起加载的 直接调用其他类的方法 //非静态方法 实例化类后调用 -
形参和实参
-
值传递和引用传递
引用传递:对象,本质还是值传递
值传递:传递过去改变,本身值不会改变
-
this关键字
类与对象的关系
- 类是一种抽象的数据类型
- 对象是抽象概念的具体实例
创建对象
类是抽象的
类实例化后(new)会返回一个自己的对象
-
使用new关键字创建对象
-
使用new关键字创建的时候,除了分配内存空间外,还会给创建好的对象进行默认初始化以及对类中构造器的调用
-
也称为构造方法,是创建对象必须要调用的,并且构造器有两个特点
-
构造器
-
必须与类名相同
-
必须没有返回类型,也不能写void
-
-
作用
- new本质是在调用构造方法
- 初始化对象的值
-
注意点
- 定义有参构造之后,想使用无参构造,必须显示的定义一个无参构造
-
Alt+Insert快速构造
创建对象内存分析

小结
1、类与对象
类是抽象的 对象是一个具体的实例
2、方法
定义和调用
3、对应的引用
引用类型:除基本类型(8)
对象通过引用来操作的:栈里面的 真实对象是在堆里的
4、属性:成员变量
默认初始化:
数字:0 0.0
char:u0000
boolean:false
引用类型:null
修饰符 属性类型 属性名= 属性值
5、对象的创建和使用
- 必须使用new关键字创造对象 构造器
- 对象的属性
- 对象的方法
6、类:
静态的属性
动态的行为
封装
高内聚, 低耦合
类的内部数据细节由自己完成, 尽量暴露少量的方法给外部使用
属性私有 get/set
意义:
- 提高程序安全性
- 隐藏代码实现细节
- 统一接口
- 系统可维护性
package com.oop.demo03;
public class Student {
//属性私有
private String name;
private int id;
private char sex;
//提供一些可以操作这个属性的方法
//提供一些public 的get、set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
继承
extends
本质是对某一批类的抽象
子类继承了父类,就会有父类的所有方法(public)
Object
在java中所有的类都默认继承Object类
//public 公共的
//private 私有的 属性一般是私有的
//protected 受保护的
//default 默认的
Ctrl+H显示类的继承结构
Java中只有单继承,没有多继承!一个儿子只能有一个爸爸,一个爸爸可以有多个儿子
super
- super调用父类的构造方法,必须在构造方法中的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造方法
this和super区别
代表对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提:
this:没有继承也能使用
super:只能在继承条件下才能使用
构造方法:
this():本类的构造
super():父类的构造
私有的无法被继承
父类
package com.oop.demo04;
//人
public class Person {
//public 公共的
//private 私有的 属性一般是私有的
//protected 受保护的
//default 默认的
protected String name="woman";
public Person() {
System.out.println("父类的无参构造");
}
public void say(){
System.out.println("说了一句话");
}
}
子类
package com.oop.demo04;
//学生 人
public class Student extends Person{
private String name ="dy";
public Student() {
super();//super和this只能写一个 并必须放在第一行,定义有参构造要把无参构造也显示出来
System.out.println("子类的无参构造");
}
public void say(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
main函数
package com.oop;
import com.oop.demo04.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say("小红");
}
}
方法重写:重点——>多态
需要有继承关系
子类重写父类的方法(只有方法,不能属性)
方法名必须相同,参数列表必须相同
修饰符:范围可以扩大,不能缩小
抛出的异常:范围可以被缩小,但不能扩大
子类和父类方法必须一直,方法体不同
为什么要重写:
- 父类功能,子类不需要,或者不满足 Alt+Insert :Override

多态
动态编译:类型:可扩展性
-
多态是方法的多态,属性没有多态
-
父类和子类,有联系 类型转换异常 ClassCastException
-
存在的条件:继承关系,方法需要重写,父类引用指向子类对象 father f1 = new Son()
不能重写的有:
static 方法。属于类,不属于实例
final 常量 无法改变 在常量池里
private
instanceof 和类型转换
- 父类引用指向子类对象
- 把子类转换为父类,向上转型;
- 把父类转换为子类,向下转型,强制转换
- 方便方法调用,减少重复的代码
父类
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
子类
package com.oop.demo06;
public class Student extends Person{
public void go(){
System.out.println("go");
}
}
main
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
import com.oop.demo06.Teacher;
public class Application {
public static void main(String[] args) {
Object object = new Student();
System.out.println(object instanceof Object);
System.out.println(object instanceof Person);
System.out.println(object instanceof Student);
System.out.println(object instanceof Teacher);
System.out.println(object instanceof String);
System.out.println("================");
Person person = new Student();
System.out.println(person instanceof Object);
System.out.println(person instanceof Person);
System.out.println(person instanceof Student);
System.out.println(person instanceof Teacher);
//System.out.println(person instanceof String);
System.out.println("================");
Student student = new Student();
System.out.println(student instanceof Object);
System.out.println(student instanceof Person);
System.out.println(student instanceof Student);
//System.out.println(student instanceof Teacher);
//System.out.println(student instanceof String);
//低转高的 直接转 高转低的 需要强转
//高 低
Person ps = new Student();
//将person转换为student类型 可以使用student类型的方法
Student ps1 = (Student) ps;
ps1.go();
//子类转换为父类 会丢失方法
Student sd = new Student();
Person sd1=sd;
}
}
static
package com.oop.demo07;
public class Person {
{
//代码块(匿名代码块) 执行在构造方法前
//赋初始值
System.out.println("匿名代码块");
}
static {
//静态代码块
//类一加载,就执行一次 第一个执行
System.out.println("静态代码块");
}
public Person() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Person p1=new Person();
System.out.println("=======");
Person p2=new Person();
}
}
返回结果
静态代码块
匿名代码块
构造方法
=======
匿名代码块
构造方法
Process finished with exit code 0
抽象类
abstract 抽象类 子类继承它并实现抽象类中的抽象方法 extends 单继承
类为单继承 接口可以多继承
- 不能new抽象类,只能靠子类去实现
- 抽象方法必须在抽象类中,抽象类中可以写普通方法
抽象类
package com.oop.demo08;
//抽象类:类 extend:单继承 类是单继承 接口可以实现多继承
public abstract class Action {
//只有方法名,没有具体实现
public abstract void doSomething();
//1.不能new抽象类,只能靠子类去实现:约束
}
子类
package com.oop.demo08;
//抽象类的所有方法,子类都必须帮其实现 除非子类也是抽象的
public class A extends Action{
@Override
public void doSomething() {
System.out.println("do");
}
}
接口的定义与实现
普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有
接口:只有规范 interface
接口的本质是契约
作用:
- 接口是一种约束
- 定义一些方法,让不同的人实现
- public abstract 方法
- public static final 属性
- 接口不能实例化,接口中没有构造方法
- 一个类可以实现多个接口 implement
- 类必须要重写接口中的方法
接口timer
package com.oop.demo09;
public interface TimeService {
void timer();
}
接口user
package com.oop.demo09;
//接口需要有实现类
public interface UserService {
//常量, public static final修饰
int AGE=99;
//接口中所有定义都是抽象的 public abstract
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
实现类
package com.oop.demo09;
//类可以实现接口
//实现了接口的类,就需要重写接口的方法
//接口可以实现多继承
public class UserServiceImpl implements UserService,TimeService{
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
@Override
public void timer() {
}
}
内部类
在一个类内部在定义一个类

浙公网安备 33010602011771号