Java编程语言 封装和继承

封装和继承

方法语法:

访问修饰符  特殊修饰符  返回值类型  方法名(形式参数列表){
    // 方法体
    [return xxx;]
}  

分类:

  1. 无参无返(**场景:**往往是很简单想复用一段代码 没有什么具体的参数接入和值的返回)

    public void print(){
        
    }
    
  2. 无参有返(**场景:**往往是不需要你关注具体的底层实现,只需要关注你想得到的结果 例如:键盘录入nextInt())

    public String print(){
        return "xxxxx";
    }
    
  3. 有参无返(**场景:**往往是需要你传入一个内容,然后我们帮你在方法内进行相应的加工处理<这个加工处理不需要给你返回结果> 例如:System.out.println(); 上节课练习的给小于60分的学生加2分)

    public void print(String str){
        
    }
    
  4. 有参有返(**场景:**往往是你需要给它一些内容,它加工之后,还需要将加工后的一个结果返还 例如:上节四则运算练习)

    public double plus(double num1,double num2){
        return num1+num2;z
    }
    

方法传参:(例子:网盘传递资料)

**基本数据类型:**在作为方法的参数传递时,传递的只是一个简单值内容,传递过去后的值和之前的值没有关系,两者或多者之前独立。(我分享了一个网盘资料地址,你保存到自己网盘了)

**引用数据类型:**在作为方法的参数传递时,传递的是引用(伪内存地址),所以传递过去之后,两者或多者之间共享同一块内存数据。(我分享了我的百度网盘帐号给你,你删了我的网盘内容,我就打死你)

特殊的方法-构造方法:

**作用:**初始化对象。

注意事项:

  1. 每一个类,系统都会给其配备一个默认的无参构造
  2. 如果你定义了一个构造方法(无参或带参都无所谓),那么系统就不会再给你配备了。
  3. 构造方法没有返回值类型,方法名必须和类名一致!
public 类名(){
    
}

this关键字

理解为当前对象,谁调用这个方法,谁就是当前对象。

Student wangMingXuan = new Student();

它可以在类中去调用对象可以调用一切内容。

this(); // 调用构造方法 必须是在构造方法的有效代码的第一行出现。

this.成员变量; // 调用变量

this.成员方法; // 调用方法

如果没有this,可能出现下方错误情况!!!

public class Student{
    
    public String name;
    public int age;
    // (X)  局部变量优先级比较高
    public Student(String name,int age){
        name = name;
    }
    
}

修复方案:

public class Student{
    public String name;
    public int age;
    // (\/) this对象调用的变量是成员变量
    public Student(String name,int age){
        this.name = name;
    }
}

方法重载:

发生在同一个类中,方法名相同,参数列表不同(类型不同,个数不同,顺序不同)的情况就是方法重载。它与方法的返回值类型和访问修饰符无关!

int fix();

void fix();

fix();

成员变量和局部变量的区别:

初始值不同

位置不同

作用域不同

生命周期不同

本章内容介绍

面向对象是一种编程方法,一种编程的思想。

面向对象的编程方法中,有几个核心特性,也是它的优势体现。

**面向对象的三大特性:**封装、继承,多态。(如果面试官问题四大特性,再加上一个抽象)

封装和继承

1. 掌握什么是封装

**一个好的系统:**高内聚、低(松)耦合(功能之间相互独立,没有影响,不会牵一发而动全身)。

世界上没有完美的系统,只有接近完美的系统。

封装的作用(为什么需要封装):

如果没有封装,那么一个类中属性,可能会出现不合理赋值。

便于使用者正确使用系统,防止错误修改属性

有助于系统之间的松耦合,提高系统独立性

提高软件的可重用性

降低了构建大型系统的风险

**封装的定义:**将类的信息隐藏在类的内部,不允许外部程序直接访问,而是通过类提供的公开的便捷的接口来进行访问赋值等。

原则:尽可能多的隐藏信息提供公开的接口来访问。

2. 掌握如何使用封装

/**
 * 一个类的封装过程:
 * 	1.属性私有化
 * 	2.提供公共的getter/setter方法
 * 	3.在getter/setter方法中添加控制语句(根据需求)
 * @author Charles7c
 * 2019年1月14日 上午9:55:55
 */
public class Monkey {

	// 1.属性私有化-隐藏类信息 除了自己这个类 其他的外部类都无法直接访问
	private String name;
	private int health;
	private int love;
	
