JAVA类与对象总结

【Java总结】-【入门篇(第三周)】 后续每周总结一次

JAVA面向对象

面向对象概论

1.1 面向对象概念:

  • 万物皆对象,将现实的事物抽象出来,把现实对象的事物以及关系,抽象成类,通过继承、实现、组合的方式把万事万物都给容纳了.
  • 实现了对现实世界的抽象.
  • 抽象会使复杂的问题简单化,从以前执行者变为指挥者,面向对象更符合人类思维,面向过程符合机器思想.
    -OOP (面向对象编程)、OOD(面向对象设计)、OOA (面向对象的分析)
    Object Oriented Programming

1.2 面向对象和面向过程的优缺点:

  • 面向过程是具体化的、流程化的
  • 面向对象的底层是面向过程,把面向过程抽象成类,然后封装,方便我们使用就是面向对象
  • 面向过程的优缺点
    • 优点:性能比面向对象好,因为类的调用需要实例化,增大开销,消耗资源。
    • 缺点:不易维护、不易复用、不易扩展。
  • 面向对象的优缺点
    • 优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特征,可以设计出低耦合的系统,是系统更加灵活易于维护。
    • 缺点:性能比面向过程差。

二、对象和类

2.1 类

2.1.1类的概述
  • 同一类事物的统称
  • 封装一类事物和行为的载体
  • 对象是类的实例
  • 通过类来生成对象
  • 同一类事物封装成的一个整体的模板
2.1.2类的创建格式:

权限修饰符 class 类名{}

// 举个类书写的例子
public class ClassName{

}
2.1.3 方法的定义:

方法的组成部分:

  • 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
  • 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
  • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
  • 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
  • 方法体:方法体包含具体的语句,定义该方法的功能。

方法定义在类里面
修饰符 返回值类型 方法名(参数类型 参数名){

方法体

return 返回值;
}

// 举例定义方法
public class ClassName {
	public void actionName(){
	
	}
}
2.1.4 变量的定义:
成员变量
  • 变量定义部分定义的变量叫做类的成员变量,成员变量在整个类中都有效
    [格式]:
    修饰符 返回值类型 变量名;
public class ClassName {
	private int age;
	private String name;
	
}
局部变量
  • 局部变量是在函数或方法中的变量
    [格式]:
    - 修饰符 返回值类型 变量名;
// 定义例子
public class ClassName {
	// int age String str局部变量这里的也叫参数变量
	public void variableDefine(int age,String str){ 
		int t = 1; // 局部变量
	}
}
变量的作用域
  • 变量的范围是程序中该变量可以被引用的部分。
  • 方法内定义的变量被称为局部变量。
  • 局部变量的作用范围从声明开始,直到包含它的块结束。
  • 局部变量必须声明才可以使用。
  • 方法的参数范围涵盖整个方法。参数实际上是一个局部变量。
  • for循环的初始化部分声明的变量,其作用范围在整个循环。
  • 但循环体内声明的变量其适用范围是从它声明到循环体结束
成员变量和局部变量的区别:
  • 在类中的位置不同成员变量:类中方法外局部变量:方法定义中或者方法声明上- - 在内存中的位置不同成员变量:在堆中局部变量:在栈中
  • 生命周期不同成员变量:随着对象的创建而存在,随着对象的消失而消失局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
  • 初始化值不同成员变量:有默认值。局部变量:没有默认值,必须定义,赋值,然后才能使用
2.1.5 访问修饰符:

四种类型的访问修饰符

  • public : 对所有类公开可见,可用在对象:类、接口、变量、方法
  • protected :对同一包内的类和所有子类可见。适用对象:变量、方法。注意:不能修饰类(外部类)
  • default :(即默认,什么也不写):在同一包内可见,不适用任何修饰符。使用对象:类、接口、变量、方法
  • private :在同一类内可见,使用对象:变量、方法。注意:不能用来修饰类(外部类)
