zoukankan      html  css  js  c++  java
  • 4 面向对象

    1 成员变量和局部变量的区别

    A:在类中的位置不同
      成员变量:在类中方法外
      局部变量:在方法定义中或者方法声明上
    B:在内存中的位置不同
      成员变量:在堆内存(成员变量属于对象,对象进堆内存)
      局部变量:在栈内存(局部变量属于方法,方法进栈内存)
    C:生命周期不同
      成员变量:随着对象的创建而存在,随着对象的消失而消失
      局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
    D:初始化值不同
      成员变量:有默认初始化值
      局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

    注意事项:
      局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
      基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
      引用数据类型变量包括哪些:数组,类,接口,枚举

    2 static关键字的特点

    1.随着类的加载而加载

    2.优先于对象存在

    3.被类的所有对象共享--------一个对象改变了其值,其余对象在访问时其值以变化

    4.可以通过类名调用

      其实它本事可以通过对象名调用,推荐使用类名调用,

      静态修饰的内容我们一般称其为:与类相关的,类成员

    共性用静态,特性用成员变量.

    3 代码块

    1.在java中,用{}括起来的代码称为代码块.

    2.根据其位置和声明不同,分为局部代码块,构造代码块,静态代码块,通过代码块(多线程讲解)

      1.局部代码块:在方法中出现,限定变量生命周期,及早释放,提高内存利用率

      2.构造代码块(初始化块):在类中方法外出现,在构造方法执行前执行.

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

     静态代码块>构造代码块>构造方法

    将字节码加载到方法区的时候,静态代码块就会执行.一般用于加载驱动. 

    4 父类没有无参构造时

    1.子类在new 对象的时候,会默认访问父类的空参构造,当父类无空参构造时,需要手动使用super语句访问父类的有参构造.

    2.super语句必须放在构造方法的第一句.

    public class T6 {
        public static void main(String[] args) {
            Cat c = new Cat("green",4);
            System.out.println(c.getColor());
            
        }
    }
    
    class Animal{
    //    public Animal(){
    //        System.out.println("父类构造");
    //    }
        String color;
        int legs;
        
        public Animal(String color,int legs){
            this.color = color;
            this.legs = legs;
        }
        
        public String getColor(){
            return this.color;
        }
        
        
    }
    
    class Cat extends Animal{
    //    public Cat(){
    //        System.out.println("子类构造");
    //    }
        
        public Cat(String color,int legs){
            super(color,legs);
        }
        
    }

     

     5.构造代码块构造方法面试题

    public class T7 {
        public static void main(String[] args) {
            Zi f = new Zi();
            /**
             * 1.main方法进栈,因为要创建对象所以会先加载class文件到方法区,父类先加载然后子类再加载
             * 2.new Zi()时,先访问父类的空参构造,父类构造代码块先执行然后再执行父类构造方法
             * 3.完毕后,再访问子类构造代码块,再访问子类构造
             * 构造代码块可以理解为是在构造方法中被调用,优先于构造语句执行
             *  静态代码块fu
                静态代码块zi
                构造代码块fu
                构造方法fu
                构造代码块zi
                构造方法zi
             */
            
        }
    }
    
    class Fu {
        static {
            System.out.println("静态代码块fu");
        }
        {
            System.out.println("构造代码块fu");
        }
    
        public Fu() {
            System.out.println("构造方法fu");
        }
    
    }
    
    class Zi extends Fu {
        static {
            System.out.println("静态代码块zi");
        }
        {
            System.out.println("构造代码块zi");
        }
    
        public Zi() {
            System.out.println("构造方法zi");
        }
    }

    6 override 和 overload的区别,overload可以改变返回值类型吗?

      overload可以改变返回值类型,只看参数列表

      override:子类出现了和父类中方法声明一模一样的方法(参数列表相同,修饰符也相同),与返回值类型有关,返回值是一样的(或者是子父类的)

      override:方法重载,本类中出现了方法名一样,参数列表的同的方法,与返回值类型无关。

    7 final

      final修饰类,类不能被继承

      final修饰方法,方法不能被重写

      final修饰变量,变量只能被赋值一次

    8 多态时,变量与方法访问

      1.成员变量访问时,编译看左边,运行看左边,因为是Person p = new Student(),p能看见的是对象中所保留的父类的那一部分。
      2.静态方法访问时,编译看左边,运行看左边。静态方法调用时,相当于是类名点调用,所以调用到父类方法。

      3.成员方法访问时,编译看左边,运行看右边,这叫做动态绑定。

    package javademo2;
    
    public class T1 {
        public static void main(String[] args) {
            Fa f = new Zi();
            System.out.println(f.num);//10  多态成员变量访问时:编译看左边,运行看左边
            
            Fa f2 = new Zi();
            f2.print();//zi  多态成员方法访问(动态绑定):编译看左边,运行看右边.左边没有print方法时,编译会通不过
            
            f2.method();//method in fa   静态方法访问,编译看左边,运行看左边
        }
    }
    
    class Fa{
        int num = 10;
        public void print(){
            System.out.println("fa");
        }
        public static void method(){
            System.out.println("method in fa");
        }
        
        
    }
    
    class Zi extends Fa{
        int num = 20;
        
        public void print(){
            System.out.println("zi");
        }
        
        public static void method(){
            System.out.println("method in zi");
        }
    }

     9 abstract不能和哪些关键字共存

      1.static,被static修饰的方法,可以直接用类名点调用,但是类名点调用被abstract修饰的抽象方法,没有任何意义。

      2.private,被private修饰的方法,不能被子类继承,被abstract修饰的方法就是需要子类继承并重写,相冲突。

      3.final,被final修饰的方法不能被重写,被abstract修饰的方法就是需要子类重写,相冲突。

    10 内部类--成员内部类,静态内部类,局部内部类,匿名内部类

    //成员内部类
    public class T4 {
        public static void main(String[] args) {
            Outer.Inner i = new Outer().new Inner();
            i.func();
        }
    }
    
    
    class Outer{
        String name = "jack";
        class Inner{
            public void func() {
                System.out.println(name);
            }
        }
    }
    
    //静态内部类
    public class T3 {
        public static void main(String[] args) {
            Outer.Inner i = new Outer.Inner();
            i.print();  
            Outer.Inner2.func();
        }
    }
    
    class Outer{
        static class Inner{
            public void print(){
                System.out.println("method1111");
            }
        }
        
        static class Inner2{
            static void func(){
                System.out.println("func");
            }
        }
    }
    
    
    //局部内部类访问局部变量
    public class T5 {
        public static void main(String[] args) {
            new Outer().method();
        }
    }
    
    
    class Outer{
        public void method(){
            final int num = 20;
            class Inner{
                public void func(){
                    System.out.println(num);
                }
            }
            
            Inner i = new Inner();
            i.func();
        }
    }
    
    //成员内部类私有
    public class T2 {
        public static void main(String[] args) {
            Outer o = new Outer();
            o.method();
        }
        
    }
    
    
    class Outer{
        private class Inner{
            public void print(){
                System.out.println("print1111");
            }
        }
        
        public void method(){
            Inner i  = new Inner();
            i.print();
        }
    }
    
    //内部类面试题
    public class T4 {
    
        public static void main(String[] args) {
            Outer.Inner i = new Outer().new Inner();
            i.method();
        }
    
    }
    
    class Outer{
        int num = 30;
        class Inner{
            int num = 20;
            public void method(){
                int num = 10;
                System.out.println(num);
                System.out.println(this.num);
                System.out.println(Outer.this.num);
            }
        }
    }
    
    //匿名内部类面试题
    public class T6 {
        public static void main(String[] args) {
            Outer.method().show(); //输出helloword
        }
    }
    
    interface Inter{
        void show();
    }
    
    class Outer{
        public static Inter method(){
            return new Inter(){
                public void show(){
                    System.out.println("helloword");
                }
            };
        }
    }
  • 相关阅读:
    python学习之那些你不在乎却操作非主流的练习题(一)
    python学习之数据类型(int,bool,str)
    Python学习之格式化简述
    Python学习之认知(二)
    Python学习之认知(一)
    Python学习之初识
    scrollTo与scrollTop及其区别
    js点击当前元素传入id从而获取其他元素
    微信支付功能
    cookie,sessionStorage,localStorage区别
  • 原文地址:https://www.cnblogs.com/jec1999/p/9973696.html
Copyright © 2011-2022 走看看