Java书写面向对象_Java面向对象

Java面向对象

面向对象 OOP object oriented programming

分类 的思维模式思考问题有哪些分类,然后对分类进行独立思考,细节的实现是面向过程的方法

适合出来复杂的问题,多人协作的问题

面向过程

第一步做什么,第二部做什么。。。

面向过程处理一些简单的问题

​ 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思想,来分析整个系统。但是具体到微观操作,仍需要面向对象的思路去处理。

面向对象编程的本质:

​以类的方式组织代码,以对象的组织(封装)数据

抽象 把个体的共同点抽取出来 变成一个类 。3

三大特性:

封装

继承

多态

Java类跟对象的关系

类 是一种抽象的数据类型,它是对某一类事物整体描述/定义,不能代表一个具体事物

对象 是抽象概念的具体实例

张三 就是一个具体实例

创建和初始化对象

使用new关键字创建的时候,除了分配内存空间外 还会给 创建好的对象 进行默认的初始化 以及对类中构造器的调用

类中的构造器也称为构造方法,是进行创建对象的时候必须调用的。并且构造器有以下两个特点:

必须和类的名字相同

必须没有返回类型,也不能写void

创建 学生类:

public class Student {

//属性:字段

String name;

int age;

//方法

public void study(){

System.out.println(this.name+"学生在学习");//this表示当前这个类

}

}

创建主类 ,实例化学生类,调用学生类的方法

//一个项目应该只存在一个main类

public class Application {

public static void main(String[] args) {

//类:抽象的,实例化

//类实例化后会返回一个自己的对象!

//Student对象就是 student 的具体实例

Student xiaoming = new Student();

Student xiaohua = new Student();

xiaoming.name = "小明";

xiaoming.age = 3;

xiaohua.name = "小红";

xiaohua.age = 3;

System.out.println(xiaoming.name);

System.out.println(xiaoming.age);

System.out.println(xiaohua.name);

System.out.println(xiaohua.age);

}

}

一个类即使什么都不写 也会存在一个构造器

Person.java文件

//java ---> class

public class Person {

}

Person.class文件 //默认生成一个构造器

public class Person {

public Person() { //构造方法

}

}

构造一个显示的构造方法

public class Person {

String name;

//创建一个无参构造器

//实例化初始值

//使用new关键字 本质是在调用构造器

public Person(){

//this.name = "lmw";

}

//有参构造:一旦定义了有参构造,无参构造就必须显示定义

public Person(String name){

this.name = name

}

}

调用有参构造器

public class Application {

public static void main(String[] args) {

//new 实例化一个对象

Person person = new Person("lmw");

}

}

创建对象内存分析

Application类

public class Application {

public static void main(String[] args) {

Pat dog = new Pat();

dog.name ="旺财";

dog.age = 3;

dog.shout();

System.out.println(dog.name);

System.out.println(dog.age);

}

}

输出:

叫了一声

旺财

3

Pet类

public class Pat {

public String name;

public int age;

//wucans1

public void shout(){

System.out.println("叫了一声");

}

}

16ef0b430e399046d15b00af9b67522c.png

加载Application 类 (main() 常量池)

首先执行main()方法。加载在栈的最底部。

new Pat 生成Pat的类(name,age,short() 常量池:)

生成对象Dog 在栈里面 只是一个变量名(引用)。

真正的dog对象在堆里面。根据Pat类生产一个dog对象,Pat类相当于模板。

赋值(name , age ,short调用Pat类short)

new cat重复3--->6

静态方法区static 和类一起加载。所有的对象都可以调用 static。

封装

“高内聚 , 低耦合”。

高内聚:类的内部数据操作细节自己完成,不允许外部干涉;

低耦合:仅暴露少量的方法给外部使用;

封装的意义:

提高程序的安全性,保护数据

隐藏代码的实现细节

统一接口

系统的可维护性增加了

Application 类

public class Application {

public static void main(String[] args) {

Student s1 = new Student();

s1.setName("lmw");

System.out.println(s1.getName());

s1.setAge(90);//不合法的年龄

System.out.println(s1.getAge());

}

}

Student 类

//类 private 私有

public class Student {

//属性私有 在主类中new的对象不能直接调用

private String name;//名字

private int age;

//提供一些可以使用这个属性的方法

//提供一些Public的get,set方法

//get 获得这个数据

public String getName() {

return this.name;

}

//set 给这个数据设置值

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

if (age > 120 || age < 0) {

this.age = 3;

} else {

this.age = age;

}

}

}

