面向对象深入

面向对象

大纲

在这里插入图片描述

类与对象

面向对象与面向过程
面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软
件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显的显示出来,
出现了面向对象思想并成为目前主流的方式。两者都贯穿于软件分析、设计和开发各个阶段,对应面向对象就分别
称为面向对象分析(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)

扫描二维码关注公众号,回复: 11086488 查看本文章
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不能用来修饰构造器

空构造
没有参数构造器叫做无参构造

  1. 一个类中,如果没有显式|手动 加入 任意构造器 javac 编译后 自动加入空构造
  2. 一旦加入构造器 ,javac 不会加入空构造器。
class Dog{ 
String color; 
String name; 
//空构造
 //public Dog(){} 默认提供 
 }

重载
一个类中可以存在多个构造器

  1. 方法重载: 两同三不同 同一个类方法名相同,形参类型 个数 顺序不同
    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++; 
} 
}

注意:
静态内容中只能直接使用静态内容,通过对象使用成员内容
成员内容中可以直接使用静态内容,可以直接使用成员内容,也可以通过对象使用

发布了22 篇原创文章 · 获赞 6 · 访问量 458

猜你喜欢

转载自blog.csdn.net/ffgyfgj/article/details/105075679