day08

08.01 面向对象(代码块的概述和分类)
  A.代码块概述
  在Java中,使用{}括起来的代码被称为代码块
  B.代码块分类
  根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解
  C.常用代码块的应用
  a.局部代码块
    在方法中出现:限定变量声明周期,及早释放
  b.构造代码块
    在类中方法外出现:多个构造方法中相同的代码存放在一起,每次调用,构造都执行,并且在构造方法之前执行
    如果我们想在每一个方法中调用study()方法,可以将其调用方式写道构造代码块里面

public class day08_01 {
    //如果我们想在每一个方法中调用study()方法,可以将其调用方式写道构造代码块里面
    public static void main(String[] args) {
        {
            int x =10;           //限定变量的声明周期
            System.out.println(x);
        }
        Student s1 = new Student();    //空参

        Student s2 = new Student("张三",23);
    }

}
class Student{
    private String name;
    private int age;
    
    public Student(){
        //study()
        System.out.println("我是空参");
    }
    public Student(String name,int age){
        //study()
        System.out.println("我是有参");
        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;
    }
    //构造代码块优先构造方法前执行
    {
//        System.out.println("我是构造代码块");
        study();
    }
    public void study(){
        System.out.println("学生学习");
    }
}
View Code

  c.静态代码块
    在类中方法外出现,加了static修饰
    在类中方法外出现,并加上static修饰,用于始类进行初始化,在加载的时候就执行,只执行一次

public class day08_01 {
    //如果我们想在每一个方法中调用study()方法,可以将其调用方式写道构造代码块里面
    public static void main(String[] args) {
        {
            int x =10;           //限定变量的声明周期
            System.out.println(x);
        }
        Student s1 = new Student();    //空参

        Student s2 = new Student("张三",23);
    }

}
class Student{
    private String name;
    private int age;
    
    public Student(){
        //study()
        System.out.println("我是空参");
    }
    public Student(String name,int age){
        //study()
        System.out.println("我是有参");
        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;
    }
    //构造代码块优先构造方法前执行
    {
//        System.out.println("我是构造代码块");
        study();
    }
    public void study(){
        System.out.println("学生学习");
    }
    //静态代码块只执行一次,随着类的加载而加载
    static{
        System.out.println("我是静态代码块");
    }
}
View Code

  一般用于加载驱动

08.03 面向对象(继承案例演示)
  A.继承(extend)
  类与类之间,子父类
  B.继承案例演示
  动物类,猫类,狗类
  定义两种属性(颜色,腿的个数)
  C.案例演示
  继承狗
  D.案例演示
  使用继承后

public class day08_03 {
    public static void main(String[] args) {
        Cat c = new Cat();
        c.color = "flower";
        c.leg =4;
        c.eat();
        c.sleep();
        System.out.println(c.leg + "..." + c.color);
    }

}
class Animal{
    String color;
    int leg;
    public void eat(){
        System.out.println("吃饭");
    }
    public void sleep(){
        System.out.println("睡觉的功能");
    }
}
class Cat extends Animal{
    
}
class Dog extends Animal{
    
}
View Code

08.04 面向对象(继承的好处和弊端)
  A.继承的好处
  a.提高了代码的复用性
  b.提高了代码的维护性
  c.让类与类之间产生了关系,是多态的前提
  B.继承的弊端
  类的耦合性增强了
  开发的原则:高内聚,低耦合
    耦合:类与类的关系
    内聚:就是自己完成某件事的能力

08.05 面向对象(继承的特点)
  A .Java中类的继承特点
  a.Java只支持单继承,不支持多继承(一个儿子只有一个爸)
  b.java支持多层继承
  B.案例演示
  Java继承特点
  如果想用这个体系的所有功能用最底层的类创建对象
  如果想看这个体系的共性功能,看最顶层的类

//多层继承,不能多继承
public class day08_005 {
    public static void main(String[] args) {
        DemoC c = new DemoC();
        c.show();
    }

}
class DemoA{
    public void show(){
        System.out.println("DemoA");
    }
}
class DemoB extends DemoA{
    public void show(){
        System.out.println("DemoB");
    }
}
class DemoC extends DemoB{
    public void show(){
        System.out.println("DemoC");
    }
}
View Code