public class ClassName{
	public void demo1() {}			
	protected void demo2() { }
    void demo3() { }
	private void demo4() { }
}
2.1.6 构造方法
  • 当一个对象被创建时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。

  • 通常会使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来创建一个完整的对象。

  • 不管你是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个默认构造方法,默认构造方法的访问修改符和类的访问修改符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。

  • 一旦你定义了自己的构造方法,默认构造方法就会失效。

public class ClassName {
	public ClassName(){}
	public ClassName(int age){}
}
2.1.7 方法的重载
  • 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
  • 方法名一定要相同。
  • 方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体。
    - 如果参数个数不同,就不管它的参数类型了!
    - 如果参数个数相同,那么参数的类型必须不同。
  • 方法的返回类型、修饰符可以相同,也可不同。
    【举例】
public class ClassName {
	public void demo1(){}
	// 参数个数
	public void demo1(int age){}
	// 参数的类型
	private int demo1(String str){
		return 1;
	}
}

2.2 对象:

1.2.1 对象概念
  • 对象:对象是类的一个实例(对象不是找个女朋友hhh~~~),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
1.2.2 对象的创建与使用

-创建-:

  • 创建格式:
    类名 对象名 = new 类名();
public class ClassName{}
class ClassTest{
	public static void main(String[] args){
		ClassName cls = new ClassName(); // 创建类对象
	}
}
1.2.3对象的使用
  • 使用成员变量
    对象名.成员变量
public class ClassName{
	public int age = 100;
	public void testAction() {	
		System.out.println("Welcome to the test!");
	}
}
class ClassTest{
	public static void main(String[] args){
		ClassName cls = new ClassName(); // 创建类对象
		cls.age; // 使用成员变量
	}
}
  • 使用成员方法
    对象名.成员方法
public class ClassName{
	public void testAction() {	
		System.out.println("Welcome to the test!");
	}
}
class ClassTest{
	public static void main(String[] args){
		ClassName cls = new ClassName(); // 创建类对象
		cls.testAction(); // 使用成员方法
	}
}

三、面向对象的三大特性

  • 封装
  • 继承
  • 多态

3.1 三大特性之封装:

3.1.1 封装的概念
  • 隐藏对象的属性和实现细节,仅对外提供公共访问方式
3.1.2 封装的好处
  • 隐藏实现细节,提供公共的访问方式
  • 提高了代码的复用性
  • 提高安全性
3.1.3 封装原则
  • 将不需要对外提供的内容都隐藏起来
  • 把属性隐藏,提供公共方法对其访问
3.1.4 思想过程
  • 通过对象给成员变量赋值,可以复制一些非法的数据 这是不合理的,所以在赋值之前应该先对数据进行判断,这时判断就需要写一段逻辑对其进行判断,但是这段逻辑只能写在方法中,所以需要定义一个方法。但是不过不调用方法来赋值,还是直接赋值。这样方法就没用了。所以此时java提供了一个关键字private 将变量修饰。
3.1.5 this关键字的概述和应用
  • this:代表所在类的对象引用
  • 记!!!: 方法被哪个对象调用,this就代表哪个对象
  • 适用:局部变量隐藏成员变量
3.1.6 封装的代码类型

setter/getter 方法来提供封装 对变量进行赋值和取值
格式

  • setter
    public void set变量名(首字母大写)(变量类型 局部变量名){
    this.变量名 = 局部变量名;
    }
  • getter
    public 变量类型 get变量名(首字母大写) (){
    return this.变量名;
    }
