• 2018-12-03笔记


    构造方法只可以在创建对象时调用,用于初始化对象;

    在普通成员方法里面不可以this(“张三”);但是可以this.study();

    super关键字代表父类对象;

    在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式super();语句;

    Super()父类构造方法

    Super.study()父类中的study方法

    Super.name父类对象中的name属性

    在子类的构造方法中第一行默认有一个super(),默认调用父类的空参构造方法;

    //不写也有,写也有

    Super()必须要写在构造方法第一行;

    为什么子类对象创建都要访问父类中的构造方法?因为子类继承了父类的内容,所以创建对象时,必须要先看父类是如何对其内容进行初始化的;

    //初始化和清理,这里的作用就是初始化父类对象;

    无论到哪儿,子类的构造方法都会有一个super(),用来初始化父类对象,所以在创建类时,务必要提供一个无参构造方法;

    //如果父类没有无参构造,只有有参构造,那么super(传入实参);传入实参的super构造器也是可以的;

    //只是走一下父类的构造方法;

    //对父类的内容初始化;

    那么,子类中的构造方法为什么会有一句隐式的super()呢?

    原因:子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。这样,才可以使用父类中的内容。

    当父类中没有空参数构造方法时,子类的构造方法必须有显示的super语句,指定要访问的父类有参数构造方法;

    如果子类的构造方法第一行写了this调用了本类其他构造方法,那么super调用父类的语句还有吗?

    这时是没有的,因为this()或者super(),只能定义在构造方法的第一行,因为初始化动作要先执行;

    this和super关键字在构造方法中,只能在第一行,所以使用了this关键字之后,super就不存在了;

    只要子类构造方法能够直接或者间接调用父类构造方法(无餐/有参)即可;

    this()和super()只能写在构造方法中,在普通方法不可以有this()和super(),因为这两个是初始化对象的构造方法,只可以在创建对象时使用;在普通方法中使用this和super关键字则没有必须在第一行的要求,只有this()和super()这种形式要求必须在第一行;

    父类构造方法中是否有隐式的super呢?

    也是有的。记住:只要是构造方法默认第一行都是super();

    父类的父类是谁呢?super调用的到底是谁的构造方法呢?

    Java体系在设计,定义了一个所有对象的父类Object

    类中的构造方法默认第一行都有隐式的super()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。

    如果默认的隐式super()语句在父类中没有对应的构造方法,那么必须在构造方法中通过this或者super的形式明确要调用的构造方法。

    this功能:

    ①   调用本类的成员变量和成员方法

    ②   区分成员变量和局部变量同名问题

    ③   在构造方法中调用其他构造方法

    Final用法:修饰类,类的成员,以及局部变量;不能修饰构造方法!

    final修饰类不可以被继承,但是可以继承其他类!

    final修饰的方法不可以被子类重写,但父类中没有被final修饰方法,子类重写后可以加final;

    final修饰的变量称为常量,这些变量只能赋值一次,而且终身不变;

     

    final修饰局部变量(基本数据类型),一旦赋值终身不变;

    //静态常量才会变成蓝色(static final)

     

    final修饰局部变量(引用数据类型),一旦赋值一个地址终身不变;

     

    final修饰成员变量,需要在创建对象前初始化,负责报错;成员变量进堆,会给一个默认值,不手动赋值就没有意义了;要么手动赋值,要么构造方法赋值,只要在创建对象之前赋值就没问题,注意:SET方法是不可以的!!!

     

    package com.oracle.demo04;

    public class Person {

             //声明了常量之后,要么手动附初值,要么在构造方法中赋值,不可以在SET方法中赋值,因为常量要在创建对象分配地址之前赋值;

             final String name;

             public Person(String name){

                       this.name=name;

             }

    }

    package com.oracle.demo01;

    public class Student {

             private String name;

             private static String Schoolname;

             public Student(){

                       super();

             }

             public Student(String name, String schoolname) {

                       super();

                       this.name = name;

                       Schoolname = schoolname;

             }

             public String getName() {

                       return name;

             }

             public void setName(String name) {

                       this.name = name;

             }

             public String getSchoolname() {

                       return Schoolname;

             }

             public void setSchoolname(String schoolname) {

                       Schoolname = schoolname;

             }

    }

    package com.oracle.demo01;

    public class Test {

             public static void main(String[] args) {

                       Student s1=new Student("小红","清华大学");

                       Student s2=new Student("小明","清华大学");

                       Student s3=new Student("小亮","清华大学");

                       s2.setSchoolname("北京大学");

                       System.out.println(s1.getSchoolname()+"……"+s2.getSchoolname()+"……"+s3.getSchoolname());

             }

    }

    /*

     * 1.加载Test.class和Student.class

     *

     * 2.加载main方法和private static String Schoolname;进入方法与数据共享区(静态区)

     *

     * 3.main方法进栈,执行内容

     *

     * 4.new的对象进堆,由于Schoolname已经进入静态取,所以堆内只有String name

     *

     * 5.执行对象的构造方法,将小红赋值给堆中的String name,静态区中的Schoolname被赋值成清华大学

     *

     * 6.几个对象都是这个流程,最后把对象s2的学校改为北京大学,由于所有Student对象都指向这个静态区,所以所有对象都的Schoolname都变为北京大学了

     *

     * */

    被static修饰的成员变量属于类,不属于这个类的某个对象(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量);

    被static修饰的成员可以并且建议通过类名直接访问;

    静态内容是优先于对象存在,只能访问静态,不能使用this/super(本类对象/父类对象);静态修饰的内容存于静态区;

    同一个类中,静态成员只能访问静态成员(因为静态成员是和main方法一起出现的,静态成员出现的时候,普通成员还没出现);

    main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中;

    非静态成员可以访问静态成员,静态成员不可以访问非静态成员;

    静态&多态:

    package com.oracle.demo02;

    public class Fu {

             static int i=1;

             public static void f(){

                       System.out.println("这是父类静态方法");

             }

    }

    package com.oracle.demo02;

    public class Zi extends Fu{

             static int i=2;

             public static void f(){

                       System.out.println("这是子类重写后的方法");

             }

    }

    package com.oracle.demo02;

    public class Test {

             public static void main(String[] args) {

                       Fu f=new Zi();

                       System.out.println(f.i);

                       f.f();

                       //多态特殊点:子类对象交给父类引用,此时静态成员变量和静态成员方法,都是调用父类的,因为此时成员变量和成员方法都属于类不属于对象

             }

    }

    使用public static final修饰的变量来定义静态常量;

    定义格式:

    public static final 数据类型 变量名 = 值;

    接口中的每个成员变量都默认使用public static final修饰;

    所有接口中的成员变量已是静态常量,由于接口没有构造方法,所以必须显示赋值,可以直接用接口名访问;

    //当final修饰的成员变量必须在创建对象之前赋值,要么直接附初值要么用构造方法赋值;

    匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量;

    //没有引用;

    ①   创建匿名对象直接使用,没有引用变量;

    new Person().eat()

    ②   匿名对象在没有指定其引用变量时,只能使用一次;

    new Person().eat()和new Person().eat()不是相同的对象;

    ③   匿名对象可以作为方法接收的参数,方法返回值使用;(作为实参传入某个方法,或者作为返回值使用)

    什么是内部类

    将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类;

    什么时候使用内部类

    在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述;

    ①   成员内部类:在成员位置

    ②   局部内部类:在方法中

    内部类的分类:

    内部类分为成员内部类与局部内部类。

    我们定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符,继承与实现关系等;在内部类中可以直接访问外部类的所有成员;

    成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问

    定义格式

    class 外部类 {

             修饰符 class 内部类 {

                       //其他代码

    }

    }

    访问方式

    外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

    package com.oracle.demo04;

    public class Outer {

             int i=0;

             //成员内部类

             class inner{

                       int i=2;

                       public void show(){

                                int i=1;

                                //1.成员内部类的成员方法,访问内部类中的成员变量,使用this关键字

                                //2.成员内部类的成员方法,访问外部类中的成员变量,使用外部类类名.this.成员变量名

                                Outer.this.show();

                                System.out.println(Outer.this.i);

                       }

             }

             public void show(){

                       System.out.println("这是外部类成员方法");

             }

    }

    package com.oracle.demo04;

    public class Test {

             public static void main(String[] args) {

                       //创建Outer中成员内部类inner的对象,然后调用成员内部类的方法:

                       Outer.inner inn=new Outer().new inner();

                       inn.show();

             }

    }

    局部内部类:

    局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问

    定义格式

    class 外部类 {

             修饰符 返回值类型 方法名(参数) {

    class 内部类 {

    //其他代码

    }

    }

    }

    访问方式

    在外部类方法中,创建内部类对象,进行访问

    package com.oracle.demo05;

    public class Outer {

             public void show(){

                       class Inner{

                                public void show2(){

                                         System.out.println("这是局部内部类的方法");

                                }

                       }

                       //局部内部类只能在创建类的方法内创建对象,然后调用方法,然后早main方法中创建外部类的对象,调用存在局部内部类的外部类的成员方法;

                       Inner in=new Inner();

                       in.show2();

             }

    }

    package com.oracle.demo05;

    public class Test {

             public static void main(String[] args) {

                       Outer out=new Outer();

                       out.show();

             }

    }

  • 相关阅读:
    MylSAM引擎的特点及场景使用
    innodb的特性及常用场景
    标准库functools.wraps的使用方法
    requests基本使用
    linux常用指令
    爬操插件json作指示图文详解
    Django form表单
    python 装饰器
    Django 的路由分配系统
    Django 的ORM
  • 原文地址:https://www.cnblogs.com/postgredingdangniu/p/10081682.html
Copyright © 2020-2023  润新知