	// 2.提供公共的getter/setter方法-用于外部访问操作(便捷的接口)
	// name的setter方法
	public void setName(String name) {
		this.name = name;
	}
	// name的getter方法
	public String getName() {
		return this.name;
	}
	
	public int getHealth() {
		return health;
	}
	
	// 3.根据你的【实际需求】  去在对应的getter/setter方法中添加控制语句
	public void setHealth(int health) {
		if(health < 0 || health > 100) {
			System.out.println("健康值非法!已经设置为默认值60!");
			this.health = 60;
		}else {
			this.health = health;
		}
	}
	
	public int getLove() {
		return love;
	}
	public void setLove(int love) {
		this.love = love;
	}
}

3. 包的作用和使用

为什么需要包:

  1. 因为在各个平台系统中,同一个目录下不允许出现同名文件。
  2. 当我们文件(java代码等)越来越多的时候,全都放在一起会显得杂乱,不易管理和查找。有一定规则的包可以解决此问题。
  3. 有助于实施访问权限控制

使用包:

  1. 包名的命名规则:

    1. 所有的字母都小写(大多数场景下)

    2. 采用反域名命名法(公司域名的倒序) 例如:cn.kgc.xxx

    3. 各级包应该有一定的规范:(根据不同公司会有出入)

      一般都是4级包,可能有更多级,根据具体需求来。

      cn :一级包

      kgc :二级包 公司的名称

      项目的名称:三级包

      模块名或者层级名:四级包

      **例如:**com.neteasy.cloudmusic.ui…

  2. 声明包地址

    // 声明包地址的  它必须在文件的有效代码的第一行
    package cn.kgc.demo2;
    
  3. 导入包(Eclipse快速导包:Ctrl+Shift+O)

    // 导包:如果你要使用的类[不再同一个包下] 你就需要将它的地址导入过来
    // 导包的语句必须是在类声明的上方,包声明的下方
    // 语法:import 类的全类名/全路径/全限定名;(它也支持通配符)
    // import java.util.*;
    import java.util.Scanner;
    

    java.lang包下的类,不需要你手动声明,JVM会自动进行加载。

    **例如:**System

  4. 特殊情况

    // 如果在一个类中,出现了使用两个不同包的同名类  必然有一个需要以全类名形式使用
    cn.kgc.demo1.Cat cat = new cn.kgc.demo1.Cat();
    

4. 访问修饰符的使用

**private:**最严格的访问级别,只能在本类中使用。

**什么都不写(默认):**同包之间可以随意访问。

protected:// 一会讲完继承说

**public:**在整个项目都能使用

作用域 修饰符 同一个类中 同一个包中 子类中 任何地方
private
默认修饰符
protected
public

**访问修饰符:**可以用来修饰类、修饰属性、修饰方法。

**作用:**为了隐藏某些细节,或者公开某些内容,控制访问权限。

5. static关键字

**static可以修饰变量:**静态变量/类变量

**static也可以修饰方法:**静态方法/类方法

**static也可以修饰代码块:**静态代码块

public class Dog {
	// 成员代码块/构造代码块/非静态代码块:会随着对象的创建而执行里面的代码片段(创建一次对象就执行一次) 它优先于构造方法执行
	{
		
	}
	
	// 静态代码块:会随着类的加载而执行里面的代码片段(只会执行一次)
	static {
		
	}
}

1547439012668

static修饰的类信息等和普通的成员(实例/对象)信息等的区别:

  1. 生命周期不同

    类信息随着类加载而创建

    实例信息随着对象产生而创建

  2. "作用域"不同

    类信息被该类的所有的对象共享,只要有一个对象更改,所有的对象获取的结果都会变化。

    实例信息仅仅被自身对象所使用,不同对象之间的实例信息相互独立存在。

  3. 调用上有所不同

    实例信息必须通过先创建对象,然后才能使用

    类信息,直接可以用类名.的形式调用(当然也可以用对象来调用)

注意事项:

  1. 如果在多个对象之间,有共享的数据,且这个数据不会发生变动,最好定义为静态常量,可以有效提升效率。
static final修饰...
  1. 在类信息中,如果使用实例信息,需要注意先创建对象才能使用。而反之则无所谓。(自己思考谁先出生和谁后出生)

猜你喜欢

转载自blog.csdn.net/SuperKite/article/details/87348078