目录
面向对象 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. 初始化语句,大多数是都是一些赋值语句
总结
-
构造方法
功能是用于初始化创建对象的成员变量数据
构造方法是一个方法,参数使用方式和方法一致 -
构造方法选择
Java编译器会根据构造方法中的【参数类型,个数,顺序】来做选择,如果没有指定的构造方法,报错!!! -
无论什么时候一定要给当前类提供一个无参数构造方法。
-
以下代码报错
Dog(String name);
Dog(String color);调用:
String color = “red”;
Dog dog = new Dog(color);
在Java代码中不允许出现相同数据类型,个数,顺序的构造方法,和参数名没有关系,Java编译器选择过程中,有且只针对数据类型,个数,顺序选择,参数名真的无所谓。
this
this关键字表示对象本身- 调用当前方法的类对象
- 通过构造方法创建的类对象
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();
}
}
多类合作总结
-
类和对象的操作模式
类是数据类型定义
对象是目前操作成员方法,操作成员变量的核心 -
这两组代码在main方法中基本上全部是一个面向对象思想
a. 自定义数据类型,自定义类对象,作为方法参数。
b. 通过类对象来操作代码方式,所有的内容都是和对象相关 -
代码中要什么你给什么
匿名对象
匿名对象
没有名字的对象,没有对象名的对象
格式:
new 构造方法(所需参数)
用途- 提高开发效率,一次性筷子
匿名对象当前行使用之后,如果没有其他引用数据类型的变量保存其地址,直接销毁 - 简化代码结构
- 通过匿名对象直接调用成员方法
- 使用匿名对象作为方法的参数
常见模式
Dog dog = new Dog();
dog.sleep();
使用匿名对象直接调用成员方法,通过匿名对象调用方法之后,当前匿名对象销毁
new Dog().sleep();
匿名对象不推荐使用成员变量,因为肉包子打狗,有去无回
匿名对象直接作为方法的参数,【常用】
useDog(new Dog());
总结
- 提高开发效率,一次性筷子
-
匿名对象是为了提供开发效率,节约内存使用,同时让代码更加贴近于真实操作
-
匿名对象常用方式
第一个是直接使用匿名对象调用成员方法
第二个是直接使用匿名对象作为方法的参数 -
匿名对象【禁止】使用成员变量
继承
继承在开发中是一种抽象的归纳总结思想,剥离通用的属性,通用的方法,简化之后的开发压力。只需要在继承之后,满足个性化的实现即可。
通过继承可以优化代码,在JavaWEB开发中,继承大多数情况下,都是用来提高方法的复用度
格式:
class A extends B {}
A类是B类的一个子类
B类是A类的唯一父类
【Java是一门单继承语言,一个类有且只能继承一个父类】
继承之后,子类可以通过继承得到父类中非私有化成员变量,和非私有化成员方法 -
继承之后,子类不可以通过继承得到父类中的私有化成员变量,和私有化成员方法。
private修饰的内容有且只能在类内使用!!!
父类方法不适合子类 此时需要重写 Override
开发中父类的方法继承给子类使用,但是子类使用不太符合子类的情况,如果子类方法重新定义,重新命名,又会导致代码冗余,开发压力较大。
重写前提条件
1. 重写是存在与继承中子类,或者【遵从中的实现类】
2. 重写情况下要求子类中的方法和父类中的方法,方法声明完全一致
3. 方法体按照子类的情况来完成
注意事项
1. 子类重写父类方法,要求必须加上@Override严格格式检查
2. @Override会检查子类重写的方法,方法声明是否和父类一致
当实际情况需要重写,但是子类不重写没有任何的语法错误。会导致代码不符合预期要求,此时需要关键字abstract
【前提】
abstract修饰的方法,子类必须重写
使用步骤
-
使用abstract关键字修饰要求子类重写的方法
-
根据提示完成
特征 -
abstract修饰的方法 没有方法体
-
abstract修饰的方法,要求定义在abstract修饰的类内,或者接口interface内
-
abstract修饰的类,你认为有没有类对象???
abstract修饰的类内,是有可能存在abstract修饰的方法,而abstract修饰的方法是没有方法体的,如果能够得到一个abstract修饰类的对象,通过对象如何调用这些没有方法体的abstract方法。 -
abstract修饰的类,然后呢类内没有任何的一个abstract修饰的方法,请问有意义吗?
毫无意义!!
重载Overload
要求- 重载是要求在同一个类内,或者接口interface内
- 重载要求方法名必须一致!!!
- 重载要求方法的参数必须不一致!!!
- 重载对于方法的返回值没有任何的约束!!!
作用
-
简化代码结构,在同一个类内同名方法功能一致,但是参数满足多样化
-
简化程序员的开发压力
-
能够做到统一化处理方式【后面项目中案例给大家安排】
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关键字【鸡肋】
作用
-
super关键字可以用于在子类和父类之间,同名成员变量,同名成员方法调用时明确区分。
-
super关键字可以显式调用父类的构造方法,用于初始化父类的成员变量数据。
-
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();
}
}