面向对象高级(staticextends)
前面我们说过面向对象最核心的套路是设计对象来处理数据解决问题。一、静态(static)关键字static读作静态可以用来修饰成员变量也能修饰成员方法。我们先来学习static修饰成员变量。1.1 static修饰成员变量Java中的成员变量按照有无static修饰分为两种类变量、实例变量。类变量有static修饰属于类在计算机里只有一份会被类的全部对象共享实例变量(对象的变量)无static修饰属于每个对象的由于静态变量是属于类的只需要通过类名就可以调用类名.静态变量实例变量是属于对象的需要通过对象才能调用对象.实例变量类变量属于类与类一起加载一次在内存中只有一份可以被类和类的所有对象共享。实例变量属于对象每个对象中都有一份只能用对象访问。1.2static修饰成员方法各位同学学习完static修饰成员变量之后接下来我们学习static修饰成员方法。成员方法根据有无static也分为两类类方法、实例方法类方法有static修饰的方法属于类的调用时直接用类名调用即可。实例方法无static修饰的方法是属于对象的调用时需要使用对象调用。我们看一个案例演示类方法、实例方法的基本使用先定义一个Student类在类中定义一个类方法、定义一个实例方法public class Student{ double score; //类方法 public static void printHelloWorld(){ System.out.println(Hello World!); System.out.println(Hello World!); } //实例方法对象的方法 public void printPass(){ //打印成绩是否合格 System.out.println(score60?成绩合格:成绩不合格); } }在定义一个测试类注意类方法、对象方法调用的区别public class Test2{ public static void main(String[] args){ //1.调用Student类中的类方法 Student.printHelloWorld(); //2.调用Student类中的实例方法 Student s new Student(); s.printPass(); //使用对象也能调用类方法【不推荐IDEA连提示都不给你你就别这么用了】 s.printHelloWorld(); } }1.3 static的注意事项各位同学到现在在我们已经学会了static修饰的变量、方法如何调用了。但是有一些注意事项还是需要给大家说明一下目的是让大家知道使用static写代码时如果出错了要知道为什么错、如何改正。1.类方法中可以直接访问类的成员不可以直接访问实例成员。2.实例方法中既可以直接访问类成员也可以直接访问实例成员。3.实例方法中可以出现this关键字类方法中不可以出现this关键字的。public class Student { static String schoolName; // 类变量 double score; // 实例变量 // 1、类方法中可以直接访问类的成员不可以直接访问实例成员。 public static void printHelloWorld(){ // 注意同一个类中访问类成员可以省略类名不写。 schoolName 胜雅; printHelloWorld2(); System.out.println(score); // 报错的 printPass(); // 报错的 System.out.println(this); // 报错的 } // 类方法 public static void printHelloWorld2(){ } // 实例方法 public void printPass2(){ } // 实例方法 // 2、实例方法中既可以直接访问类成员也可以直接访问实例成员。 // 3、实例方法中可以出现this关键字类方法中不可以出现this关键字的 public void printPass(){ schoolName 胜雅2; //对的 printHelloWorld2(); //对的 System.out.println(score); //对的 printPass2(); //对的 System.out.println(this); //对的 } }1.4 static应用代码块我们先学习静态代码块静态代码块格式static{ }特点类加载时自动执行由于类只会加载一次所以静态代码块也只会执行一次。作用完成类的初始化例如对类变量的初始化赋值。public class Student { static int number 80; static String schoolName 胜雅1; // 静态代码块 static { System.out.println(静态代码块执行了~~); schoolName 胜雅2; } }public class StuDemo { public static void main(String[] args) { // 目标认识两种代码块了解他们的特点和基本作用。 System.out.println(Student.number); System.out.println(Student.schoolName); // 胜雅2 } }静态代码块不需要创建对象就能够执行再来学习一下实例代码块实例代码块格式{ }特点每次创建对象时执行实例代码块并在构造器前执行。作用和构造器一样都是用来完成对象的初始化的例如对实例变量进行初始化赋值。public class Student{ //实例变量 int age; //实例代码块实例代码块会执行在每一个构造方法之前 { System.out.println(实例代码块执行了~~); age 18; System.out.println(有人创建了对象 this); } public Student(){ System.out.println(无参数构造器执行了~~); } public Student(String name){ System.out.println(有参数构造器执行了~~); } }public class Test { public static void main(String[] args) { Student s1 new Student(); Student s2 new Student(柳岩); System.out.println(s1.age); System.out.println(s2.age); } }1.5 static应用单例设计模式各位同学关于static的应用我们再补充一个使用的技巧叫做单例设计模式。什么是设计模式Design pattern一个问题通常有n种解法其中肯定有一种解法是最优的这个最优的解法被人总结出来了称之为设计模式。设计模式有20多种对应20多种软件开发中会遇到的问题。单例设计模式一个类有且仅有一个实例并且自行实例化向整个系统提供。写法把类的构造器私有。定义一个类变量记住类的一个对象。定义一个类方法返回对象。代码展示如下// 单例类 public class A { // 2、定义一个类变量记住类的一个对象 private static A a new A();; // 1、私有构造器 private A(){ } // 3、定义一个类方法返回对象 public static A getObject(){ return a; } }public class ATest { public static void main(String[] args) { // 目标掌握单例设计模式的写法。 A a1 A.getObject(); A a2 A.getObject(); System.out.println(a1); System.out.println(a2); } }单例应用场景任务管理器对象、获取运行时对象。在这些业务场景下使用单例模式可以避免浪费内存。二、继承(extends)2.1 继承快速入门什么是继承Java中提供了一个关键字extends用这个关键字可以让一个类和另一个类建立起父子关系。继承的特点·子类能继承父类的非私有成员成员变量、成员方法。继承后对象的创建子类的对象是由子类、父类共同完成的。使用继承的好处减少重复代码的编写。2.2 权限修饰符什么是权限修饰符呢权限修饰符是用来限制类的成员成员变量、成员方法、构造器...能够被访问的范围。private只能本类缺省本类、同一个包中的类protected本类、同一个包中的类、子孙类中public任意位置2.3 单继承、ObjectJava语言只支持单继承不支持多继承但是可以多层继承Object类Object类是java所有类的祖宗类。我们写的任何一个类其实都是object的子类或子孙类。public class Test { public static void main(String[] args) { // 目标掌握继承的两个注意事项事项。 // 1、Java是单继承的一个类只能继承一个直接父类 // 2、Object类是Java中所有类的祖宗。 A a new A(); B b new B(); ArrayList list new ArrayList(); list.add(java); System.out.println(list.toString()); } } class A {} //extends Object{} class B extends A{} // class C extends B , A{} // 报错 class D extends B{}2.4 方法重写什么是方法重写当子类觉得父类方法不好用或者无法满足父类需求时子类可以重写一个方法名称、参数列表一样的方法去覆盖父类的这个方法这就是方法重写。注意重写后方法的访问遵循就近原则。下面我们看一个代码演示//父类 public class A { public void print1(){ System.out.println(111); } public void print2(int a, int b){ System.out.println(111111); } }public class B extends A{ // 方法重写 Override // 安全可读性好 public void print1(){ System.out.println(666); } // 方法重写 Override public void print2(int a, int b){ System.out.println(666666); } }//测试类 public class Test { public static void main(String[] args) { // 目标认识方法重写掌握方法重写的常见应用场景。 B b new B(); b.print1(); b.print2(2, 3); } }注意私有方法、静态方法不能被重写如果重写会报错。2.5 子类中访问成员的特点原则在子类中访问其他成员成员变量、成员方法是依据就近原则的先子类局部范围找。然后子类成员范围找。然后父类成员范围找如果父类范围还没有找到则报错。如果子父类中出现了重名的成员如果此时一定要在子类中使用父类的怎么办使用super.父类成员变量/父类成员方法2.6 子类中访问构造器的特点子类构造器是如何实现调用父类构造器的?默认情况下子类全部构造器的第一行代码都是 super() 写不写都有它会调用父类的无参数构造器。如果父类没有无参数构造器则我们必须在子类构造器的第一行手写super(….)指定去调用父类的有参数构造器。如果不想使用默认的super()方式调用父类构造器还可以手动使用super(参数)调用父类有参数构造器。总结:子类构造器可以通过调用父类构造器把对象中包含父类这部分的数据先初始化赋值再回来把对象里包含子类这部分的数据也进行初始化赋值。在本类中访问自己的构造方法刚才我们学习了通过super()和super(参数)可以访问父类的构造器。有时候我们也需要访问自己类的构造器。语法如下:this()调用本类的空参构造器this(参数)调用本类有参数的构造器注意this(…) 、super(…) 都只能放在构造器的第一行因此有了this(…)就不能写super(…)了反之亦然。this和super的用法总结this: 代表本类对象的引用(访问本类成员)this.成员变量 //访问本类成员变量this.成员方法 //调用本类成员方法this() //调用本类空参数构造器this(参数) //调用本类有参数构造器super: 代表父类对象的引用(访问父类成员)super.成员变量 //访问父类成员变量super.成员方法 //调用父类成员方法super() //调用父类空参数构造器super(参数) //调用父类有参数构造器注意this和super访问构造方法只能用到构造方法的第一行否则会报错。这次的分享就到这里了宝子们下期见哦我们都会越来越好的~