Java Day22

目录
面向对象 2
类和对象比较 2
定义类的格式*** 3
创建对象的格式 4
通过对象操作成员变量,使用成员方法 4
类对象内存分析【重点】*** 4
构造方法【鸡肋】 5
this 7
封装【重点,规范】 7
Java中规范化封装【JavaBean规范】 8
Private 9
多类合作【重点】 11
1屏幕类代码实现 11
2 键盘类代码实现 11
3 PC类代码实现(Screen自定义屏幕类对象和Keyborad自定义键盘类对象,作为PC类的成员变量) 11
Main方法 15
多类合作总结 16
匿名对象 17
继承 18
父类方法不适合子类 此时需要重写 Override 20
当实际情况需要重写,但是子类不重写没有任何的语法错误。会导致代码不符合预期要求,此时需要关键字abstract 20
重载Overload 21
super关键字【鸡肋】 23
final 26

第三周学习总结
面向对象
类和对象比较
类:
对于一类事物的统称,包含对于属性描述和行为描述(人类 狗类 手机类)

以人类为例
属性描述: 身高 体重,样貌...
行为描述: 吃饭,睡觉,上班,学习,打游戏...

对象:
具体的,独立的,唯一的个体(马云 我 普京)
生活中面向对象和面向过程的例子
面向对象 直观,高效,并且是符合我们生活案例的一种方式
面向过程 较为繁琐的方式,但是面向对象的基础就是面向过程。
定义类的格式***
格式:
class 类名 {
属性描述;
行为描述;
}
类名:
大驼峰命名法,见名知意,动宾结构
类名这里可以认为是一个数据类型名,自定义数据类型

属性描述:
描述当前类有哪些属性
例如:
人类的身高体重,年龄姓名

行为描述:
描述当前类有哪些行为
例如:
人类的吃饭行为,睡觉行为,打游戏行为
创建对象的格式
类名 对象名 = new 类名 ();
Person saolei = new Person();
这是创建了一个Person类的对象,对象名叫做saolei。
通过对象操作成员变量,使用成员方法
成员变量赋值 saolei.name = “海航中路彭于晏”;
取值 System.out.println(“Name:” + saolei.name);
通过类对象使用成员方法
saolei.eat(“鲱鱼罐头鱼丸”);
类对象内存分析【重点】***
有new就会使用到堆区,Dog dog4 = new Dog(“测试”,66,‘男’);dog4是一个引用数据类型变量,dog4实际上是一个指向其他内存空间的一个数据类型。引用数据类型的变量中存储的内容是其他内存空间的【首地址】。
当CPU访问到dog4时,会得到其存储的地址,然后直接跳转到对应的内存空间中,执行代码,获取数据,操作内容…

构造方法【鸡肋】
作用
用于在开发过程中创建对象使用, 初始化当前创建对象中的成员变量数据!!!

格式:
public 类名(所需初始化参数列表) {
初始化语句;
}
细节:
1. 构造方法的名字必须是类名,并且其他方法的名字不能是类名
2. 构造方法没有返回值类型声明
3. 初始化参数列表和正常的方法列表操作使用一致
4. 初始化语句,大多数是都是一些赋值语句
总结

  1. 构造方法
    功能是用于初始化创建对象的成员变量数据
    构造方法是一个方法,参数使用方式和方法一致

  2. 构造方法选择
    Java编译器会根据构造方法中的【参数类型,个数,顺序】来做选择,如果没有指定的构造方法,报错!!!

  3. 无论什么时候一定要给当前类提供一个无参数构造方法。

  4. 以下代码报错
    Dog(String name);
    Dog(String color);

    调用:
    String color = “red”;
    Dog dog = new Dog(color);
    在Java代码中不允许出现相同数据类型,个数,顺序的构造方法,和参数名没有关系,Java编译器选择过程中,有且只针对数据类型,个数,顺序选择,参数名真的无所谓。
    this
    this关键字表示对象本身

    1. 调用当前方法的类对象
    2. 通过构造方法创建的类对象