08.06 面向对象(继承中构造方法的关系)
  A.继承的注意事项
  a.子类不能继承父类的私有方法
  b.子类不能继承父类的构造方法
  c.不要为了部分功能而去继承
    项目经理 姓名 工号 工资 奖金
    程序员 姓名 工号 工资
  B.什么时候使用继承
  继承其实体现的是一种继承关系:“is a”
08.07 面向对象()
  A.案例演示
  a.不同名的变量
  b.同名的变量
08.08 面向对象(this和super的区别和应用)
  A.this和super都代表了什么
  this 代表当前对象的引用,谁来调用我,我就代表谁
  super 调用当前父类的引用
  B.this和super的区别
  a.调用成员变量
    this.成员变量 调用本类的成员变量,可以调用父类的成员变量
    super.成员变量 调用父类的成员变量
  b.调用构造方法
    this(...) 调用本类的构造方法
    super(...) 调用父类的构造得到
  c.调用成员方法
    this.成员方法 调用本类的成员方法,可以调用父类的方法
    super.成员方法 调用父类的成员方法

public class day08_07 {
    public static void main(String[] args){
        Son1 s = new Son1();
        s.print();
    }
}
/*A.案例演示
    a.不同名的变量
    b.同名的变量*/
class Father1{
    int num1 =10;
    int num2 = 30;
}
class Son1 extends Father1{
    int num2 = 20;              //同名的变量,,就近原则
    
    public void print(){
        System.out.println(this.num1);   //this可以调用子类的,也可以调用父类的
        System.out.println(num2);
        System.out.println(super.num2);  //super调用父类的
    }
}
View Code

08.09 面向对象(继承中构造方法的关系)

  A.案例演示
  子类中所有的构造方法默认都会访问父类中空参的构造方法
  B.为什么呢?
  因为子类会继承父类中的数据,可能还会使用父类的构造方法
  所以,子类初始化之前,一定要先完成父类数据的初始化
  其实:
    每一个构造方法的第一条语句默认都是:super()在这里简单提一句,object类,

public class day08_09 {
    //子类中所有的构造方法默认都会访问父类中空参的构造方法 
    public static void main(String[] args) {
        Son9 s = new Son9();
        
    }

}
class Father9{
    public Father9(){
        System.out.println("Father构造方法");
    }
}
class Son9 extends Father9{    //子类继承父类
    public Son9(){
//        super();               //隐藏该语句,用来访问父类中的空参构造
        System.out.println("Son的构造方法");
    }
}

运行结果:
 Father构造方法
 Son的构造方法
View Code

08.10 面向对象(继承中构造方法的注意事项)
  A.案例演示
  父类没有无参构造方法,子类怎么办
    super()
    this()
  B.注意事项
  super(...)或者this(...)

public class day08_10 {
    /*   A.案例演示
              父类没有无参构造方法,子类怎么办
                  super()
                  this()        
     */
    public static void main(String[] args) {
        Son10 s1 = new Son10();
        System.out.println(s1.getName()+"..."+s1.getAge());
        System.out.println("----------------");
        Son10 s2 = new Son10("张三",23);                           //第1部
        System.out.println(s2.getName()+"..."+s2.getAge());    //第5部
    }
}
class Father10{
    private String name;                                        //第4部
    private int age;
    //2.空参,有参构造方法
    public Father10(){     //此处隐藏了super(),先输出父类空参构造
        System.out.println("Father空参构造");
    }
    public Father10(String name,int age){                        //第3部
        this.name = name;
        this.age=age;
        System.out.println("Father有参构造");
    }
    //set,get方法
    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;
    }
}
//子继承父
class Son10 extends Father10{
    public Son10(){
        //super("王五",25);                //调用父类的构造方法
        this("王五",25);                 //调用本类的构造方法,就是下面的有参构造Son10(String name,int age)
        System.out.println("Son 空参构造");
    }
    public Son10(String name,int age){                           //第2部
        super(name,age);                        //super进行访问
        System.out.println("Son 有参构造");
    }
}

