oop面向对象
1.类
# 1.1什么是类
-
Class 类名{} 类名必须符合命名规则
在同一个java文件中,可以创建多个不同类名的类,但是只能有一个public修饰的主类,用public修饰的类名必须与java文件的名字一致。创建一个学生类 class Student{ } 创建属性 可以赋值可以不赋值 //属性部分 String name; int age; String sex="男"; int sid; //创建一个学生对象 必须在main方法中 Student stu =new Student();//在堆内存中创建
调用对象的属性 对象名.属性名
1.1.1属性
- 属性称为静态部分, 变量数据类型
属性定义:用来描述对象或者类,数据类型可以使基本数据类型,也可以是引用数据类型,一个类可以被另外一个类当做属
性来引用,被引用的类就是该类的属性 - 全局属性
全局变量归整个类所有,它会给默认值,全局变量可以被当前所有的非静态static方法所调用。 - 局部属性
局部属性要想使用必须要先赋值才能使用,没有默认值作用于只在局部中,当局部变量和全局变量名字相同时候,采用局部优先原则。
#1.2方法
1.21构造方法
就是用来创建对象的时候用的
-
无参构造方法
b.无参数构造方法 创建对象的时候不赋值
public 类名(【无参数】){ java代码}
当类中没有任何构造方法的时候,会有一个默认的无参数构造方法,但是一旦类中有了有参数构造方法,就不会再有默认无参数构造方法。如果你在类中写了有参数构造方法,就一定要把无参数构造方法也显示的写出来。 -
有参构造方法
public 类名(【参数】){ java代码}
参数怎么写:变量 变量的类型 名字
a.有参数构造方法 是在new对象给对象赋值,给对象的属性赋值。如果类中没有属性就不能创建有参数构造方法,参数的个数可以是多个。不要超过属性的个数。 参数的名字可以与你要赋值的属性的名字一致,如果一致的话必须使用this关键字来进行参数和属性的区分。如果不用this就必须将参数的名字和属性的名不一样,但是参数的类型必须与要赋值的属性一致。 -
构造方法的调用
在创建对象的时候根据有没有传参数来调用
new Person(); 根据你空号中是否传值,不传值代表调用的是无参数构造方法
如果传参数:根据参数的个数调用对应有参数构造方法,实际传的参数的类型必须与你要使用的有参数构造方法的参数类型以及类型的顺序一致
1.2.2方法的创建
【访问限定符】 【修饰符】 返回值类型 方法名(【参数…】){方法体 java代码}
- 访问限定符
- 默认访问限定
- public访问限定 公共的
- private(私有的)访问限定
- protected(保护的)访问限定 保护的就是自己在其他类中不能 被直接调用。 可以被继承但是不能被直接调用
不同包的不同子类是指一个类继承另一个类,利用import关键字进行导包
-
修饰符
-
static 静态修饰
-
可以使用static进行属性和方法的修饰
Static 数据类型 属性名; 静态属性 全局属性
非静态属性只能被非静态方法直接调用,静态属性可以被静态或非静态方法直接调用。
静态属性属于类的,非静态属性属于对象的。 -
Public static 返回值类型 方法名(【参数】){}
静态方法归类所有, 类名.方法名(【参数】);
非静态方法归对象所有。对象名.方法名(【参数】);静态方法也可以被对象进行调用package com.xingyun.static01; public class StaticShuXingDemo { //静态属性 static String name; int age; static { // name="张三"; StaticShuXingDemo ssd= new StaticShuXingDemo(); ssd.age=10; ssd.name="李四"; System.out.println("静态代码块被调用"); } //非静态方法 public void getName() { System.out.println(name);//静态属性可以被静态和非静态方 法直接调用 System.out.println(age); } public static int getAge() { // System.out.println(age);//报错 静态不能调用非静态属性 System.out.println(name); return 15; } public static void main(String[] args) { //调用静态方法 // StaticShuXingDemo.getAge(); // StaticShuXingDemo.getName(); // StaticShuXingDemo ssd=new StaticShuXingDemo(); // ssd.getName(); String str="ascfdvfbgbdf"; String str1=new String(str); System.out.println(str1.toUpperCase());}
-
-
final 最终
-
abstract 抽象
在创建抽象类时候或者抽象方法用的关键字
. -
返回值类型
有返回值(可以是任何类型:基本、引用),如果方法有返回值name必须使用return关键字并且返回的内容必须与返回值类型一致 无返回值void
1.2.3方法的使用
-
无返回值无参数
//没有参数没有返回值 public void student(){ System.out.println("我在学习"); }
在调用方法的时候,只会执行方法体中的java代码
-
无返回值有参数
//创建没有返回值有参数 public void student(String name){ System.out.println("我的名字是"+name); }
在调用方法的时候,需要传入与形式参数类型一样的实际参数。形式参数可以有多个,如果形参是多个的话,实际参数的个数以及参数类型必须一致。
-
有返回值无参数
public String sudent(){ //返回类型与定义类型一致 System.out.println("有返回值"); return name; }
在声明方法的时候,必须使用return关键字,并且必须放在方法体的最后一行。Return返回的内容必须与方法规定的返回值类型一致。如果没有return关键字程序就会报错。 调用方法的时候返回值可以不接收,可以直接使用输出语句输出。如果要接收返回值必须使用与返回值类型一样的变量进行接收。
-
有返回值有参数
//创建有返回值有参数的 public FangFa_01 study(FangFa_01 F){ System.out.println("我是第四种"); return F; }
在调用的时候需要传入对应的参数,使用return关键字。 参数的类型可以是类类型。
1.2.4代码块
-
代码块
{
代码块
}
代码块属于类所有,随着对象的创建被调用。每一次创建对象的时候都会被调用一次。 -
静态代码块
Static{
静态代码块
}
// 静态代码块
static{
System.out.println(“我是静态代码块”);
}
在程序启动类被加载到内存中的时候就会被调用,并且只调用一次。
1.2.5方法的调用
- 怎么调用?
如果方法是非静态的,那么需要是用new 对象
对象名.方法名(【参数】);
如果是静态方法,直接使用类名.方法名
类名.方法名(【参数】);
String类是一个特例:可以不用new对象就可以直接调用它自己的非静态方法。是因为它有一个叫做字符串池的空间。
1.2.6对象的引用
-
一个类可以引用另外一个类。将另外一个类当做自己的属性进行引用
A类 package com.xingyun.demo01; public class AClass { //A对象引用B对象 作为自己的属性 BClass bc; public void study() { bc=new BClass(); //调用B对象的study bc.study(); } } B类 package com.xingyun.demo01; public class BClass { //B对象引用C对象 作为自己的属性 CClass cc; public void study() { cc=new CClass("王五"); //调用C对象的study 传入c对象的name值 cc.study(cc.name); } } C类 package com.xingyun.demo01; public class CClass { String name; public CClass(String name) { this.name = name; } public void study(String name) { System.out.println(name+"在学习"); } } 测试类 package com.xingyun.demo01; public class Test { public static void main(String[] args) { //实例化对象 创建对象 AClass ac=new AClass(); ac.study(); } }
2.面向对象的四大特征
# 2.1抽象
2.1.1抽象的定义
- 关键字abstract
- 抽象类不能被实例化
- 抽象类只能作为父类
- 抽象方法只能存在抽象类中,一个类中有一个方法为抽象方法,那么这个类就是抽象类
- 构造方法、静态(static)方法、最终(final)方法和私有(private)方法不能被声明为抽象的方法。构造方法不能是抽象的,抽象方法不能是私有的
- 一个抽象类中可以有一个或多个抽象方法,也可以没有抽象方法。
- 一个类如果继承了抽象类,那么就必须重写抽象中的所有抽象方法。重写抽象方法有具体的实现
#2.2封装
2.2.1封装的定义
- 我自己有的属性我不想让你其他人直接那过去用。我们自己写一些方法,如果你想用我的属性,那你可以通过我自己的方法来进行使用
获取属性
给属性赋值 - 对私有化属性进行封装
2.2.2封装的使用方法
-
封装就是使用方法来进行对属性的操作
-
封装就是使用方法来进行对属性的操作
一般封装的方法都称为get()和set()赋值,
每一个私有属性都对应的有一个get和一个set方法,方法的名是get或者set加上属性名字的首字母大写。Get 方法有返回值,且返回值的类型与属性的类型一致。 public int getAge() { return age; } Set方法没有返回值 但是有参数,参数的类型必须与属性的类型 一致。 public void setAge(int age ) { this.age=age; }
#2.3继承
2.3.1继承的定义
- 两个类拥有关系,使用extends关键。
Public class aa extends bb{} AA与BB是子父类关系。Aa是子类 BB是父类。
2.3.2继承的特点
-
只能是单继承 一个类中只能有一个直接父类。
-
一个类可以有多个子类
-
子类继承了父类就拥有父类的所有属性和方法
-
子类可以有自己的独有的属性和方法。
-
可以在子类中写一个和父类一样的方法,方法的重写:在两个类中(子父类),方法的名字和参数以及参数的类型、顺序、个数都一样。方法的返回值也必须一致
-
如果A类继承了B类,B类继承了C 。那么A类也就拥有了C类的所有属性和方法。
2.3.3关键字使用 -
super关键字
Super代表父类对象 代表当前对象的父类 ,在子类继承父类后创建构造方法的时候super关键字调用 -
this关键字
This代表当前对象
在使用方法的时候,一个类同时new出来多个实例对象,不同对象调用方法的时候,this代表不同的对象。
2.34object类
每一个类都继承自Object类
toString 返回对象的字符串表示形式 每一个对象在直接输出的时候默认调用object的toString。
#2.4多态
2.4.1同一个对象拥有多种状态
- 向上转型
子类转父类 Car cx = new JiaoCar();
编译时状态: 子类=子类
运行时状态: 子类=父类 将子类独有属性和方法进行隐藏 - 向下转型
父类转子类 JiaoCar jc = (JiaoCar)cx;
必须是进行向上转型之后的那个父类对象,进行强制转换赋值给子类对象。
转型之后就可以调用子类独有的属性和方法。 - instanceOf 判断两个是不是子父类
将向上转型时候得到的对象与父类对象进行比较,看看是否是同类型的对象。
boolean bool = cx instanceof Car;
2.4.2重写和重载
-
么有继承就没有多态
-
父类引用指向子类对象:父类可以调用父类
的方法,如果子类重写了父类的方法调用的是子类的重写方法 -
重写
子类中可以有与父类一样的方法,称为方法重写,在两个类中(子父类),方法的名字和参数以及参数的类型、顺序、个数都一样。方法的返回值也必须一致
-
重载
在同一个类中,返回类型相同,方法的名字相同,参数的个数,类型,顺序不一致。 -
import关键字
- import 包名.*; //可以使用包中所有的类
- import 包名.类名; //只装入包中类名指定的类
- 在程序中直接引用类包中所需要的类。其引用的一般格式是:
包名.类名
例如,可以使用如下语句在程序中直接创建一个日期对象:
java.util.Date date1 = new java.util.Date( );