this表示一个对象!!!当前对象!!!
目前this关键字解决的问题 可以在方法中使用this关键字区分操作的是成员变量还是局部变量
封装【重点,规范】
面向对象三大特征
封装
最基本的思想
继承
子承父业,你长得真的像你父母
多态
猫,狗,都是动物
U盘,键盘,鼠标,都是USB设备
【最难的是多态,最简单的也是多态】
封装,不单单是对于类的封装
归纳总结!!!
循环封装过程
方法封装功能
类封装数据
框架封装模块

一段代码使用了三遍,做成一个循环
一个循环使用了三遍,做成一个方法
一个方法使用了三遍,做成一个工具类
一个工具类使用了三遍,做成一个文档
一个文档使用了三遍,做成一篇博客

Java中规范化封装【JavaBean规范】
要求:
1. 所有的成员变量全部私有化【private修饰】
2. 要求至少完成一个无参数构造方法,其他无所谓
3. 要求给予所有的成员变量对应的setter和getter方法
JavaBean规范只是一个规范,而且是作为一个基础规范,操作都是可以使用快捷键来完成的,JavaBean规范,是为了后期开发汇总更好的代码适配度,提高代码运行的统一性,能够满足框架的使用

Private
private
私有化内容,使用private修饰的成员变量,成员方法和构造方法,有且只能类内使用,类外没有操作权限。
使用private修饰的内容有且只能在class所处大括号以内使用
public
公开内容,只要存在对应的类对象,都可以通过类对象调用类内的public修饰的成员变量和成员方法
private私有化修饰的成员变量,类外不能通过类对象操作,取值,赋值。

JavaBean规范规定了
setter ==> 赋值操作
格式:
public void set成员变量名(对应成员变量数据类型参数) {
赋值操作;
}
getter ==> 取值操作
public 对应成员变量数据类型返回值 get成员变量名字() {
return 成员变量;
}

注意
1. 方法格式固定,setter和getter方法操作过程不能修改
2. 方法需要符合命名规范,小驼峰命名法
3. boolean类型数据较特殊
boolean类型的成员变量getter方法要求是is开头
多类合作【重点】
1屏幕类代码实现
Public class Screen{
成员变量
构造方法
成员方法)
Setter和getter方法
}
2 键盘类代码实现
public class Keyboard {
成员变量
构造方法
Setter getter
}
3 PC类代码实现(Screen自定义屏幕类对象和Keyborad自定义键盘类对象,作为PC类的成员变量)
PC电脑类
成员变量:
屏幕类对象
键盘类对象
成员方法:
换屏幕
换键盘
public class PC {
Screen自定义屏幕类对象,作为PC类的成员变量
private Screen screen;
Keyborad自定义键盘类对象,作为PC类的成员变量
private Keyboard keyboard;
// 构造方法 Constructor
public PC() {}

/**
 * PC类有参数构造方法,需要的参数是Screen类对象,和Keyboard类对象
 * 
 * @param screen   Screen屏幕类对象
 * @param keyboard Keyboard键盘类对象
 */
public PC(Screen screen, Keyboard keyboard) {
	this.screen = screen;
	this.keyboard = keyboard;
}

/**
 * 设置Screen屏幕类对象成员变量的方法,需要的是一个Screen类对象作为方法的参数
 * 
 * @param screen Screen类对象
 */
public void setScreen(Screen screen) {
	this.screen = screen;
}

/**
 * 获取屏幕类对象
 * 
 * @return Screen类对象
 */
public Screen getScreen() {
	return screen;
}

/**
 * 设置Keyboard键盘类对象成员变量的方法,需要的参数是一个Keyboard键盘类对象
 * 
 * @param keyboard Keyboard键盘类对象
 */
public void setKeyboard(Keyboard keyboard) {
	this.keyboard = keyboard;
}

/**
 * 获取一个键盘类对象
 * 
 * @return Keyboard键盘类对象
 */
public Keyboard getKeyboard() {
	return keyboard;
}
public void show() {
	System.out.println("屏幕品牌:" + screen.getName() + " 屏幕尺寸:" + screen.getSize());
	System.out.println("键盘品牌:" + keyboard.getName() + " 键盘按键个数:" + keyboard.getKeyCount());
}
/*
 * PC类成员方法,用于展示电脑配置 电脑运行鲁大师!!!查看电脑配置
 * 
 * 在整个方法中,获取数据都是通过类对象的方式来获取的,全部是按照面向对象思想来完成的 在代码中要注意方法的调用者是谁!!!
 * 代码中存在的两个getName方法是完成不同的!!!
 */

Main方法
public class Demo {
public static void main(String[] args) {
// 先进货,既然需要组装电脑,需要键盘和屏幕
// Screen 是一个类型 screen是一个屏幕类对象
Screen screen = new Screen(“三星”, 15.6F);
Keyboard keyboard = new Keyboard(“双飞燕”, 104);
// 组装电脑 使用屏幕类对象和键盘类对象作为参数,创建PC类对象
PC pc = new PC(screen, keyboard);
// PC类show方法,展示电脑配置
pc.show();
// 屏幕不好使,换一个屏幕
// 进货一个新的屏幕
Screen screen2 = new Screen(“BOE”, 24F);
//重新定义一个Screen类对象screen2
// 调用PC的setScreen,更换屏幕
pc.setScreen(screen2);
// 展示电脑配置
pc.show();
}
}
多类合作总结

