Android开发Android开发经验谈Android开发

Java面向对象

2020-01-03  本文已影响0人  官子寒

1. 类和对象

1.1 定义

定义类

修饰符publicprotectedprivate三个最多只能出现1个;它们可以与staticfinal组合起来修饰方法

定义成员变量

修饰符publicfinalabstract三个最多只能出现1个

定义方法

修饰符publicprotectedprivate三个最多只能出现1个;finalabstract最多最多只能出现其一,它们可以与static组合起来修饰方法
返回值:可以是Java语言允许的任何数据类型
方法名:方法名的命名规则与成员变量的命名规则相同
形参列表:用于定义该方法可以接受的参数

定义构造器

修饰符publicprotectedprivate三个最多只能出现1个
构造器名:必须和类名相同
形参列表:用于定义该方法可以接受的参数

1.2 this引用

使用this有两种情形:

静态成员不能直接访问非静态成员,因为static修饰的方法中不能使用this

2. 方法详解

2.1 方法参数传递

2.2 形参个数可变的方法

    public static void test(int a, String...books){
        for(String  book : books){
            System.out.println(book);
        }
    }

2.3 递归方法

public class Recursive {

    public static int febonaci(int n){
        if(n == 1){
            return 1;
        }
        if(n == 2){
            return 2;
        }
        else{
            return febonaci( n -1) + febonaci(n - 2);
        }
    }
    public static void main(String[] args){
        System.out.println(febonaci(8));
    }
}

2.4 方法重载

3. 成员变量和局部变量

3.1 变量分类

变量分类图

3.2 成员变量的初始化过程

3.3局部变量的初始化过程

3.4 变量的使用规则

成员变量适用情形:

4. 隐藏和封装

4.1 封装

4.2 使用访问控制符

private:当前类访问权限
default:包访问权限
protected:子类访问权限
public:公共访问权限

4.3 package、import和import static

5. 构造器详解

5.1 使用构造器执行初始化

5.2 构造器重载

public class Orange {
    private int price;
    private String orangeName;
    
    public Orange(int price){
        this.price = price;
    }
    
    public Orange(int price, String orangeName){
        this(price);
        this.orangeName = orangeName;
    }
}

5.6 类的继承

5.6.1 继承基础

public class Fruit {
    public double weight;
    public void info(){
        System.out.println("My weight is"+this.weight);
    }
}

public class Orange extends Fruit{
    private int price;
    private String orangeName;

    public Orange(int price){
        this.price = price;
    }

    public Orange(int price, String orangeName){
        this(price);
        this.orangeName = orangeName;
    }

    public static void main(String[] args){
        Orange orange = new Orange(1, "Orange1");
        System.out.println(orange.weight); //0.0
        System.out.println(orange.price); //1
        System.out.println(orange.orangeName); //Orange1
        orange.info(); //My weight is0.0
    }
}

5.6.2 重写父类方法

    @Override
    public void info() {
        super.info();
        System.out.println("Now I have extended the original class");
    }

5.6.3 super

如果在某个方法中访问名为a的成员变量,但没有指定调用者,则系统查找a的顺序为:

  1. 查找该类方法中是否有名为a的局部变量
  2. 查找该类中是否有名为a的成员变量
  3. 查找该类的父类是否有包含a的成员变量,直至Object

5.6.4 调用父类构造器

public class Fruit {
    public double weight;
    public Fruit(){
        System.out.println("这是一个无参构造器");
    }
    public Fruit(double weight){
        this.weight = weight;
    }
    public void info(){
        System.out.println("My weight is"+this.weight);
    }
}
public class Orange extends Fruit{
    private int price;
    private String orangeName;

    public Orange(int price){
        this.price = price;
        System.out.println("Orange构造器,带price");
    }

    public Orange(int price, String orangeName){
        this(price);
        this.orangeName = orangeName;
        System.out.println("Orange构造器,带price和name");
    }
    public static void main(String[] args){
        Orange orange = new Orange(1, "Orange1");
    }
}
结果

父类指定了有参构造函数时,子类必须要重写父类的构造函数;父类只有无参构造函数时,子类无需重写

5.7 多态

5.7.1 多态性

Java引用变量有两个类型,一个是编译时类型,一个是运行时类型,如果编译类型和运行类型不一致,就可能出现所谓的多态

向上转型

5.8 继承与组合

5.9 初始化块

5.9.1 初始化块基本用法

5.9.2 静态初始化块

5.9.3 初始化块和构造器

public class Fruit {
    static{
        System.out.println("Fruit的静态初始化块");
    }
    public double weight;
    {
        System.out.println("这是Fruit的初始化块");
    }
    public Fruit(){
        System.out.println("这是一个无参构造器");
    }
    public Fruit(double weight){
        this.weight = weight;
    }
    public void info(){
        System.out.println("My weight is"+this.weight);
    }
}
public class Orange extends Fruit{
    private int price;
    private String orangeName;
    static{
        System.out.println("orange的静态初始化块");
    }
    {
        System.out.println("这是Orange的初始化块");
    }

    public double weight = 3.0;

    public Orange(){
        System.out.println("orange无参");
    }

    public Orange(int price){
        this.price = price;
        System.out.println("Orange构造器,带price");
    }

    public Orange(int price, String orangeName){

        this.orangeName = orangeName;
        System.out.println("Orange构造器,带price和name");
    }

    @Override
    public void info() {
        super.info();
        System.out.println("Now I have extended the original class");
    }

    public static void main(String[] args){
        Orange orange = new Orange(1, "Orange1");
    }
}
初始化块和构造器

6. 处理对象

