面向对象
大纲
类与对象
面向对象与面向过程
面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软
件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显的显示出来,
出现了面向对象思想并成为目前主流的方式。两者都贯穿于软件分析、设计和开发各个阶段,对应面向对象就分别
称为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)。C语言是一种典型的面向过程语
言,Java是一种典型的面向对象语言。
类与对象的概念
对象:是具体的事物 xiaoming xiaohong
类:是对对象的抽象(抽象 抽出象的部分)Person 先有具体的对象,然后抽象各个对象之间象的部分,归纳出类通过类再认识其他对象。
自定义类与对象
自定义类
定义类(类的组成)
属性 field
方法 method
构造方法 construtor
其他:代码块 静态代码块 内部类
属性(field 成员变量)
属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。
在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
成员变量与局部变量的区别
1.声明位置不同 类中 方法中
2.作用范围不同: 当前类的方法 当前方法
3.不同的方法中即使有同名的局部变量,没有关系,互不影响,建议相同
4.内存存放的位置的:栈内存中 堆内存中
5.成员变量有默认值;局部变量没有默认值
类与类之间的关系
类之间大体分为6种关系:
在设计模式中类与类之间的关系主要有6种:依赖、关联、聚合、组合、继承,实现, 它们之间的耦合度依次增
加。
继承关系(Inheritance)
public class Person {
String name;
int age;
void move(){} }
//继承
class Student extends Person{
void study(){}
}
class Teacher extends Person{
void teach(){}
}
. 实现关系
interface Vehicle{
void move(); }
class Ship implements Vehicle{
void move(){ System.out.println("水里移动..");
}
}
class Ship Car Vehicle{
void move(){ System.out.println("陆地跑..");
}
}
依赖关系(Dependency)
public class Person {
public void drive(Car car){} //方法参数
}
class car{}
关联关系(Association)
public class Person {
public Address address; //关联关系
public void setAddress (Address address){
this.address= address;
}
public Address getAddress (){ return address;
}
}
class Address{}
聚合关系(Aggregation)
public class Team {
public Person person;
public Team(Person person){
this.person = person;
}
}
组合关系(Composition)
public class Person {
public Head head;
public Body body;
public Person(){
head = new Head();
body = new Body();
}
}
内存分析
内存划分 :
栈: • 存放:局部变量 • 先进后出,自下而上存储 • 方法执行完毕,自动释放空间
堆: • 存放new出来的对象 •
需要垃圾回收器来回收
方法区: • 存放:类的信息(代码)、 static变量、字符串常量等.
class Student{
String name;
Bithday birthday;
}
class Birthday{
int year;
int month;
int day;
}
public static void main(String[] args){
Student s=new Student();
s.name="zhangsan";
s.birthday.year=2010;
s.birthday.month=10;
}
//A:遍历int类型的数组 依次输出每个数组元素
public static void printArray(int[] arr){
//循环遍历数组下标
for(int i=0;i<arr.length;i++){
System.out.println("输出int类型数组的每一个元素"+arr[i]);
}
}
//B:逆序:倒叙输出数组元素
public static void printArr(String[] arr){
for(int i=arr.length-1;i>=0;i--){
System.out.println(arr[i]);
}
}
//C:最值:获取数组中的最大值和最小值
public static void maxMinValue(int[] arr){
//假设数组中的第一个元素当成最大值
int max=arr[0];
//假设数组中的第一个元素当成最大值
int min=arr[0];
//遍历数组
for(int i=0;i<arr.length;i++){
//比较数组元素与max
if(max<arr[i]){
max=arr[i];
}
//比较数组元素与min
if(min>arr[i]){
min=arr[i];
}
System.out.println("数组中最大的值为max"+max); System.out.println("数组中最小的值为min"+min);
}
}
构造方法(构造器 constructor)
构造器也叫构造方法(constructor),用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是
对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一
种特殊的方法
[修饰符] 类名(形参列表){
//n条语句
}
public Dog(){}
构造器4个要点:
构造器的方法名必须和类名一致!
构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类),不能在构造器里调用return。
通过new关键字调用!!
如果我们没有定义构造器,则系统会自动定义一个无参的构造方法。如果已定义则编译器不会添加无参数构
造方法!
与普通方法一样,构造方法也可以重载
修饰符 final abstract static不能用来修饰构造器
空构造
没有参数构造器叫做无参构造
- 一个类中,如果没有显式|手动 加入 任意构造器 javac 编译后 自动加入空构造
- 一旦加入构造器 ,javac 不会加入空构造器。
class Dog{
String color;
String name;
//空构造
//public Dog(){} 默认提供
}
重载
一个类中可以存在多个构造器
- 方法重载: 两同三不同 同一个类方法名相同,形参类型 个数 顺序不同
2.构造器重载: 只看形参即可 形参类型 个数 顺序不同。调用时按“就近最优原则”
class Dog{
String color;
String name;
//空构造
Dog(){}
public Dog(String name,String color){
this.name=name;
this.color=color;
}
public static void main(String[ ] args) {
Dog d1 = new Dog();
Dog d2 = new Dog("二狗子", "白色");
Dog d3 = new Dog("三狗子", "土色");
}
}
this关键字
this 即”自己”,代表对象本身,谁调用代表谁。在成员方法中或构造器中隐式的传递。作用如下: 1. this.属性避免属性和形参、局部变量同名,发生就近原则
2. this([实参列表]): 构造器的首行调用其他构造器。
class Web{
//网址
public String url;
public Web(){
System.out.println("构造器");
}
public Web(String url){
this(); //this()构造器的调用
this.url =url;//this.属性 区分同名问题
}
//赋值
public void setUrl(String url){
this.url =url;
}
/**
属性与形参 同名,发生就近原则
public Web(String url){ url =url; }
//二者不同名
public Web(String u){
url =u;
}*/ }
static关键字
凡是静态的都是属于类的,与对象无关的,先于对象存在的。可用于修饰属性、方法、块。
在类中,用static声明的成员变量为静态成员变量 ,或者叫做: 类属性,类变量.
它为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化,
对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!
可以使用”对象.类属性”来调用。不过,一般都是用“类名.类属性”
static变量置于方法区中!
用static声明的方法为静态方法
不需要对象,就可以调用(类名.方法名)
在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可直接访问非static的成员。但是可以通
过对象使用。
静态方法不能以任何方式引用this和super关键字
class StaticDemo01 {
static int id;//静态变量
int age; //成员变量
public static void main(String[] args) {
//静态的内容可以直接使用
System.out.println("id1="+id); //id1=0 System.out.println("id2="+StaticDemo01.id); //id2=0
test();
//通过对象使用成员
StaticDemo01 sd=new StaticDemo01(); System.out.println("age="+sd.age);//age=0
}
/**
静态方法
*/ public static void test(){
id++;
}
/*
* 成员方法 使用静态和非静态的内容
* */
* public void test2(){
* //非静态的方法中可以直接使用成员内容,可以通过对象使用
age++;
id++;
}
}
注意:
静态内容中只能直接使用静态内容,通过对象使用成员内容
成员内容中可以直接使用静态内容,可以直接使用成员内容,也可以通过对象使用