  1. 类和对象的操作模式
    类是数据类型定义
    对象是目前操作成员方法,操作成员变量的核心

  2. 这两组代码在main方法中基本上全部是一个面向对象思想
    a. 自定义数据类型,自定义类对象,作为方法参数。
    b. 通过类对象来操作代码方式,所有的内容都是和对象相关

  3. 代码中要什么你给什么
    匿名对象
    匿名对象
    没有名字的对象,没有对象名的对象
    格式:
    new 构造方法(所需参数)
    用途

    1. 提高开发效率,一次性筷子
      匿名对象当前行使用之后,如果没有其他引用数据类型的变量保存其地址,直接销毁
    2. 简化代码结构
    3. 通过匿名对象直接调用成员方法
    4. 使用匿名对象作为方法的参数
      常见模式
      Dog dog = new Dog();
      dog.sleep();
      使用匿名对象直接调用成员方法,通过匿名对象调用方法之后,当前匿名对象销毁
      new Dog().sleep();
      匿名对象不推荐使用成员变量,因为肉包子打狗,有去无回
      匿名对象直接作为方法的参数,【常用】
      useDog(new Dog());
      总结
  4. 匿名对象是为了提供开发效率,节约内存使用,同时让代码更加贴近于真实操作

  5. 匿名对象常用方式
    第一个是直接使用匿名对象调用成员方法
    第二个是直接使用匿名对象作为方法的参数

  6. 匿名对象【禁止】使用成员变量
    继承
    继承在开发中是一种抽象的归纳总结思想,剥离通用的属性,通用的方法,简化之后的开发压力。只需要在继承之后,满足个性化的实现即可。
    通过继承可以优化代码,在JavaWEB开发中,继承大多数情况下,都是用来提高方法的复用度
    格式:
    class A extends B {

    }
    A类是B类的一个子类
    B类是A类的唯一父类
    【Java是一门单继承语言,一个类有且只能继承一个父类】
    继承之后,子类可以通过继承得到父类中非私有化成员变量,和非私有化成员方法

  7. 继承之后,子类不可以通过继承得到父类中的私有化成员变量,和私有化成员方法。
    private修饰的内容有且只能在类内使用!!!

父类方法不适合子类 此时需要重写 Override
开发中父类的方法继承给子类使用,但是子类使用不太符合子类的情况,如果子类方法重新定义,重新命名,又会导致代码冗余,开发压力较大。
重写前提条件
1. 重写是存在与继承中子类,或者【遵从中的实现类】
2. 重写情况下要求子类中的方法和父类中的方法,方法声明完全一致
3. 方法体按照子类的情况来完成

注意事项
1. 子类重写父类方法,要求必须加上@Override严格格式检查
2. @Override会检查子类重写的方法,方法声明是否和父类一致
当实际情况需要重写,但是子类不重写没有任何的语法错误。会导致代码不符合预期要求,此时需要关键字abstract
【前提】
abstract修饰的方法,子类必须重写
使用步骤

  1. 使用abstract关键字修饰要求子类重写的方法

  2. 根据提示完成
    特征

  3. abstract修饰的方法 没有方法体

  4. abstract修饰的方法,要求定义在abstract修饰的类内,或者接口interface内

  5. abstract修饰的类,你认为有没有类对象???
    abstract修饰的类内,是有可能存在abstract修饰的方法,而abstract修饰的方法是没有方法体的,如果能够得到一个abstract修饰类的对象,通过对象如何调用这些没有方法体的abstract方法。