继承

某一个批次的抽象,从而实现对现实世界更好的建模

extands的意思是 ”扩展“ 子类是父类的扩展

Java只有单继承,没有多继承!

继承是 类与类 的一种关系。类与类之间的关系还有 依赖,组合,**聚合 **等。

继承关系的两个类,一个是子类(派生类),一个是父类(基类)。子类继承父类,使用关键字extends来表示。

子类和父类之间,从意义上讲应该具有”is a“的关系。

Application 类

public class Application {

public static void main(String[] args){

Students students = new Students();

students.say();

System.out.println(students.getMoney());

}

Person父类

//Person 人 父类

public class Person {

//修饰符 优先级 从上到下

//public

//protected

//default 不写 修饰符 是 默认的

//private 父类私有的 子类不能继承

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;

}

}

Student子类

//学生 is 人 继承了人 子类

//子类继承了 父类

public class Students extends Person {

}

Object 类

在Java中所有的类 都默认直接或间接继承 object类

e6f991f5666ba2e5d70e98c82dd9534a.png

Super类

注意点

89dece00d6b6746768572bf271a63754.png

Application类

public class Application {

public static void main(String[] args){

Students students = new Students();

students.test("www");

}

}

Person父类

public class Person {

protected String name = "kuangshem";

}

Students子类

public class Students extends Person {

private String name = "lwm";

public void test(String name){

System.out.println(name);//参数name

System.out.println(this.name); //lwm

System.out.println(super.name);//qingjiang

}

}

子类 默认调用 父类的 无参构造

父类里面写了有参构造 无参构造消失 子类就没办法写无参构造

所以一个类 要写有参构造 一般都 把无参构造重写

方法的重写

静态方法

//静态方法:方法的调用只和左边定义的数据类型有关。

//主类

public class Application {

public static void main(String[] args) {

A a = new A();

a.test();

B b = new A();

b.test();

}

}

//父类

public class B {

static void test(){

System.out.println("B=>test()");

}

}

//子类

public class A extends B{

static void test(){

System.out.println("A==>text");

}

}

输出:

A==>text

B==>test

非静态

public class Application {

public static void main(String[] args) {

A a = new A();

a.test();

//父类的引用指向了子类

B b = new A();//子类重写了父类的方法

b.test();

}

}

public class B {

public void test(){

System.out.println("B=>test()");

}

}

public class A extends B{

//override //重写

@Override//注释 : 有功能的注释

public void test() {

System.out.println("A=>text");

}

}

输出:

A=>text

A=>text

重写 : 需要有继承关系 子类重写父类的方法 (属性是不行的)

​方法名必须相同

​参数列表必须相同

​修饰符 :范围可以扩大

​抛出的异常 : 范围可以缩小, 不可以扩大

子类的方法和父类必须要一致 方法体不同

为什么需要重写?

子类不一定需要父类的功能或者不一定满足!

多态

同一 方法 可以根据 发送对象 的不同而采取多种 不同的行为方式

一个对象的 实际类型 是确定的,但是可以 指向对象 的 引用类型 有很多(父类,有关系的类)

多态是 方法的多态,属性没有多态

父类和子类, 有联系的类,否则类型转换异常! ClassCastException!.

多态 存在的条件:

继承关系

方法需要重写

父类的引用指向子类的对象!

​不能重写的方法

​static方法 属于类,不属于实例

​final 常量池

​private 方法

​这些没有办法重写,也就没办法实现多态!

public class Application {

public static void main(String[] args) {

//一个对象的实际类型是确定的

//可以指向的引用类型就不确定了:父类的引用指向子类

//Student 能调用的方法都是自己的或者继承父类的!!

Student s1 = new Student();

//Person 父类型,可以指向子类,但不能调用子类。

//执行Person 的方法, 和后面 无关,但是 父类的方法如果被重写,执行重写的方法

Person s2 = new Student();

//Object 默认的所有的父类

Object s3 = new Student();

((Student) s2).eat();//强转换

s1.run();

}

}

Person 父类

public class Person {

public void run(){

System.out.println("run");

}

}

Studnet 子类

public class Student extends Person{

@Override

public void run() {

System.out.println("son");

}

public void eat(){

System.out.println("eat");

}

}

Instanceof (类型转换) 引用类型