运行结果:
Father有参构造
Son 有参构造
Son 空参构造
王五...25
----------------
Father有参构造
Son 有参构造
张三...23
View Code

08.11 面向对象(继承中的面试题)

class day08_11 {
    public static void main(String[] args){
        Zi z = new Zi();
        z.show();
    }
}
class Fu{
    public int num = 10;
    public Fu(){      //调用该构造方法是隐藏super()
        System.out.println("fu");
    }
}
class Zi extends Fu{
    public int num = 20;
    public Zi(){
        System.out.println("zi");
    }
    public void show(){
        int num = 30;
        System.out.println(num);
        System.out.println(this.num);
        System.out.println(super.num);
    }
}

运行结果是:
隐藏了super()方法
fu
zi
30
20
10
View Code
/*
 1.jvm调用了main方法,main进栈
 2.遇到Zi22 z = new Zi22();会将Fu.class和Zi.class分别加载进内存,再创建对象,当Fu.class加载进内存
     父类的静态代码块会随着Fu.class一起加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
     第一个输出,静态代码块Fu,第二个输出,静态代码块Zi
 3.走Zi类的构造方法,因为Java中是分层初始化的,先初始化父类,再初始化子类,先走父类构造,但在执行父类构造时,发现,父类有构造代码块,构造代码块是
    优先于构造方法执行,第三个输出构造代码块Fu,第四个输出构造代码块Zi
 4.Fu类初始化结束,子类初始化,第五个是构造代码块zi,构造方法*/
public class day08_12 {
    public static void main(String[] args) {
        Zi22 z = new Zi22();
    }
}
class Fu22{
    static{
        System.out.println("静态代码块Fu");
    }
    {
        System.out.println("构造代码块Fu");
    }
    public Fu22(){
        System.out.println("构造方法Fu");
    }
}
class Zi22 extends Fu22{
    static{
        System.out.println("静态代码块Zi");
    }
    {
        System.out.println("构造代码块Zi");
    }
    public Zi22(){
        System.out.println("构造方法Zi");
    }
}
View Code

08.12 面向对象(继承中成员的方法关系)
A.案例演示
  a.不同名的方法
  b.同名的方法

/*
A.案例演示
      a.不同名的方法
      b.同名的方法*/
public class day08_12 {
    public static void main(String[] args) {
        Son12 a = new Son12();
        a.print();
        a.method();
    }
}
class Father12{
    public void print(){
        System.out.println("Fu print");
    }
}
class Son12 extends Father12{
    public void method(){
        System.out.println("Zi print");
    }
    public void print(){               //子父类出现相同的方法
        super.print();                    //如果还想调用父类的方法,用super.方法名进行调用
        System.out.println("Zi print");
    }
}
运行结果:
Fu print
Zi print
Zi print
View Code

08.13 面向对象(继承中成员方法关系)
  A.什么是方法重写
  重写:子父类出现了一模一样的方法
  B.方法重写的应用
  当子类需要父类的功能,而子类又有自己的特点,可以重写父类的方法
  C.案例演示
  定义一个手机类

public class day08_13 {
    public static void main(String[] args) {
        IOS8 i =new IOS8();
        i.siri();
        i.call();          //直接调用父类的方法
    }

}
class IOS7{
    public void call(){
        System.out.println("call Phone");
    }
    public void siri(){
        System.out.println("speak English");
    }
}
class IOS8 extends IOS7{
    public void siri(){
        System.out.println("speak Chinese");
        super.siri();     //调用父类的
    }
}
View Code

08.14 面向对象(方法重写的注意事项)
  A.方法重写注意事项
  a.父类中私有方法不能被重写
    因为父类私有方法子类根本无法继承
  b.子类重写父类方法时,访问权限不能更低
    最好一致
  c.父类静态方法,子类也必须通过静态方法进行重写
    其实算不上方法重写,但是现象的确如此,至于为什么算不上,多态会讲
  B.案例演示
08.15 面向对象(方法重写的面试题)
  A.方法重写的面试题
  override和overload的区别
  overload可以改变返回值类型,只看参数列表
  override,子类出现了和父类中方法声明一模一样的方法,与返回值有关,返回值必须是一致的

