1.初始面向对象
1.1面向对象&&面向过程
-
面向过程
-
步骤清晰简单,第一步做什么,第二部做什么……
-
面向过程适合处理一些较为简单的问题
-
睡觉:上床,盖被子,睡觉
- 面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,再对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,是和处理需要多人协作的问题!
人---->睡觉
- 对于面熟复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
1.2面向对象编程(Object-Oriented Programming,OOP)
-
本质:以类的方式组织代码,以对象的组织(封装)数据
-
一个比较抽象的概念
-
三大特性:
- 封装
- 继承
- 多态
-
从认知的角度考虑,是先有对象后有类。对象,是具体的事物;类是抽象的,对对象的抽象。
-
从代码运行角度考虑,现有类后有对象。**类是对象的模板**
2.方法回顾及加深
方法的定义
-
修饰符
- public
- static
- ……
-
返回类型
与返回值相对应
-
break 与 return的区别
-
break:跳出switch循环,结束循环
-
return 结束方法,返回一个返回值
-
-
**方法名:**注意规范即可!驼峰命名法!见名知意!
-
参数列表
参数类型,参数名。(可变参数)
-
异常抛出
方法的调用
-
静态方法:static
-
非静态方法
-
形参和实参
形式参数和实际参数的类型要相互队形
-
值传递和引用传递
- Java是值传递
public class Demo01 {
public static void main(String[] args) {
int x = 1;
System.out.println(x);//1
//java为值传递,将x传入函数中后,当前的x为10,当调用方法完之后,还是原来的值
//只是将10这个值丢给x了,并没有改变x的值
change(x);
System.out.println(x);//1
}
public static void change(int a){
a = 10;
}
}
- 引用调用传递
//引用传递: 传递一个引用类型即实例对象
public class Demo02 {
public static void main(String[] args) {
Student stu = new Student();
change1(stu);
System.out.println(stu.name);
}
public static void change1(Student stu){
stu.name = "dog";
}
}
class Student{
public String name;
}
- this关键字
- 可以再当前对象里调用当前这个对象的方法及属性
3.对象的创建分析
-
类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物
-
对象是抽象概念的具体实例
- eg:张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例
- 能够体现出特点,展现出功能的是具体的实例
-
使用new关键字创建对象
-
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象,进行默认的初始化以及对类中构造器的调用
-
构造器
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
-
作用
-
new的过程,实质是再调用构造方法
-
初始化对象的值
-
-
注意点
-
定义有参构造之后,如果想使用午餐构造,显示的定义一个无参的构造
小结
-
类与对象
- 类是一个模板:类是一个抽象的
- 对象是类的一个实例,将类具体化
-
方法
- 掌握定义和调用
-
对应的引用
-
引用类型;基本类型(8种)
-
对象都是引用类型
-
对象是通过引用来操作的:栈–>堆
-
类的属性(字段,成员变量)
-
默认初始化
- 数字:0,0.0
- char: u0000
- boolean:false
- 引用: null
-
修饰符 属性
-
-
-
对象的创建和使用
-
必须使用new关键字创造对象,构造器。Person teacher = new Person();
-
对象的属性 teacher.name;
-
对象的方法:teacher.sleep;
-
-
类:
- 静态的属性 属性
- 动态的行为 方法
- 每个类都只有方法和属性!!!
4.面向对象三大特性
封装、继承、多态
4.1封装
-
高内聚,低耦合
- 高内聚:一个方法尽可能做一件事,并且可以最大化复用
- 低耦合:方法与方法之间,模块模块之间之间尽量不要相互影响
-
封装实现的是数据的隐藏
- 通常禁止直接访问一个对象的数据的实际表示,而应该通过操作接口来访问,为信息的隐藏
-
属性私有,通过get/set去访问属性
-
作用:
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口(get/set)
- 系统可维护增加
4.2继承
**Java中类的继承只有单继承,没有多继承!!!**一个儿子只有一个爸爸!一个爸爸可以有多个儿子!!!
子类即是父类
-
object类
它是Java中所有类的根类,祖先!
所有的类都默认直接或者间接继承了object类
-
super
- 调用父类的一些属性或者方法。私有属性和方法无法被调用!!!
- 子类的构造方法默认第一步执行父类的无参构造方法。且必须放在子类的第一行!!!父类如果没有无参构造方法,必须调用父类的有参构造方法!!!
- super只能出现在子类的方法或者后遭方法中
VS this
-
代表的对象不同
- this代表当前对象
- super代表父类对象
-
前提
- this 没有继承也可以使用
- super只有在继承条件下才可以使用
-
构造方法
- this() 本类的构造
- super() 父类的构造
//父类
public class Person {
private String name;
public Person(String name){
this.name = name;
}
}
//子类
public class Student extends Person{
private int age;
public Student(int age){
this.age = age;
}
}
- 方法重写
必须要有继承关系!方法名相同,参数列表相同,方法体不一样
- 静态方法和非静态方法重写有很大区别
//A继承B
A a = new A();
B b = new A();
/*
静态方法:调用方法只和左边的对象有关
非静态方法:调用方法只和右边的对象有关
*/
-
修饰符:范围可以扩大,但不能缩小
-
抛出的异常:范围可以被缩小 但是不能被扩大
-
意义:
父类的功能子类不一定需要,或者不一定满足
4.3多态
- **概念:**同一个方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但是可以指向对象的引用的类型有很多
//实际类型均为Student 指向的引用类型却一个为Student一个为Person
Person person = new Student();
Student student = new Student();
//Student继承了Person且Student重写了Person的run方法
person.run();
student.run();
//均为调用子类student的方法
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不太大,优先执行子类重写的方法
- 子类调用的方法都是自己的或者继承父类的!
- 父类 可以指向子类,但是不能调用子类独有的方法!即可以调用子类重写的方法
- 注意事项
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系,可以类型转换。毫无关系的两个对象类型转换会报错:ClassCastException
- 存在条件:继承关系,方法需要重写,父类引用类型指向子类。
- 有些方法不能被重写
- static方法 属于类,不属于实例
- final 常量;
- private方法 私有!
4.4instanceof 和 类型转换
-
instanceof
判断一个对象是什么类型
Student s1 = new Student();
Person s2 = new Student();
Object s3 = new Student();
System.out.println("s1 instance Student");//true
System.out.println("s2 instance Teacher");//编译报错
System.out.println("s1 instance Person");//true
System.out.println("s1 instance Object");//true
System.out.println("s3 instance String");//编译报错
System.out.println("==================");
System.out.println("s2 instance Student");//true
System.out.println("s2 instance Teacher");//false
System.out.println("s2 instance Person");//true
System.out.println("s2 instance Object");//true
System.out.println("s3 instance String");//编译报错
System.out.println("==================");
System.out.println("s3 instance Student");//true
System.out.println("s3 instance Teacher");//false
System.out.println("s3 instance Person");//true
System.out.println("s3 instance Object");//true
System.out.println("s3 instance String");//false
-
类型转换
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型;自动
- 把父类转换为子类,向下转型;强制转换
- 方便方法的调用,减少重复的代码!
-
详解static方法
-
静态代码块:只执行一次!!!
-
匿名代码块:赋初值
-
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();
}
}
输出结果:
ps:静态导入包~
import static java.lang.Math.random;
import static java.lang.Math.PI;
//可以直接使用PI 和random()函数
5.抽象类和接口
-
抽象类
- abstract关键字实现
- 可以写抽象方法和普通方法
- 被继承的类必须要实现它的所有抽象方法
- abstract关键字实现
-
接口
- interface
- 接口的方法只会有抽象方法和静态方法
- 方法名默认有public、abstract修饰
- 属性会有默认的public,static,final修饰
- 接口侧面实现了java的多继承!!!
- interface
6.内部类
- 成员内部类
- 局部内部类
- 静态内部类
- 匿名内部类
public class User {
private String name;
private int ID;
//成员内部类
public class Uesr_son{
public void getName()
{
System.out.println(name);
}
}
//局部内部类
public void run(){
class User_son{
}
}
//静态内部类
static class USer_son{
}
public static void main(String[] args) {
new User().run();//匿名内部类
User user = new User();
Uesr_son son = user.new Uesr_son();//创造成员内部类的实例
}
}