判断一个对象 是什么类型

Instanceof 可以判断是否是父子关系

public class Application {

public static void main(String[] args) {

//Object > Person > Student

Object object = new Student();

System.out.println(object instanceof Student);

System.out.println(object instanceof Person);

}

}

输出

True

True

类型转换

高转低需要强制类型转换

Person类型转为Student 类型 强制转换

Applicants 类

//Person类型转为Student 类型 强制转换

public class Application {

public static void main(String[] args) {

//类型之间的转换 : 父 ————> 子

Person obj = new Student();

//将obj对象 转换成Student类型,我们就可以用Student类型的方法了

((Student)obj).go();

}

}

Student 子类

public class Student extends Person{

public void go(){

}

}

Student类型转为Person类型 强制转换 可能损失方法

Applicants 类

//Person类型转为Student 类型 强制转换

public class Application {

public static void main(String[] args) {

//类型之间的转换 : 子 ————> 夫

Student obj = new Student();

obj.go;

Person person = obj;//子类转为父类 ,丢失自己本来的一些方法

}

}

Student 子类

public class Student extends Person{

public void go(){

}

}

Static 关键字详解:

//Static:

public class Student {

private static int age;//静态的变量 多线程!

private double score; //非静态的变量

public void run(){

go();

}

public static void go(){}

public static void main(String[] args) {

Student student = new Student();

System.out.println(Student.age);//静态变量,建议使用类名调用

System.out.println(student.age);

System.out.println(student.score);

go();//可直接调用 类中的 静态方法

student.run();//实例化后调用

}

Static 和静态代码块

public class Person {

//2:赋初值

{

System.out.println("匿名代码块");

}

//1:只执行一次

static {

System.out.println("静态代码块");

}

//3

public Person(){

System.out.println("构造方法");

}

public static void main(String[] args) {

Person person1 = new Person();

System.out.println("=========");

Person person2 = new Person();

}

}

输出:

静态代码块

匿名代码块

构造方法

=========

匿名代码块

构造方法

静态导入包

//静态导入包

import static java.lang.Math.random;

import static java.lang.Math.PI;

public class Test {

public static void main(String[] args) {

//直接引用

System.out.println(random());

System.out.println(PI);

}

}

抽象类

abstract

约束 有人帮实现方法

抽象方法,只有方法名字,没有方法的实现。

不能new这个抽象类,只能靠子类去实现它:约束!

抽象类中可以写普通方法

抽象方法必须在抽象类中

抽象的抽象 约束!

问题:

不能new 有 构造器吗?

抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super(参数列表)调用抽象类中的构造方法

接口

普通类:只有具体的实现

抽象类:具体实现和规范(抽象方法)都有

接口:只有规范

接口就只是规范, 定义的是一组规则。如果定义了汽车,就必须能四个轮子跑的

接口的本质是契约 约定好就得按照约定的去实现

接口中所有的定义都是抽象的 public abstract

Interface接口

//Interface 定义的关键字 接口都需要有实现类

public interface UserService {

//接口中的所有定义其实都是抽象的Public abstract

void add(String name);

void delete(String name);

void update(String name);

void query(String name);

}

TimeServi接口

public interface TimeService {

void timer();

}

实现类

//通过 Implement 实现接口 可以 Impl多个接口 抽象类 只能 被继承 一次

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() {

}

}

内部类

一个Java中可以有多个Class类 ,但是只能有一个Public class类

public class Outer {

private int id;

public void out(){

System.out.println("这是外部类的方法");

}

public class Inter{

public void in(){

System.out.println("这是内部类的方法");

}

//获得外部类的私有属性

public void GetID(){

System.out.println(id);

}

}

}

public class Application {

public static void main(String[] args) {

//new

Outer outer = new Outer();

//通过这个外部类来实例化内部类~

Outer.Inter inner = outer.new Inter();

inner.in();

}

}

输出:

这是一个内部类方法

局部内部类

写在方法里面

异常

最大范围的 异常

Throwable

Exception 运行事异常

1/0

ClassNorFound

NullPoint

UnknowType

下标越界异常

Error

AWT错误

JVM错误

StackOverFlow 栈溢出

OutOfMemory 内存溢出

处理异常

五个关键字

try{}

catch{} 范围先小后大

finally{}

throw 手动抛出异常

throws 方法抛出异常

自定义异常 继承Exception类即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值