步骤简单清晰,第一步做什么,第二部做什么。。。
面对过程适合处理一些简单的问题
线性问题
对于描述复杂的事物,从宏观上把握,从整体上合理的分析,我们需要使用面向对象的思路来分析整体的系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
面向对象编程:oop
本质:以类的方式组织代码,以对象的组织(封装)数据。
抽象
三大特性:
从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
从代码运行的角度考虑是 先有类后有对象。类是对象的模板。
/*
修饰符 返回值类型 方法名(...){
//方法体
return 返回值;
}
*/
public String sayHello(){
return "hello,world";
}
public void hello(){
return ;
}
public int max (int a,int b){
return a>b?a:b;//三元运算符
}
return:结束方法,返回一个结果!
// 数组下标越界异常:Arrayindexoutofbounds
public void readFile(String file) throws IOException{
}
方法的调用 有两种,一般使用较多的是 非静态的方法。
package com.oop.demo01;
//学生类
public class Student {
//静态方法
public static void say(){
System.out.println("学生说话了");
}
}
package com.oop.demo01;
public class Demo02 {
//静态方法 static
public static void main(String[] args) {
Student.say();
}
package com.oop.demo01;
//学生类
public class Student {
//非静态方法
public void say(){
System.out.println("学生说话了");
}
}
package com.oop.demo01;
public class Demo02 {
//非静态方法
public static void main(String[] args) {
//实例化这个类 new
//对象类型 对象名= 对象值
Student student=new Student();
student.say();
}
}
public void a(){
b();
}
public void b(){
}
public static void a(){
b();
}
public static void b(){
}
//和类一起加载的
public static void a(){
b();
}
//类实例化 之后才存在
public void b(){
}
package com.oop.demo01;
//非静态方法
public class Demo03 {
public static void main(String[] args) {
int add= new Demo03().add(1,2);
System.out.println(add);
}
public int add(int a,int b){
return a+b;
}
}
package com.oop.demo01;
//静态方法
public class Demo03 {
public static void main(String[] args) {
//实际参数和形式参数的类型要对应!
int add= Demo03.add(1,2);
System.out.println(add);
}
public static int add(int a,int b){
return a+b;
}
}
值传递:复制一份
引用传递:新建一个快捷方式
package com.oop.demo01;
//值传递
public class Demo04 {
public static void main(String[] args) {
int a=1;
System.out.println(a);
Demo04.change(a);//1
}
//返回值为空
public static void change(int a){
a=10;
}
}
输出结果:1
package com.oop.demo01;
//引用传递:对象,本质还是值传递
public class Demo05 {
public static void main(String[] args) {
Perosn perosn=new Perosn();
System.out.println(perosn.name);//null
Demo05.change(perosn);
System.out.println(perosn.name);//哈哈
}
public static void change(Perosn perosn){
//perosn是一个对象:指向的---> Perosn perosn=new Perosn();这是一个具体的人,可以改变属性!
perosn.name="哈哈";
}
}
//一个类里面 只能一个 public class 但是可以有多个 class类
//定义了一个Perosn类,有一个属性:name
class Perosn{
String name;//null
}
package com.oop.demo02;
//学生类
public class Student {
//属性:字段
String name;//null
int age;//null
//方法
public void study(){
System.out.println(this.name+"在学习");
}
}
package com.oop.demo02;
//一个项目应该只存一个main方法
public class Application {
public static void main(String[] args) {
//类:抽象的,实例化
//类实例化之后会返回一个自己的对象!
//student对象就是一个Student类的具体实例!
Student student = new Student();
Student xiaoming = new Student();
Student xiaohong = new Student();
xiaoming.name="小明";
xiaoming.age=3;
System.out.println(xiaoming.age);
System.out.println(xiaoming.name);
xiaohong.name="小红";
xiaohong.age=4;
System.out.println(xiaohong.name);
System.out.println(xiaohong.age);
}
}
类中构造器 也称为构造方法,是在进行创建对象的时候 必须调用的。并且 构造器有以下俩个特点:
1.必须和类的名字相同
2.必须没有返回类型,也不能写 void
package com.oop.demo02;
//Java--->class
public class Person {
//一个类即使什么都不写,他也会存在一个方法(无参构造)
//显示的定义构造器
String name;
//实例化 初始值
//1.使用new关键字,必须要有构造器
//本质是在调用构造器
//2.用来初始化值
public Person(){
this.name="hahaha";
}
//有参构造 :一旦定义了有参构造,无参构造就必须显示定义
public Person(String name){
this.name=name;
}
}
//alt + insert 自动构造 构造器
//上述方法 默认的是 有参构造
//选择 Select None 则是构造的是 无参构造
/*
public static void main(String[] args) {
//new 实例化了一个对象
Person person = new Person("qzzz");
System.out.println(person.name);//hahaha
}
*/
堆里面都是对象;包括一部分方法区
栈里面都是 方法 和方法的引用
package com.oop.demo03;
public class Pet {
public String name;
public int age;
//无参构造
public void shout(){
System.out.println("叫了一声");
}
}
/*
public static void main(String[] args) {
Pet dog = new Pet();
dog.name="旺财";
dog.age=3;
dog.shout();
System.out.println(dog.name);
System.out.println(dog.age);
Pet cat = new Pet();
}
*/
package com.oop;
import com.oop.demo02.Person;
import com.oop.demo03.Pet;
public class Application {
public static void main(String[] args) {
/*
1.类与对象
类是一个模板:抽象,对象是一个具体的实例
2.方法
定义、调用!
3.对应的引用
引用类型:基本类型(8)
对象是通过引用来操作的:栈--->堆
4.属性:字段Field 成员变量
默认初始化:
数字:0 0.0
char: u0000
boolean:false
引用:null
修饰符 属性类型 属性名 = 属性值!
5.对象的创建和使用
-必须使用new 关键字创造对象,构造器 Person kk=new Person();
-对象的属性:kk.name
-对象的方法:kk.sleep()
6.类:
静态的属性 属性
动态的行为 方法
‘封装、继承、多态’
*/
}
}
package com.oop.demo04;
//类 private:私有
public class Student {
//属性私有
private String name;//名字
private int id; //学号
private char sex; //性别
private int age; //年龄
//提供一些可以操作的方法!
//提供一些public的get、set方法
//get 获得这个数据
public String getName(){
return this.name;
}
//set 给这个数据设置值
public void setName(String name){
this.name=name;
}
// alt + insert自动生成get、set方法
//或者 在导航栏 Code处 找到 Generate 处 即可
//Getter and Setter 一栏
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>120||age<0){//不合法
this.age = 3;
}else {
this.age=age;
}
}
}
package com.oop;
import com.oop.demo04.Student;
/*
1.提高程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统可维护性增加了
*/
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("天");
//判断两个方法是否相同:
//1.方法名;2.参数列表
System.out.println(s1.getName());
s1.setAge(999);//不合法的
System.out.println(s1.getAge());
}
}
该露的露,该藏的藏
封装(数据的隐藏)
记住这句话:属性私有,get/set
多用于 属性 ,针对方法比较 少
外部不可以直接访问,通过内部的方法访问调用一个接口
//提供一些可以操作的方法!
//提供一些public的get、set方法
//get 获得这个数据
public String getName(){
return this.name;
}
//set 给这个数据设置值
public void setName(String name){
this.name=name;
}
Student s1 = new Student();
s1.setName("天");
System.out.println(s1.getName());
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>120||age<0){//不合法
this.age = 3;
}else {
this.age=age;
}
s1.setAge(999);//不合法的
System.out.println(s1.getAge());
1.方法名;
2.参数列表;
alt + insert自动生成get、set方法
或者 在导航栏 Code处 找到 Generate 处 即可
Getter and Setter 一栏
本质是对某一批类的抽象,从而实现对现实世界更好的建模。
extends的意思是“扩展”。子类是父类的扩展。
JAVA中类只有单继承,没有多继承! 一个儿子只有一个爸爸,一个爸爸可以有多个儿子。
继承是类与类之间的关系。除此之外,类与类之间的关系还有依赖、组合、聚合等。
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
子类和父类之间,从某种意义上来说应该具有“is a”的关系
object类
super
方法重写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CuKMXRJK-1645280551616)(C:\Users\PC\Desktop\面向对象\7.png)]
package com.oop.demo05;
//Person 人 :父类
public class Person {
}
package com.oop.demo05;
// 学生 is 人 :派生类,子类
public class Student extends Person{
}
package com.oop.demo05;
//Teacher is 人 :派生类,子类
public class Teacher extends Person {
}
//public 公共的
//private 私人的
//default 默认的 (可以不用写)
//protect 受保护的
package com.oop.demo05;
//Person 人 :父类
public class Person {
//四种修饰符
//public 公共的
//private 私人的
//default 默认的
//protect 受保护的
private int money =10_0000_0000;
public void say(){
System.out.println("说了一句话!");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
package com.oop.demo05;
// 学生 is 人 :派生类,子类
//子类继承了父类,就会拥有父类的全部方法
public class Student extends Person{
}
package com.oop;
import com.oop.demo05.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say();
System.out.println(student.getMoney());
}
}
Ctrl+H
在java中,所有的类都默认直接或者间接继承object类。
在Person.java中 按 Ctrl+H 会出现继承框架
在Student.java中 按 Ctrl+H 会出现继承框架
私有的东西 无法被继承 private
super是可以获取上一类的属性
package com.oop.demo05;
//Person 人 :父类
//在java中,所有的类都默认直接或者间接继承object类
public class Person {
protected String name="kk";
public void print(){
System.out.println("Person");
}
}
package com.oop.demo05;
// 学生 is 人 :派生类,子类
//子类继承了父类,就会拥有父类的全部方法
public class Student extends Person{
private String name="hh";
public void print(){
System.out.println("Student");
}
public void text1(){
print();
this.print();
super.print();
}
public void text(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
package com.oop;
import com.oop.demo05.Person;
import com.oop.demo05.Student;
import javax.naming.Name;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.text("jj");
student.text1();
}
}
隐藏代码:默认调用了父类的无参构造
调用父类的构造器必须要在子类的第一行
public class Person {
public Person() {
System.out.println("Person无参执行了");
}
}
public class Student extends Person{
public Student() {
//隐藏代码:默认调用了父类的无参构造
//调用父类的构造器必须要在子类的第一行
//super();//this()一致,也要在都一行。故只能调用一种要么父类或者本类
System.out.println("Student无参执行了");
}
}
public class Application {
public static void main(String[] args) {
Student student = new Student();
}
}
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提
this:没有继承也可以使用
super:只能在继承的条件下才可以使用
构造方法
this();本类的构造
super();父类的构造
重写都是方法的重写;和属性无关
静态方法只能被继承,不能被重写
当出现 下面图中指示时才是重写,(圆圈c的)
package com.oop.demo05;
//继承
public class A extends B {
//Override 重写
@Override//注解:有功能的注释!
public void test() {
System.out.println("A=>test()");
}
}
package com.oop.demo05;
//重写都是方法的重写;和属性无关
public class B {
public void test(){
System.out.println("B=>test()");
}
}
package com.oop;
import com.oop.demo05.A;
import com.oop.demo05.B;
public class Application {
public static void main(String[] args) {
//静态方法和非静态方法区别很大!
// 静态方法 :
//方法的调用只和左边,定义的数据类型有关
//非静态:重写
A a = new A();
a.test();//A
//父类的引用指向了子类
B b = new A();//子类重写了父类的方法
b.test();//B
}
}
如:兔子是动物的子类,吃东西的方法到了兔子这里自然要重写
重写:需要有继承关系,子类重写父类的方法!
重写,子类的方法和父类必须一致;方法体不同!
父类的功能,子类不一定需要,或者不一定满足!
快捷键 Ctrl+O
动态编译:类型:可扩展性
同一方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态存在的条件
注意:多态是方法的多态,属性没有多态
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
package com.oop.demo06;
public class Student extends Person {
@Override //重写
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("ear");
}
}
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Student();
// new Person();
//可以指向的引用类型就不确定了
//父类的引用指向子类
//Student能调用的方法都是自己的或者继承父类的!
Student s1 = new Student();
//Person父类型,可以指向子类,但是不能调用子类独有的方法
Person s2 = new Student();
Object s3 = new Student();
s2.run();//子类重写了父类的方法,执行子类的方法
s1.run();
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
//s2.eat();不能调用
}
}
输出结果如下:
son
son
Process finished with exit code 0
多态是方法的多态,属性没有多态
父类和子类,有联系 ,否则 类型转换异常ClassCastException!
存在条件:继承关系,方法重写。子类重写了父类的方法,执行子类的方法
有些方法不能重写:
父类的引用指向子类的对象;Father f1=new Son();
判断一个对象是什么类型,并且两个类是否是父子关系
即用来判断两个类型是否相似,为后面的强制类型转换做铺垫
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>Person>Student
//Object>Person>Teacher
//Object>String
Object object = new Student();
//注意 object中的o大小写
//System.out.println(X instanceof Y); 能不能编译通过!
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Object);//true
System.out.println(object instanceof Teacher);//False
System.out.println(object instanceof String);//False
System.out.println("======================");
Person person=new Student();
System.out.println(person instanceof Student);//true
System.out.println(person instanceof Person);//true
System.out.println(person instanceof Object);//true
System.out.println(person instanceof Teacher);//False
//System.out.println(person instanceof String);//编译报错
System.out.println("======================");
Student student = new Student();
System.out.println(student instanceof Student);//true
System.out.println(student instanceof Person);//true
System.out.println(student instanceof Object);//true
//System.out.println(student instanceof Teacher);//编译报错
//System.out.println(student instanceof String);//编译报错
}
}
public class Teacher extends Person {
}
public class Student extends Person {
}
public class Person {
}
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) {
//类型之间的转化:基本类型转换 高低64 32 16 8
//父 子 高转低要强制转换
//高 低
//强制转换
Person obj=new Student();
//obj.go();出错! Person类里面没有go方法
//obj 将这个对象转换为Student类型,就可以使用Student类型的方法了!
Student student = (Student) obj;
student.go();
//或者((Student) obj).go();
//低转高 直接转换
//但是 子类转换为 父类 会丢失 一些方法
Student qaz = new Student();
qaz.go();
Person person=qaz;
//person.go()出错!
}
}
package com.oop.demo07;
//static:
public class Student {
private static int age;//静态变量 多线程!
private double score;//非静态变量
public void run(){
}
public static void go(){
}
public static void main(String[] args) {
//static对方法:
new Student().run();//非静态
Student.go();//静态
go();//静态
//static对类:
Student s1 = new Student();
//静态变量对于类,所有的对象(实例)所共享,当直接使用类去调用得到的话,说明这个变量是静态的
System.out.println(Student.age);
System.out.println(s1.age);
System.out.println(s1.score);
}
}
package com.oop.demo07;
public class Person {
/*
{
//代码块(匿名代码块)
作用:赋初始值
}
static {
//静态代码块
最早执行的,和类一块加载
只执行一次
}
*/
//静态 >匿名 > 构造
{
System.out.println("匿名代码块");
}
static {
System.out.println("静态代码块");
}
public Person(){
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("===================");
Person person2 = new Person();
}
}
输出结果如下:
静态代码块 匿名代码块 构造方法 =================== 匿名代码块 构造方法 |
---|
package com.oop.demo07;
//静态导入包
import static java.lang.Math.PI;
import static java.lang.Math.random;
public class Test {
public static void main(String[] args) {
// 没有导入包之前
// System.out.println(Math.random());
System.out.println(random());//导入包之后
System.out.println(PI);
}
}
final常量 修饰类的话,就不能被继承了(断子绝孙)
package com.oop.demo08;
//abstract 抽象类:类 extends:单继承 (接口可以多继承)
public abstract class Action {
//约束~有人帮我实现~
//abstract,抽象方法,只有方法名字,没有方法的实现!
public abstract void doSomthing();
}
package com.oop.demo08;
//子类继承抽象类,那么就必须实现抽象类没有实现的抽象方法(重写),
// 否则该子类也要声明为抽象类。
public class A extends Action {
@Override
public void doSomthing() {
}
}
普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有!
接口:只有规范!自己无法写方法专业的约束!约束和实现分离:面向接口编程
接口就是规范,定义是一组规则,体现在现实世界中“如果你是。。。则必须能。。。”的思想。如:如果你是汽车,则必须能跑。接口的本质是契约。
声明类的关键字是class,声明接口的关键字是interface
package com.oop.demo09;
public interface TimeService {
void timer();
}
package com.oop.demo09;
//抽象的思维~Java 架构师
//interface 定义的关键字
public interface UserService {
//接口中的所有定义其实都是抽象的 public abstract
//接口一般都有个实现类
//常量~接口里面的常量都是 公共的静态的常量
int AGE=99;
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
package com.oop.demo09;
//类 可以实现接口 通过关键字 implements 接口
//实现了接口的类,就需要重写接口中的方法
//多继承~利用接口实现多继承~
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() {
}
}
package com.oop.demo10;
public class Outer {
private int id=10;
public void out(){
System.out.println("这是外部类的方法");
}
public class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性~
public void getID(){
System.out.println(id);
}
}
}
package com.oop;
import com.oop.demo10.Outer;
public class Application {
public static void main(String[] args) {
//new
Outer outer = new Outer();
//通过外部类来实例化内部类~
Outer.Inner inner = outer.new Inner();
inner.in();
inner.getID();
}
}
输出结果如下:
这是内部类的方法 10 |
---|
public class Outer {
//局部内部类
public void method(){
class Inner{
public void in(){
}
}
}
}
package com.oop.demo10;
public class Test {
public static void main(String[] args) {
//没有名字 初始化类 不用加实例保存在变量中~
new Apple().eat(); // Apple apple = new Apple();
UserService userService=new UserService(){
@Override
public void hello() {
}
};
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}
interface UserService{
void hello();
}
;
public void out(){
System.out.println(“这是外部类的方法”);
}
public class Inner{
public void in(){
System.out.println(“这是内部类的方法”);
}
//获得外部类的私有属性~
public void getID(){
System.out.println(id);
}
}
}
```java
package com.oop;
import com.oop.demo10.Outer;
public class Application {
public static void main(String[] args) {
//new
Outer outer = new Outer();
//通过外部类来实例化内部类~
Outer.Inner inner = outer.new Inner();
inner.in();
inner.getID();
}
}
输出结果如下:
这是内部类的方法 10 |
---|
public class Outer {
//局部内部类
public void method(){
class Inner{
public void in(){
}
}
}
}
package com.oop.demo10;
public class Test {
public static void main(String[] args) {
//没有名字 初始化类 不用加实例保存在变量中~
new Apple().eat(); // Apple apple = new Apple();
UserService userService=new UserService(){
@Override
public void hello() {
}
};
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}
interface UserService{
void hello();
}