6.1 打印对象和toString方法

    @Override
    public String toString() {
        return "the price of orange is" + this.price;
    }
toString重写

6.2 ==和equals方法

==:两个变量是否指向同一个堆内存空间
equals:Object提供的方法

基本类型不能使用equals
String s1 = new String("123");
String s2 = new String("123");
String s3 = "123";
String s4 = "123";
System.out.println(s1==s2); // false
System.out.println(s3==s4); // true

new创建出来的变量s1s2保存在堆内存中,所以二者==会输出false。他们在创建的时候都首先保存在常量池再保存在堆内存

7. 类成员

7.1 理解类成员

7.2 单例类

public class singleInstance {
    private static singleInstance singleIns;
    public static singleInstance getInstance(){
        if (singleIns == null){
            singleIns = new singleInstance();
        }
        return singleIns;
    }

    public static void main(String[] args){
        singleInstance s1 = singleInstance.getInstance();
        singleInstance s2 = singleInstance.getInstance();
        System.out.println(s1 == s2);
    }
}

7.3 final修饰符

7.3.1 final成员变量

7.3.2 final局部变量

7.3.3 final修饰基本类型和引用类型

final int[] a = new int[]{1,2,3};
a[0] = 2;
System.out.println(Arrays.toString(a)); //[2,2,3]

7.3.4 final方法

7.3.5 final类

7.3.6 不可变类

7.4 抽象类

7.4.1 抽象方法和抽象类

7.5 接口

    public static void main(String[] args){
        Orange orange = new Orange(1, "Orange1");
        orange.goodForHealth();
    }
public interface healthyable {
    public default void goodForHealth() {
        System.out.println("健康增加");
    }
}

7.5.1 接口的继承

7.5.2 接口的使用

7.5.3 接口和抽象类

7.5.4 面向接口编程

1. 简单工厂模式

工厂模式

2.命令模式

8. 内部类

8.1 非静态内部类

8.2 静态内部类

8.3 使用内部类

下面分3中情况讨论内部类的用法
1. 在外部类内部使用内部类
定义和使用都没有太大的区别
2. 在外部类以外使用非静态内部类

class OutClass {
    class In{
     public In(String msg){
         System.out.println(msg);
     }
    }
}

class Out extends OutClass.In{

    public Out(OutClass outClass){
        outClass.super("hello"); //注意这里的用法,通过outclass调用In的构造函数
    }
    public static void main(String[] args){
        OutClass.In in = new OutClass().new In("has been created");
        Out out = new Out(new OutClass());
    }
}

3. 在外部类以外使用静态内部类

StaticOut.StaticIn in = new StaticOut.StaticIn()

8.4 局部内部类

8.5 匿名内部类

实现Interface

public class man {
    String msg = "123";
    public man(Runnable runnable){
        runnable.RunStart();
        runnable.RunFinish(this.msg);
    }
    
    public static void main(String[] args){
        man m1 = new man(new Runnable() {
            @Override
            public void RunStart() {
                
            }

            @Override
            public void RunFinish(String msg) {

            }
        });
    }
}

实现子类

    public static void main(String[] args){
        Orange orange = new Orange(1, "Orange1"){
            @Override
            public String toString() {
                return super.toString();
            }
        };

    }

9. Lambda表达式

三部分组成:
1)形参列表
2)箭头
3)代码块

public interface Runnable {
    public void RunStart();
}
public class man {
    String msg = "123";
    public man(Runnable runnable){
        runnable.RunStart();
    }

    public static void main(String[] args){
        man m1 = new man(() ->{
            System.out.println("123");
        });
    }
}

9.1 方法引用与构造引用

1. 引用类方法

public class man {
    String msg = "123";
    public man(Runnable runnable){
    }

    public static void main(String[] args){
        Runnable runnable = Integer::valueOf;
        Integer val = runnable.RunStart("123");
        System.out.println(val);
    }
}

2. 引用特定对象的实例方法

public int info(String s) {
     System.out.println(s);
     return s.length();
}
Orange orange = new Orange(1);
Runnable runnable = orange::info;

3. 引用某类对象的实例方法

MyTest mt = String::substring;

4. 引用构造器

YourTest yt = JFrame:: new

9.2 Lambda表岛是与匿名类的联系

-lambda表达式是匿名内部类的一种简化

10. 枚举类

10.1 枚举类入门

public enum SeasonNum {
    SPRING,SUMMER,FALL,WINTER;
}

public class EnumTest {
    public static void judge(SeasonNum s){
        switch (s) {
            case SPRING:
                System.out.println("SPring");
                break;
            case SUMMER:
                System.out.println("SUmmer");
                break;
            default:
                System.out.println("have no idea");
        }
    }

    public static void main(String[] args){
        for(SeasonNum s: SeasonNum.values()){
            judge(s);
        }
    }
}

java.lang.Enum的方法:

10.2 枚举类的成员变量、方法和构造器

public class EnumTest {
    public static void judge(SeasonNum s){
        switch (s) {
            case SPRING:
                System.out.println("SPring");
                break;
            case SUMMER:
                System.out.println("SUmmer");
                break;
            default:
                System.out.println("have no idea");
        }
    }

    public static void main(String[] args){
        SeasonNum s = Enum.valueOf(SeasonNum.class, "SPRING");
        s.seansonName = "春天";
        System.out.println(s + s.seansonName);
    }
}

构造器

public enum SeasonNum {
    SPRING("春天"),SUMMER("夏天"),FALL("qiutian"),WINTER("dongtian");
    private final String name;
    private  SeasonNum(String seansonName){
        this.name = seansonName;
    }
    public String seansonName;

}
上一篇下一篇

猜你喜欢

热点阅读