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");
            }
        };
    }
}

 

posted @ 2018-11-17 13:47  jec1999  阅读(119)  评论(0编辑  收藏  举报