08.16 面向对象(使用继承前的学生和老师案例)
  A.案例演示
  使用继承前的学生和老师案例
    属性:姓名 年龄
    行为:吃饭
  老师有特有的方法:讲课
  学生有特有的方法:学习

public class day08_16 {
    public static void main(String[] args) {
        Student16 s1 =new Student16();            //调用的时空参构造,进行赋值
        s1.setName("张三");
        s1.setAge(23);
        System.out.println(s1.getName()+"..."+s1.getAge());
        s1.eat();
        s1.study();
        System.out.println("-------------------");
        Student16 s2= new Student16("李四",24);
        System.out.println(s2.getName()+"..."+s2.getAge());
        s2.eat();
        s2.study();
    }
}
/*属性:姓名 年龄
    行为:吃饭
    老师有特有的方法:讲课
    学生有特有的方法:学习*/
class Person{
    private String name;
    private int age;
    //空参,有参构造
    public Person(){}
    public Person(String name,int age){    
    }
    //set,get
    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 void eat(){
        System.out.println("eat");
    }
    public void study(){
        System.out.println("study");
    }
}
class Student16 extends Person{
    public Student16(){
    }
    public Student16(String name,int age){
        super(name,age);
    }
    public void study(){
        System.out.println(this.getName()+"student study");  //this.getName()调用父类的变量
    }
}
class Teacher extends Student16{
    public Teacher(){}
    public Teacher (String name,int age){
        super(name,age);
    }
    public void teach(){
        System.out.println("teach");
    }
}
View Code

08.17 面向对象(使用继承前的学生和老师案例)
  A.案例演示
  使用继承前的学生和老师案例
    属性:姓名 年龄
    行为:吃饭
   老师有特有的方法:讲课
   学生有特有的方法:学习

public class day08_18 {
    public static void main(String[] args) {
        Cat18 c1 = new Cat18("花",4);
        System.out.println(c1.getColor() + "..." +c1.getLeg());
        c1.eat();
        c1.catchMouse();
        Dog18 d1 = new Dog18();
        System.out.println(d1.getColor()+"..."+d1.getLeg());
        d1.eat();
        d1.lookhouse();
    }
}
class Animal18{
    private String color;
    private int leg;
    //
    public Animal18(){}
    public Animal18(String color, int leg){
        this.color = color;
        this.leg = leg;
    }
    //
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getLeg() {
        return leg;
    }
    public void setLeg(int leg) {
        this.leg = leg;
    }
    //
    public void eat(){
        System.out.println("eat");
    }
}
class Cat18 extends Animal18{
    public Cat18(){}
    public Cat18(String color,int leg){
        super(color,leg);
    }
    public void eat(){
        System.out.println("Cat eat fish");
    }
    public void catchMouse(){
        System.out.println("catch mouse");
    }
}
class Dog18 extends Animal18{
    public Dog18(){}
    public Dog18(String color,int leg){
        super(color,leg);
    }
    public void eat(){
        System.out.println("Cat eat fish");
    }
    public void lookhouse(){
        System.out.println("catch mouse");
    }
}
View Code

08.18 面向对象(猫狗案例分析,实现及测试)
  A.猫狗案例分析
  B.案例演示
  猫狗案例继承版
    属性:猫的颜色,腿的个数
    行为:吃饭
  猫特有的行为:抓老鼠catchMouse
  狗特有的行为:看家 look Home
08.19 面向对象(final关键字修饰类,方法以及变量的特点)
  A.final概述
  B.final修饰特点
  修饰类,类不能被继承
  修饰变量,变量就变成了常量,只能被赋值一次
  修饰方法,方法不能被重写
 C.案例演示
  final修饰特点
08.20 面向对象(final关键字修饰局部变量)
  A.案例演示
  方法内部或者方法声明上都演示一下
  基本类型,是值不能被改变
  引用类型,是地址不能被改变,对象中的属性可以改变
08.21 面向对象(final修饰变量的初始化时机)
  A.final修饰变量的初始化时机
  B.案例演示
08.22 zongjie

原文地址:https://www.cnblogs.com/chengxiaofeng/p/10391066.html