day08.封装+标准JavaBean+继承+代码块
课前回顾:
1.可变参数
a.什么时候使用:参数的类型确定但是个数不确定
b.格式:数据类型...变量名
c.本质:数组
d.注意:参数位置只能有一个可变参数,而且只能放到最后
2.递归:
a.概述:方法自己调用自己->直接递归
方法互相调用->间接递归
b.注意:
递归的时候需要求条件,保证递归退出
不要递归次数过多
3.对象数组:
存储的是对象的地址值(地址值就代表一个对象),取出来的还是对象地址值(地址值就代表一个对象)
4.二分查找
a.概述:每次查找都干掉一半,从中间索引开始查询
b.中间索引:(min+max)/2
c.查询过程:
key>arr[mid]->min = mid+1
key<arr[mid]->max = mid-1
5.命令行参数
通过命令行给main方法中的String[]赋值->没啥用
6.封装:
a.将细节隐藏起来,再将该暴露的暴露出来
b.比如:
定义一个方法,方法的具体实现就是细节,将细节放到方法体中
对外提供方法名,方便别人调用
将成员变量私有化->private(被private修饰的成员只能此类内部使用,外界不能直接调用)
针对于私有化的成员变量提供了getxxx/setxxx方法
getxxx:获取属性值
setxxx:为属性赋值
今日重点:
1.会利用this关键字区分重名的成员变量和局部变量
2.利用无参构造创建对象
3.利用有参构造创建对象并为属性赋值
4.如何快速编写一个标准的javabean
5.会编写继承,成员的访问
6.会重写父类中的方法,以及知道重写的意义
7.会利用super调用父类的成员
8.会利用this调用本类的成员
9.知道继承的特点
10.在继承的前提下,会给父类中的私有属性赋值
11.会使用静态代码块
第一章.封装
1.封装的介绍以及使用
1.面向对象三大特征: [封装] 继承 多态
2.什么是封装思想:
a.为什么需要封装?封装的作用和含义?
我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗?有必要碰电动机吗?
b.隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
将细节隐藏起来,对外提供一个暴露的接口,供我们使用者使用,我们只需要调用这个接口,接口中的细节(代码)就执行起来了
3.权限修饰符:private(私有的)
作用:某个成员一旦被private修饰,别的类是调用不了这个私有成员的
4.注意:如果一个成员被私有化了,我们外界就彻底使用不了,在封装思想中,我们一般会针对私有的成员对外提供对应的public 的方法 用来间接的去操作私有成员
getxxx()方法:获取属性值
setxxx()方法:为属性赋值
public class Person {
String name;
/*
一个成员一旦被private修饰了,外界是不能直接使用的
只能自己本类中使用
*/
private int age;
//针对属性提供对外暴露的方法:get/set方法
public void setAge(int nianLing){
if (nianLing<0){
System.out.println("输入的不合理");
}else{
age = nianLing;
}
}
//提供get方法
public int getAge(){
return age;
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.name = "金莲";
//person.age = 26;
person.setAge(26);
System.out.println(person.name+"..."+person.getAge());
}
}
ps:
如果成员变量没有被private修饰,我们可以提供get/set 也可以不提供get/set
如果成员变量被private修饰了,我们就必须提供get/set方法了
2.this的介绍
1.注意:在一个方法中局部变量和成员变量重名时,遵循"就近原则",先操作局部的
2.this
a.概述:代表的当前对象
哪个对象调用this所在的方法,this就代表哪个对象
b.用法:this.成员变量名
c.作用:
在一个类中,可以区分重名的成员变量和局部变量
public class Person {
String name;
public void speak(String name){
System.out.println(this);
System.out.println(this.name+"您好,我是"+name);
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person);
person.name = "涛哥";//给成员变量name赋值
person.speak("柳岩");//给speak的参数赋值
System.out.println("=================");
Person person1 = new Person();
System.out.println(person1);
person1.name = "张学良";
person1.speak("张作霖");
}
}
public class Person {
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.setName("柳岩");
person.setAge(36);
System.out.println(person.getName()+"..."+person.getAge());
}
}
3.构造方法
1.专门用于创建对象的
2.没有返回值,没有返回值类型,连void都没有
3.1空参构造
1.格式:
public 类名(){
}
2.使用:new对象就相当于调用了构造方法
3.注意:
每个类都有构造方法,如果没有写,jvm会自动提供一个空参构造
4.作用:new对象用
3.2有参构造
1.格式:
public 类名(){
为属性赋值的代码
}
2.作用:
a.new对象使用
b.为属性赋值
3.注意:
如果写了有参构造,jvm将不再提供空参构造,所以我们一般将空参和有参构造都手动写出来
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.setName("柳岩");
person.setAge(36);
System.out.println(person.getName()+"..."+person.getAge());
System.out.println("======================");
Person person1 = new Person("金莲", 26);
System.out.println(person1.getName()+"..."+person1.getAge());
}
}
小结:
1.private:私有化,本类中能使用,别的类不能使用
2.被private修饰的成员需要提供对应的get/set方法为私有属性赋值/取值
3.this:代表当前对象,可以区分重名的成员变量和局部变量
4.无参构造:不写jvm提供
new对象的
5.有参构造:
如果写了有参构造,jvm不提供无参构造了,所以我们都要写上
new对象,为属性赋值
第二章.标准JavaBean
JavaBean是 Java语言编写类的一种标准规范。符合
JavaBean` 的类,要求:
(1)类必须是具体的和公共的,
(2)并且具有无参数的构造方法,有参构造
(3)成员变量私有化,并提供用来操作成员变量的set
和get
方法。
1.开发中
com.atguigu.service -> 专门装service类
com.atguigu.dao ->专门装直接和数据库打交道的类
com.atguigu.web-> 专门装和页面打交道的类
com.atguigu.utils-> 专门装工具类的
com.atguigu.javabean->专门装实体类
public class ClassName{
//成员变量
//构造方法
//无参构造方法【必须】
//有参构造方法【建议】
//getXxx()
//setXxx()
//其他成员方法
}
编写符合JavaBean
规范的类,以人类为例,标准代码如下:
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
如何快速编写一个标准的javabean:alt+insert
1.生成空参构造:alt+insert
2.生成有参构造:alt+insert
3.生成get/set方法:alt+insert
测试类,代码如下:
public class Test {
public static void main(String[] args) {
//利用set方法为属性赋值
Person person = new Person();
person.setName("涛哥");
person.setAge(18);
System.out.println(person.getName()+"..."+person.getAge());
System.out.println("========================");
//利用有参构造为属性赋值
Person person1 = new Person("柳岩", 36);
System.out.println(person1.getName()+"..."+person1.getAge());
}
}
小结:
1.知道private的作用吗? 私有成员 别的类不能直接调用
2.知道get/set方法的作用吗? setxxx 为属性赋值 getxxx获取属性值
3.知道空参构造的作用吗?new对象 不写jvm默认给一个
4.知道有参构造的作用吗? new对象 为属性赋值
5.知道this的作用吗? 区分重名的成员变量和局部变量
6.会快捷键吗? alt+insert
第三章.继承
1.什么是继承
1.父类怎么出来的:
定义多个类之后,发现重复的内容太多了
我们没有必要每个类都要写一遍共性的代码
所有,我们定义一个类,将共性的代码放到这个类中,此类就是"父类",其他的类就可以继承这个"父类",就可以使用父类中抽取出来的共性的代码
2.继承:更倾向于是一种代码的设计理念
3.注意:
子类可以继承父类中的私有和非私有成员
但是在子类中不能使用私有成员
4.继承概念不要从"拥有"层面去理解
要从"是否能使用"层面去理解
2.继承如何使用
1.关键字: extends
2.使用: 子类 extends 父类
public class YuanGong {
String name;
int age;
}
public class Teacher extends YuanGong{
//特有功能
public void teach(){
System.out.println("涛哥正在讲课");
}
}
public class Test01 {
public static void main(String[] args) {
//创建讲师类对象
Teacher teacher = new Teacher();
teacher.name = "涛哥";
teacher.age = 16;
System.out.println(teacher.name+"..."+teacher.age);
}
}
在java中类都是有父类的
1.如果一个类明确表示 extends 父类 那么此类的父类就是extends后面的那个父类
2.如果一个类明确表示extends 父类,那么此类的父类 默认是Object类
3.Object是java中所有类的父类
3.继承中,成员变量和成员方法的访问特点
23.1 成员变量
3.1.1 子类和父类中的成员变量不重名:
如果new的是父类,只能调用父类自己的成员变量
如果new的是子类对象,既能调用自己的,还能调用从父类中继承过来的
public class Fu {
int numFu = 100;
}
public class Zi extends Fu{
int numZi = 10;
}
public class Test01 {
public static void main(String[] args) {
//创建父类对象
Fu fu = new Fu();
System.out.println(fu.numFu);
/*
因为numZi是子类特有的
父类对象不能调用子类中特有成员
*/
//System.out.println(fu.numZi);
//创建子类对象
Zi zi = new Zi();
System.out.println(zi.numZi);
System.out.println(zi.numFu);
}
}
2.1.2.子类和父类中的成员变量重名
如果是父类对象,调用父类中的成员变量
如果是子类对象,调用的是子类中(子类中有,先调用子类的,如果子类没有,找父类中的成员变量)->子债父偿
public class Fu {
int num = 100;
}
public class Zi extends Fu {
int num = 10;
}
public class Test01 {
public static void main(String[] args) {
//创建父类对象
Fu fu = new Fu();
System.out.println(fu.num);//父类中的num 100
//创建子类对象
Zi zi = new Zi();
System.out.println(zi.num);//10
}
}
在继承的前提下,成员变量有一个通用的访问方式:
看等号左边是谁,就调用谁,如果是子类子类没有,找父类
2.2 成员方法
2.2.1.子类和父类中的成员方法不重名:
public class Fu {
public void methodFu(){
System.out.println("我是父类中的method方法");
}
}
public class Zi extends Fu {
public void methodZi(){
System.out.println("我是子类中的method方法");
}
}
public class Test01 {
public static void main(String[] args) {
//创建父类对象
Fu fu = new Fu();
fu.methodFu();
//fu.methodZi();错误,methodZi是子类中特有的,父类类型调用不了
//创建子类对象
Zi zi = new Zi();
zi.methodZi();
zi.methodFu();
}
}
2.2.2.子类和父类中的成员方法重名
public class Fu {
public void method(){
System.out.println("我是父类中的method方法");
}
}
public class Zi extends Fu {
public void method(){
System.out.println("我是子类中的method方法");
}
}
public class Test01 {
public static void main(String[] args) {
//创建父类对象
Fu fu = new Fu();
fu.method();//父类中的方法
//创建子类对象
Zi zi = new Zi();
zi.method();//子类中的method方法
}
}
在继承的前提下,成员方法通用的访问特点:
看new的是谁,就先调用谁的成员方法,如果new的是子类,子类没有,找父类
4.方法的重写
1.前提:必须是在继承的前提下
2.概述:子类中有一个和父类一样的方法(包括方法名,参数列表)
3.如何去判定一个方法是否为重写的方法呢?
在方法上:写 @Override->只要是@Override不报错,证明此方法为重写的方法
public class Fu {
public void method(){
System.out.println("我是父类中的method方法");
}
}
public class Zi extends Fu {
@Override
public void method(){
System.out.println("我是子类中的method方法");
}
}
public class Test01 {
public static void main(String[] args) {
Fu fu = new Fu();
fu.method();
Zi zi = new Zi();
zi.method();
}
}
重写的方法访问特点:如果new的是子类对象,调用的是子类中重写的方法,子类没有,找父类
4.1.注意事项
1. 子类方法重写父类方法,必须要保证权限大于等于父类权限。(权限指的是权限修饰符)
public->protected->默认->private
2. 子类方法重写父类方法,返回值类型、函数名和参数列表都要一模一样。
3. 私有方法不能被重写
4.2.使用场景
1.重写的方法使用场景:用于功能的更新
public class HanBing {
public void Q(){
System.out.println("加攻速,减速");
}
public void W(){
System.out.println("万箭齐发");
}
public void E(){
System.out.println("鹰击长空");
}
public void R(){
System.out.println("魔法水晶箭");
}
}
public class NewHanBing extends HanBing{
public void E(){
System.out.println("鹰击长空,看视野,带有魔法伤害");
}
}
public class Test {
public static void main(String[] args) {
NewHanBing newHanBing = new NewHanBing();
newHanBing.Q();
newHanBing.W();
newHanBing.E();
newHanBing.R();
}
}
小结:
重写:子类中写一个和父类一样的方法
使用场景:想对父类中某一个方法进行优化升级,就 可以使用重写,不升级的功能直接继承过来
5.继承中构造的特点
1.注意:
初始化子类对象是先初始化父类对象
2.原因:
构造中默认第一行会有一个super()-> super() 代表的是 父类构造方法
public class Fu {
public Fu(){
System.out.println("我是父类中的空参构造");
}
}
public class Zi extends Fu{
public Zi(){
super();
System.out.println("我是子类中的空参构造");
}
}
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
6.super和this的具体使用
6.1 super的具体使用
1.概述:super代表的是父类对象
2.作用:调用父类中的成员(构造,成员变量,成员方法)
3.使用:
调用父类的构造方法: 在子类的构造方法中写-> super()->父类的空参构造
super(实参)->父类的有参构造
调用父类的成员变量: 在子类中写 -> super.成员变量名
调用父类的成员方法: 在子类中写 -> super.成员方法名() 或者 super.成员方法名(实参)
4.注意:
只要在构造中用super,不管是super()还是super(参数)都要在构造第一行
public class Fu {
int num = 100;
public Fu(){
System.out.println("我是父类中的空参构造");
}
public Fu(int i){
System.out.println("我是父类中的有参构造");
}
public void method(){
System.out.println("我是父类中的method方法");
}
}
public class Zi extends Fu{
int num = 10;
public Zi(){
//调用父类中的空参构造,不是继承过来的
//super();
//调用父类中的有参构造,不是继承过来的
super(1);
}
public void method(){
System.out.println(super.num);//父类中的num
super.method();//父类中的method方法
}
}
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
}
}
6.2 this的具体使用
1.概述:
代表的是当前对象
哪个对象调用的this所在的方法,this就代表哪个对象
this可以区分重名的成员变量和局部变量
2.使用:
调用当前类的构造-> 在当前类构造中写 -> this():当前类的空参构造
this(参数):当前类的有参构造
调用当前类的成员变量 -> 在当前类中写 ->this.成员变量名
调用当前类的成员方法 -> 在当前类中写 -> this.成员方法名()或者 this.成员方法名(实参)
public class Zi {
int num = 100;
public Zi(){
//调用当前类的有参构造
//this(1);
System.out.println("我是当前类的无参构造");
}
public Zi(int i){
//调用当前类中的空参构造
//this();
System.out.println("我是当前类的有参构造");
}
public void method01(){
int num = 10;
System.out.println(num);//局部变量num 就近原则
System.out.println(this.num);//成员变量num
this.method02();//调用的是当前类的成员方法
method02();
}
public void method02(){
System.out.println("我是method02方法");
}
}
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method01();
}
}
注意:
不能再 用一个构造方法中同时使用super和this
因为super要求在构造第一行,this也要在构造第一行
所以,super和this都出现时,就冲突了
7.继承的特点
1.继承只支持单继承,不能多继承
一个儿子只能有一个亲爹
2.继承支持多层继承
3.一个父类可以有多个子类
8.问题:如何为父类中private的成员变量赋值(经验值)
//员工类
public class Employee {
private String name;
private int age;
public Employee() {
}
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Teacher extends Employee{
public Teacher(){
}
public Teacher(String name,int age){
super(name,age);
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
/*teacher.name = "涛哥";
teacher.age = 14;
System.out.println(teacher.name+"..."+teacher.age);*/
teacher.setName("涛哥");
teacher.setAge(12);
System.out.println(teacher.getName()+"..."+teacher.getAge());
System.out.println("======================");
//利用有参构造为父类中private属性赋值
Teacher teacher1 = new Teacher("杨幂", 32);
System.out.println(teacher1.getName()+"..."+teacher1.getAge());
}
}
第四章.代码块
4.1构造代码块
1.格式:
{
代码
}
2.执行特点:
构造代码块优先于构造方法执行,每new一次,构造代码块就执行一次
public class Person {
//构造方法
public Person(){
System.out.println("我是构造方法");
}
//构造代码块
{
System.out.println("我是构造代码块");
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
Person person1 = new Person();
}
}
4.2静态代码块
1.格式:
static{
代码
}
2.执行特点:
优先于构造方法以及构造代码块执行的,只执行一次
public class Person {
//构造方法
public Person(){
System.out.println("我是构造方法");
}
//构造代码块
{
System.out.println("我是构造代码块");
}
//静态代码块
static{
System.out.println("我是静态代码块");
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
Person person1 = new Person();
}
}
4.3.静态代码块使用场景
1.如果想让一段代码最先执行,并且只执行一次,就用静态代码块