public class ClassName{
	private int age;
	private String name;
	public void setName(String name){
		// 为了防止 局部变量将全局变量遮盖,用this.name标识全局变量name
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
	public void setAge(int age){
		// 为了防止 局部变量将全局变量遮盖,用this.name标识全局变量name
		this.age = age;
	}
	public String getAge() {
		return this.age;
	}
}

3.2 三大特性之继承:

3.2.1 继承概念
  • 就是子类继承父类的行为和特征,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,是的子类具有相同的行为。
  • 生活中的继承:
    兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
    食草动物和食肉动物又是属于动物类。
    所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
    虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性
3.2.2 继承的定义与特性
  • 类继承的格式:
    class 父类{}
    class 子类 extends 父类{}
class Parent{}
class Son extends Parent{}
  • 继承的特性:
    1.子类拥有父类非 private 的属性、方法。
    2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
    3.子类可以用自己的方式实现父类的方法。
    4.Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
    5.提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
    [注意]:所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
3.2.3 super关键字
  • 定义
    它是一个指代变量,用于在子类中指代父类对象。
  • 应用
    只能用于子类的构造函数和实例方法中,不能用于子类的类(静态)方法中。原因是super指代的是一个父类的对象,它需要在运行时被创建,而静态方法是类方法,它是类的一部分。当类被加载时,方法已经存在,但是这时候父类对象还没有被初始化。
    应用场景:
    1.在子类中调用父类的属性或方法
public class Parent{
	public int age;
	public String name;
	public void test(){
		System.out.println("I`m Parent");
	}
}
class Son extends Parent{
	public static void main(String[] args) { 
		System.out.println(super.age); //调用父类的属性
		super.test();// 调用父类的方法
	}
}
2.在子类中指代父类构造器
public class Parent{
	public int age;
	public String name;
	
	public Parent(int age){
		System.out.println("I`m Parent");
	}
}
class Son extends Parent{
	public static void main(String[] args) { 
		System.out.println(this.age); //调用父类的属性
		this.test();// 调用父类的方法
	}
	public Son(){
		super(15);
		System.out.println("I`m Son");
	}
}
  • 总结
    super关键字指代父类对象,主要用于在子类中指定父类的方法和属性,也用于在子类中初始化父类。子类的静态方法中不能使用super关键字
3.2.4 重载
  • 重载(overloading) :是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
  • 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
    最常用的地方就是构造器的重载。

【注意:】重载的标准

  • 1.被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 2.被重载的方法可以改变返回类型;
  • 3.被重载的方法可以改变访问修饰符;
  • 4.被重载的方法可以声明新的或更广的检查异常;
  • 5.方法能够在同一个类中或者在一个子类中被重载。
  • 6.无法以返回值类型作为重载函数的区分标准。
总结
  • 方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
  • 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  • 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
  • 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

3.3 三大特性之多态:

3.3.1 概念
  • 多态是同一个行为具有多个不同表现形式或形态的能力。
3.3.2 优点
  • 1.消除类型之间的耦合关系
  • 2.可替换性
  • 3.可扩充性
  • 4.接口性
  • 5.灵活性
  • 6.简化性
3.3.3 多态存在必要条件
  • 继承
  • 重写
  • 父类引用指向子类对象
3.3.4 多态的实现方式
  • 方式一:重写:
  • 方式二:接口
    1.生活中的接口最具代表性的就是插座,
    2.java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。
  • 方式三:抽象类和抽象方法
public class Parent{
	public int age;
	public String name;
	
	public Parent(int age){
		System.out.println("I`m Parent");
	}
}
class Son extends Parent{
	
	public Son(){
		super(15);
		System.out.println("I`m Son");
	}
}
class TestClass {
	public static void main(String[] args) { 
		 Parent parent = new Son(); // 多态的一种 也叫上转型
	}
}

4.抽象类

4.1 为什么用抽象类与什么是抽象类?
  • 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
  • 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
  • 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
  • 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
  • 在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
4.2 抽象方法
  • 如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
  • Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
  • 抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
  • 声明抽象方法会造成以下两个结果:
    1.如果一个类包含抽象方法,那么该类必须是抽象类。
    2.任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
4.2 抽象类总结
  1. 抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
  5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
// 抽象类定义
/*
 修饰符 abstract class 类名{
	修饰符 abstract 返回值类型 方法名();
 }
*/
abstract class Person{
	public abstract void eat();
}
class Student extends Person {
	public void eat(){
		System.out.println();
	}
}

学习总结

本周再次总结个人知识树知识点,仅仅时关于自己个人知识的梳理,关于类与对象。欢迎各位学友一起交流谈论,下期见。。。

发布了6 篇原创文章 · 获赞 9 · 访问量 425

猜你喜欢

转载自blog.csdn.net/lxn1214/article/details/104439578