day08.封装+标准JavaBean+继承+代码块
课前回顾:1.可变参数a.什么时候使用:参数的类型确定但是个数不确定b.格式:数据类型...变量名c.本质:数组d.注意:参数位置只能有一个可变参数,而且只能放到最后2.递归:a.概述:方法自己调用自己->直接递归方法互相调用->间接递归b.注意:递归的时候需要求条件,保证递归退出不要递归次数过多3.对象数组:存储的是对象的地址值(地址值就代表一个对象),取出来的还是对象地址值(地址值就代表一个对象)4.二分查找a.概述:每次查找都干掉一半,从中间索引开始查询b.中间索引:(min+max)/2c.查询过程:key>arr[mid]->min = mid+1key<arr[mid]->max = mid-15.命令行参数通过命令行给main方法中的String[]赋值->没啥用6.封装:a.将细节隐藏起来,再将该暴露的暴露出来b.比如:定义一个方法,方法的具体实现就是细节,将细节放到方法体中对外提供方法名,方便别人调用将成员变量私有化->private(被private修饰的成员只能此类内部使用,外界不能直接调用)针对于私有化的成员变量提供了getxxx/setxxx方法getxxx:获取属性值setxxx:为属性赋值今日重点:1.会利用this关键字区分重名的成员变量和局部变量2.利用无参构造创建对象3.利用有参构造创建对象并为属性赋值4.如何快速编写一个标准的javabean5.会编写继承,成员的访问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());}}
![day08[封装_标准JavaBean_继承_代码块] - 图1](/uploads/projects/liuye-6lcqc@vk53cd/e6a49edaec1a9e6d7497bde675506b27.png)
ps:
如果成员变量没有被private修饰,我们可以提供get/set 也可以不提供get/set
如果成员变量被private修饰了,我们就必须提供get/set方法了
2.this的介绍
1.注意:在一个方法中局部变量和成员变量重名时,遵循"就近原则",先操作局部的2.thisa.概述:代表的当前对象哪个对象调用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("张作霖");}}
![day08[封装_标准JavaBean_继承_代码块] - 图2](/uploads/projects/liuye-6lcqc@vk53cd/147fff8599671f3fc780ff386b0006c0.png)
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());}}
![day08[封装_标准JavaBean_继承_代码块] - 图3](/uploads/projects/liuye-6lcqc@vk53cd/e837fe43c69541c2aa4c6389a5f6c8b0.png)
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());}}
![day08[封装_标准JavaBean_继承_代码块] - 图4](/uploads/projects/liuye-6lcqc@vk53cd/bdadc3a640911b2e419d13f8a685b5b5.png)
小结: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->专门装实体类
![day08[封装_标准JavaBean_继承_代码块] - 图5](/uploads/projects/liuye-6lcqc@vk53cd/1975b4eba3c860ba424bb045dddeafdc.png)
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.继承概念不要从"拥有"层面去理解要从"是否能使用"层面去理解
![day08[封装_标准JavaBean_继承_代码块] - 图9](/uploads/projects/liuye-6lcqc@vk53cd/189bae2f47412da61585d0e788eb01b6.png)
2.继承如何使用
1.关键字: extends2.使用: 子类 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 {@Overridepublic 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->默认->private2. 子类方法重写父类方法,返回值类型、函数名和参数列表都要一模一样。3. 私有方法不能被重写
4.2.使用场景
1.重写的方法使用场景:用于功能的更新
![day08[封装_标准JavaBean_继承_代码块] - 图10](/uploads/projects/liuye-6lcqc@vk53cd/b2df9ccdbbfe380817dd93818dd0857e.png)
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);//父类中的numsuper.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);//成员变量numthis.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());}}
![day08[封装_标准JavaBean_继承_代码块] - 图11](/uploads/projects/liuye-6lcqc@vk53cd/b66737beb08df896ea742af584568f4f.png)
第四章.代码块
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.如果想让一段代码最先执行,并且只执行一次,就用静态代码块
![day08[封装_标准JavaBean_继承_代码块] - 图12](/uploads/projects/liuye-6lcqc@vk53cd/5dd8d4e6f509f118bcb2a40c97096485.png)
![day08[封装_标准JavaBean_继承_代码块] - 图6](/uploads/projects/liuye-6lcqc@vk53cd/877160f4d7596fb34b9fa0b6c2316be4.png)
![day08[封装_标准JavaBean_继承_代码块] - 图7](/uploads/projects/liuye-6lcqc@vk53cd/ff001d1b5f5e6d5250550c066a48e0d4.png)
![day08[封装_标准JavaBean_继承_代码块] - 图8](/uploads/projects/liuye-6lcqc@vk53cd/73071b3eb3e5645651b8b89b1050ae3b.png)