  6. abstract修饰的类,然后呢类内没有任何的一个abstract修饰的方法,请问有意义吗?
    毫无意义!!
    重载Overload
    要求

    1. 重载是要求在同一个类内,或者接口interface内
    2. 重载要求方法名必须一致!!!
    3. 重载要求方法的参数必须不一致!!!
    4. 重载对于方法的返回值没有任何的约束!!!
      作用
  7. 简化代码结构,在同一个类内同名方法功能一致,但是参数满足多样化

  8. 简化程序员的开发压力

  9. 能够做到统一化处理方式【后面项目中案例给大家安排】
    eg
    class Person {

    public void game() {
    System.out.println(“大吉大利,今晚吃鸡”);
    }

    public void game(String name) {
    System.out.println(“玩” + name);
    }

    public int game(String name, int time) {
    System.out.println(“玩” + time + “个小时” + name);
    return 1;
    }
    }

public class Demo1 {
public static void main(String[] args) {
Person person = new Person();

	person.game();
	person.game("LOL");
	person.game("WOT", 2);
}

super关键字【鸡肋】
作用

  1. super关键字可以用于在子类和父类之间,同名成员变量,同名成员方法调用时明确区分。

  2. super关键字可以显式调用父类的构造方法,用于初始化父类的成员变量数据。

  3. super关键字使用的格式,规范和this非常类似。
    class Father {
    public String name;
    public String age;

    public void game() {
    System.out.println(“黄金矿工”);
    }
    }

class Son extends Father {
public String name;
public String age;

@Override
public void game() {
	System.out.println("PUBG");
}

public void test() {
	// 调用子类的成员方法,就近元素
	game();
	
	// super关键字调用父类的game方法
	super.game();
	
	// 调用子类成员变量
	name = "大头儿子";
	
	// super关键字调用父类的成员变量
	super.name = "隔壁老王";
}

}
Super调用构造方法
super关键字在子类构造方法中,调用父类构造方法

  • 格式:
  •  super(实际参数);
    
  •  会根据实际参数来选择使用父类对应数据类型,个数,顺序的构造方法,用于初始化父类的成员变量数据。
    
  • 注意事项:
  •  1. 在没有指定选择哪一个父类构造构造方法,作为子类初始化父类成员变量空间的操作时
    
  •  Java编译器会默认选择父类的无参数构造方法。
    
  •  2. 选择使用父类的有参数构造方法,初始化父类成员变量空间
    
  •  3. 父类数据的交给父类的构造方法操作,不要在子类中操作。
    
  •  4. super关键字显式调用父类的构造方法,必须在代码的第一行
    
  •  5. super关键字调用构造方法,和this关键字调用构造方法,是否能共存???
    
  •  	【显式】情况下不可以!!!
    
  •  	但是省略通过super关键字调用父类构造方法的情况下,Java编译器会在编译的过程中,默认选择无参数父类构造方法使用
    

final
最终!!!
final关键字可以修饰
局部变量 有且只能被赋值一次,赋值之后不可以修改
成员变量 定义时必须初始化,未初始化报错
成员方法 使用final修饰的方法为最终方法,不能被重写!!!
类 没有子类,不能被继承
Java中是存在一些类是使用final修饰的
String类
注意 final修饰类对象
class Dog {
String name;
int age;
}

public class Demo2 {
public static void main(String[] args) {
Dog dog = new Dog();

	dog.name = "八公";
	dog.age = 15;
	
	/*
	 * final修饰的是dog1,dog1是一个类对象,同时是一个引用数据类型的变量。
	 * dog1存储数据不可以改变!!!dog1指向不可以改变,但是dog1指向空间中的内容可以改变。
	*/
	final Dog dog1 = new Dog();
	
	// dog1能不能操作成员变量???
	dog1.name = "骚杰";
	dog1.age = 16;
	
	// 能不能修改???
	dog1.name = "一杯二锅头";
	dog1.age = 20;
	
	Dog dog2 = dog1;
	dog2 = new Dog();
	
	// The final local variable dog1 cannot be assigned. 
	// It must be blank and not using a compound assignment
	// dog1 = new Dog();
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值